はじめに
Jenkinsでいろいろやっていると、Jenkinsで作成した成果物をSVNまたはGITにコミットしたい時が時々ある。
チェックアウトはJenkinsの標準機能で利用すればよいが、ファイルをコミットするときはシェルで個別に実装する必要がある。
毎回考えるのも面倒なので、忘備用に残しておく。
最近は、pipeline を利用することが多いため、両方のパターンを用意した。
Jenkins GUIを利用する場合
GUI上のビルドの「シェルの実行」を選択することで、シェルの実装ができる。
ここで記載するシェルの内容は、Jenkinsが立っているOS環境で動くため、
Linux環境なら、普通にshell を利用することが可能。
# svn info
SVN_OPTION="--no-auth-cache --username ${build_user_account} --password ${build_user_password}"
# commit message
# ※ コミット用のチケットを別途作成してもよい
SVN_COMMIT_MSG="変更コミット"
# target
TARGET="${WORKSPACE}/svn"
# add
svn status ${TARGET} ${SVN_OPTION} | grep ^? | awk '{print $2}' | xargs svn add ${SVN_OPTION}
# commit
svn status ${TARGET} ${SVN_OPTION} | awk '{print $2}' | xargs svn commit -m "${SVN_COMMIT_MSG}" ${SVN_OPTION}
<補足>
- 更新、削除などの場合は、コミット処理のみでよいが、新規ファイルの場合は追加の処理が必要
- svn status で更新情報の一覧を取得し、各ファイルに対して、Add、Commit 処理を行う。
- 追加対象の場合、svn status の第一引数が [?:バージョン管理外]になるため、これをキーでgrepし、2個目の項目にパスがあるため、awk コマンドでファイルパスを取得した後、xargs でファイルパスを引数に渡してコミットを行っている。
Jenkins のPipeline を利用する場合
Jenkinsのpipeline で記載する場合、groovy 言語の中に、シェルを記載する。
微妙な変更箇所にはまったため、記載する。
sh"""#!/bin/bash
# svn info
SVN_OPTION="--no-auth-cache --username ${build_user_account} --password ${build_user_password}"
# commit message
# ※ コミット用のチケットを別途作成してもよい
SVN_COMMIT_MSG="変更コミット"
# target
TARGET="${WORKSPACE}/svn"
# add
svn status ${TARGET} ${SVN_OPTION} | grep ^? | awk '{print \$2}' | xargs svn add ${SVN_OPTION}
# commit
svn status ${TARGET} ${SVN_OPTION} | awk '{print \$2}' | xargs svn commit -m "${SVN_COMMIT_MSG}" ${SVN_OPTION}
"""
<補足>
- Jenkinsのpipleline で、シェルを書く場合、[#!/bin/bash]を明示的に指定する必要はないが、awk コマンドを利用しているため、エスケープ対応のために明示的に指定。
- $2について、$はShell外のパラメータを渡すことができるため、シェル内のみしか利用しない場合は、特別にエスケープが必要。
おわりに
今後は、バージョンが変わらない限りコピーするだけ。
Jenkinsの標準で関数を用意してくれるとコード量が減って助かるのだが。。