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の記事に書いてありました。
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アクセス機能が追加されるのが待ち遠しいですね。