それなりに適当にやってます

なんとなくそれっぽいメモとか備忘録とか適当に。 2018年5月にブログ移転しました。 古い記事は未整理です。

GitLabCI からマージリクエストするメモ

質問され軽くググッて対応したので備忘メモ

要望
  • git push > Build > Test > Merge Request (以下MR) までしたい
  • MR は master から production ブランチに対して行いたい
  • とりあえず MR する方法がわかればOK
調査
  • 普通に GitLabCI を調べてもそれっぽい方法が分からなかった。
  • API 利用する事で実施できそうだった
  • となると恐らく誰かがやってるだろう・・・とググったら出てきたのでこちらを参考にさせて頂いた。
結果

上記のググった結果を参考に試したらうまくいった。

  • GitLab ユーザアカウントでアクセストークンを作成
    • User Settings > Access Tokens で作成
  • 作成したアクセストークンをプロジェクト > CIの環境変数 に設定する
    • Project > Settings > CI/CD > Variables で変数 PRIVATE_TOKEN で設定
  • スクリプト
    • 上記のURL に掲載されたいたものを少し修正しただけ。
    • リポジトリに ./utils/autoMergeRequest.sh で作成し、実行権限を付与
#!/usr/bin/env bash
[[ $HOST =~ ^https?://[^/]+ ]] && HOST="${BASH_REMATCH[0]}/api/v4/projects/"

#TARGET_BRANCH=`curl --silent "${HOST}${CI_PROJECT_ID}" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" | python3 -c "import sys, json; print(json.load(sys.stdin)['default_branch'])"`;
TARGET_BRANCH=production

BODY="{
    \"id\": ${CI_PROJECT_ID},
    \"source_branch\": \"${CI_COMMIT_REF_NAME}\",
    \"target_branch\": \"${TARGET_BRANCH}\",
    \"remove_source_branch\": true,
    \"title\": \"WIP: ${CI_COMMIT_REF_NAME}\",
    \"assignee_id\":\"${GITLAB_USER_ID}\"
}";

LISTMR=`curl --silent "${HOST}${CI_PROJECT_ID}/merge_requests?state=opened" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}"`;
COUNTBRANCHES=`echo ${LISTMR} | grep -o "\"source_branch\":\"${CI_COMMIT_REF_NAME}\"" | wc -l`;

if [ ${COUNTBRANCHES} -eq "0" ]; then
    curl -X POST "${HOST}${CI_PROJECT_ID}/merge_requests" \
        --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" \
        --header "Content-Type: application/json" \
        --data "${BODY}";

    echo "Opened a new merge request: WIP: ${CI_COMMIT_REF_NAME} and assigned to you";
    exit;
fi

echo "No new merge request opened";

.gitlab-ci.yml はこんな感じ。 これで git push すると、WIP: ほげほげ な MR が行われたことを確認、PRIVATE_TOKEN 以外の変数については GitLab CI/CD のドキュメントを参照

mr to production:
  stage: deploy
  only:
    - master
  script:
    - HOST=${CI_PROJECT_URL} CI_PROJECT_ID=${CI_PROJECT_ID} CI_COMMIT_REF_NAME=${CI_COMMIT_REF_NAME} GITLAB_USER_ID=${GITLAB_USER_ID} PRIVATE_TOKEN=${PRIVATE_TOKEN} ./utils/autoMergeRequest.sh

あとは WIP : ほげほげ で行われた MR の件名を修正してマージしたりとかまで確認した。 シェルスクリプトで curl を利用してAPI叩いてるので目的に合わせて少し修正するだけでいけるかな。

以上 c⌒っ゚д゚)っφ メモメモ...