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アクセス機能が追加されるのが待ち遠しいですね。