プロジェクトでは、develop
branchで開発を行い、本番リリースあるいは公開するときにmaster
branchへ反映するというフローをとっています。
このとき、develop
branch上で不要なファイルを削除したり、ドキュメント中の特定の単語を置換した上でmaster
に反映します。しかしご想像の通り、これらの作業を手動で行っていたため、色々とミスをしがちでした。このため、これらを自動化するようにしました。
自動化スクリプト
最初に自動化部分の核を示すと、以下の実装になります。非常に単純な内容ですね。
function create_merge_request { local version=${1:?"version is missing"} local branch="bump/${version}" # トップレベルのディレクトリへ移動 pushd $(git rev-parse --show-toplevel) git checkout -b ${branch} # MR 用の branch を作成 # このへんで不要なファイルを削除したりする # ... # ... git commit -m "bump version to ${version}" git push origin ${branch} # MR の作成 lab mr create origin master \ --label release \ --remove-source-branch \ --message "bump version to ${version}" \ --message "# History" \ --message "<ul>$(git log --oneline master..${branch} | perl -ple 's/^/<li>/' | tr -d '\n')</ul>" popd } create_merge_request ${VERSION}
lab
コマンド
こういった自動化を行うためには、CLIクライアントが鍵になります。
GitHubにはghやhubコマンドがありますが、GitLabにもいくつかのツールが存在しており、公式でも紹介されています。
今回利用したのはlabコマンドです。
lab
コマンドでは、以下のようにissueやMRの操作などが実現できます。
$ lab help | tail -11 These GitLab commands are provided by lab: ci Work with GitLab CI pipelines and jobs completion Generates the shell autocompletion fork Fork a remote repository on GitLab and add as remote issue Describe, list, and create issues label List and search labels mr Describe, list, and create merge requests project Perform project level operations on GitLab snippet Create a personal or project snippet
XDG Base Directoryの~/.config/lab/lab.toml
や環境変数でアクセスキー等を設定すれば動作します。ぼくは最低限ということで以下を設定しています。
env | grep '^LAB' LAB_CORE_TOKEN=xxxxxxxxxxxxxxxxxxx LAB_CORE_HOST=https://gitlab.com
困ったところ
MRの作成はlab help mr create
で行うことができ、複数の--message
オプションでタイトルと本文を指定できる仕様になっています。
実装を確認すると、最初の--message
で指定した内容がMRのタイトルに、以後の--message
で指定した内容が本文になります。
困った点が何かというと、1つの--message
にて指定する文字列に改行を含む場合、改行の前の文字列しか認識してくれないということです。
develop
とmaster
の差分をMRの本文に出したかったので、今はこんな微妙なことをしています。
--message "<ul>$(git log --oneline master..${branch} | perl -ple 's/^/<li>/' | tr -d '\n')</ul>"