はしがき
自分が働いている会社の project では修正することの merge は以下の手順で行っています。
- 修正のことをプログラマーお互いに MR を実行
- MR 後、merge 向け branch に merge する
- merge 向け branch を master に merge する
リリース向けの branch を感違えないように日付をしています。
しかし、gitlab ウェブから、毎日 merge 向けの branch を作ること、また、作っても merge しないと、削除することもあるので、手間がかかります。
そのために、毎日生成や削除する gitlab の pipeline を作ります。
CICD とは?
Red Hat には以下に紹介されています。
CI/CD (継続的インテグレーションおよび継続的デリバリー/デプロイメントの略) は、ソフトウェア開発ライフサイクルを最適化し、加速することを目的としています。
継続的インテグレーション(continuous integration)はコードの変更を 共有ソースコードリポジトリに 自動的かつ頻繁に取り込む手法
継続的デリバリーまたはデプロイメント (CD) は 2 つの部分からなるプロセスで、コード変更の統合、テスト、デリバリーを指します。
build, テスト、デプロイ... などを自動化することで、アプリケーションのエラーをよく発見したり、開発を高速化します。
pipeline (パイプライン)とは?
パイプライン処理(パイプラインしょり、英: pipeline processing)とは、コンピュータ等において、処理要素を直列に連結し、ある要素の出力が次の要素の入力となるようにして、並行(必ずしも並列とは限らない)に処理させるという利用技術である。
pipeline はある業務の段階、手順、流れを直列に連結、各段階の出力が次の段階に入力します。
gitlab の pipeline を使ってみたら、yaml file の作成によって、段階を分けて実行することもできます。(今回はしません。)
CICD pipeline とは?
継続的インテグレーションおよび継続的デプロイメント (CI/CD) パイプラインは、新しいバージョンのソフトウェアを提供するために実行する必要のある一連のステップです。
上書きした CICD と pipeline の概念を合わせて、ある一連の pipeline 作業をコードのビルド、テスト、デプロイなどを自動的に処理して、開発を推進するプロセスです。
やり方
このやり方は gitlab の加入前提で行います。
- gitlab project を作る
- TOKEN 取得
- TOKEN 適用
- MR の branch を作る
- MR 作成 pipeline
- MR および branch 削除 pipeline
- 結果
- schedule 設定
gitlab project を作る
多分初めに入ったら、からの空間ですが、create a project -> create blank project で作りましょう。
TOKEN 取得
project > settings > access tokens > add new token をクリックします。
access token の expiration date やネームを設定します。
これは、merge request を assignee の nickname になります。
git push pull には owner の権限が必要なので、owner で設定します。
登録した access key をセーブしましょう。
TOKEN 適用
project > setting > CI/CD に移動します。
閉まっている Variables を開けて、Add variable します。
先、取得した token を value に入力してください。
その中、Variables に Add variable
web page でやり方
MR の branch を作る
project に入ったら、branch を作ることができます。
create/close branch を作りました!
MR 作成 pipeline
project > build > Pipeline editor に入ります。
左上から branch を選択して、configure pipeline をクリックします。
では、何とか表示されますが、以下のコードを適当に変更して、入力してください。
image: node:latest
ci:
script:
- git config --global user.email "your@address.com"
- git config --global user.name "Ci Scheduler"
- BRANCH_NAME="merge-$(date +%Y-%m-%d)"
- git remote set-url origin https://gitlab-ci-token:$AUTOMATIC_MR_CREATE_CLOSE_TOKEN@gitlab.com/deliyami/hello_world.git
- git fetch origin main
- git checkout -b $BRANCH_NAME origin/main
- git push -o merge_request.create -o merge_request.target=main -o merge_request.title="$BRANCH_NAME" origin $BRANCH_NAME 2>&1
そうしたら、commit します。
MR 削除 pipeline
MR 生成と同じ configure pipeline に入力します。
image: node:latest
ci:
before_script:
- apt-get -qq update
- apt-get install -y jq
script:
- BRANCH_NAME="merge-$(date +%Y-%m-%d)"
- 'MR_LIST=$(curl --header "PRIVATE-TOKEN: $AUTOMATIC_MR_CREATE_CLOSE_TOKEN" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/merge_requests?state=opened")'
- FIRST_MR_ID=$(echo "$MR_LIST" | jq -r ".[] | select(.title | test(\"$BRANCH_NAME\")) | .iid" | head -n 1)
- MR_MERGED=$(echo "$MR_LIST" | jq -r ".[] | select(.iid == $FIRST_MR_ID) | .merged_at")
- >
if [ "$MR_MERGED" = "null" ]; then
echo "MR $FIRST_MR_ID is not merged. Closing..."
curl --request PUT --header "PRIVATE-TOKEN: $AUTOMATIC_MR_CREATE_CLOSE_TOKEN" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/merge_requests/$FIRST_MR_ID/?state_event=close"
else
echo "MR ID $FIRST_MR_ID is already merged. Skipping close."
fi
local でやり方
git の基本的な設定(gitlab project に接続している account と同じこと)の前提で説明します。
MR 作成 pipeline
$ git checkout -b create-merge-branch
$ vi .gitlab-ci.yml
以下のコードをコピペお願いします。
image: node:latest
ci:
script:
- git config --global user.email "your@address.com"
- git config --global user.name "Ci Scheduler"
- BRANCH_NAME="merge-$(date +%Y-%m-%d)"
- git remote set-url origin https://gitlab-ci-token:$AUTOMATIC_MR_CREATE_CLOSE_TOKEN@gitlab.com/deliyami/hello_world.git
- git fetch origin main
- git checkout -b $BRANCH_NAME origin/main
- git push -o merge_request.create -o merge_request.target=main -o merge_request.title="$BRANCH_NAME" origin $BRANCH_NAME 2>&1
$ git commit -a
$ git push origin create-merge-branch
MR 削除 pipeline
$ git checkout -b close-merge-branch
$ vi .gitlab-ci.yml
以下のコードをコピペお願いします。
image: node:latest
ci:
before_script:
- apt-get -qq update
- apt-get install -y jq
script:
- BRANCH_NAME="merge-$(date +%Y-%m-%d)"
- 'MR_LIST=$(curl --header "PRIVATE-TOKEN: $AUTOMATIC_MR_CREATE_CLOSE_TOKEN" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/merge_requests?state=opened")'
- FIRST_MR_ID=$(echo "$MR_LIST" | jq -r ".[] | select(.title | test(\"$BRANCH_NAME\")) | .iid" | head -n 1)
- MR_MERGED=$(echo "$MR_LIST" | jq -r ".[] | select(.iid == $FIRST_MR_ID) | .merged_at")
- >
if [ "$MR_MERGED" = "null" ]; then
echo "MR $FIRST_MR_ID is not merged. Closing..."
curl --request PUT --header "PRIVATE-TOKEN: $AUTOMATIC_MR_CREATE_CLOSE_TOKEN" "https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/merge_requests/$FIRST_MR_ID/?state_event=close"
else
echo "MR ID $FIRST_MR_ID is already merged. Skipping close."
fi
$ git commit -a
$ git push origin close-merge-branch
結果
create MR
close MR
schedule 設定
project > build > pipeline schedules に遷移して、新しい schedule を作ります。
ここから cron の設定する必要があります。
月曜日から金曜日まで、朝9時に MR を作って、午後6時になったら、MR を削除します。
create | close |
---|---|
このように設定されました。
cron に設定した時間にも実行しました、強制的に実行することもできるので、便利ですね。
まとめ
CICD 作ることは、普通に考えるコードと違うので、実行することは手間がかか利ますが、作成すれば、楽になるます。
参考したページ