GeekFactory

int128.hatenablog.com

Jenkins PipelineでGitリポジトリにpushする

JenkinsのジョブでGitリポジトリにブランチやタグをpushしたい場合があります。Jenkinsfileでどのように実装するか調べてみました。

実装例

お急ぎの方は下記のコードを参考にしてください。

def userRemoteConfig = scm.userRemoteConfigs.head()
withCredentials([[$class: 'UsernamePasswordMultiBinding', 
  credentialsId: userRemoteConfig.credentialsId,
  usernameVariable: 'GIT_USER', passwordVariable: 'GIT_PASSWORD']]) {
  def url = userRemoteConfig.url.replace('://', "://${env.GIT_USER}:${env.GIT_PASSWORD}@")
  sh "git push $url --tags"
}

PipelineでSCMにGitが指定されている必要があります。また、上記は git push しか書いていませんが、実際にはユーザ名やメールアドレスを設定したり、 git add したりするコードも必要です。

どのように実現しているのか

Jenkins PipelineのJenkinsfileでは以下のコードをよく使います。

node {
  stage('Fetch') {
    checkout scm
  }
}

では、ここに出てくる scm 変数とは何者なんでしょうか。調べてみたらCloudbeeの記事に書いてありました。

support.cloudbees.com

SCMにGitを指定した場合、 scm 変数は GitSCM クラスインスタンスになります。GitSCM クラスには以下のメソッドが用意されています。

    public List<UserRemoteConfig> getUserRemoteConfigs() {...}

ここでいう UserRemoteConfig クラス こそがGitの接続情報になります。UserRemoteConfig クラスには以下のプロパティが定義されています。

  • name
  • refspec
  • url
  • credentialsId

ということは、GitSCM クラス→UserRemoteConfig クラス→credentialsIdプロパティ→withCredentialsの流れでGitの接続情報を取得できます。

ただし、Jenkins Pipelineの標準では scm 変数のプロパティに対するアクセスは禁止されています。このため、Jenkinsの設定から scm 変数のプロパティに対するアクセスを許可する必要があります。これは「Jenkinsの設定」で指定できます。

いつの日になるか分かりませんが、PipelineにGitアクセス機能が追加されるのが待ち遠しいですね。