理系学生日記

おまえはいつまで学生気分なのか

GitLabでdevelop -> masterへの反映Merge Requestをスクリプトで作成する

プロジェクトでは、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にはghhubコマンドがありますが、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にて指定する文字列に改行を含む場合、改行の前の文字列しか認識してくれないということです。

developmasterの差分をMRの本文に出したかったので、今はこんな微妙なことをしています。

--message "<ul>$(git log --oneline master..${branch} | perl -ple 's/^/<li>/' | tr -d '\n')</ul>"