0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

gitlab schedule で自動 MR open や close

Last updated at Posted at 2024-05-07

はしがき

自分が働いている会社の project では修正することの merge は以下の手順で行っています。

  1. 修正のことをプログラマーお互いに MR を実行
  2. MR 後、merge 向け branch に merge する
  3. 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 の加入前提で行います。

  1. gitlab project を作る
  2. TOKEN 取得
  3. TOKEN 適用
  4. MR の branch を作る
  5. MR 作成 pipeline
  6. MR および branch 削除 pipeline
  7. 結果
  8. schedule 設定

gitlab project を作る

多分初めに入ったら、からの空間ですが、create a project -> create blank project で作りましょう。

スクリーンショット 2024-05-07 17.20.57.png

スクリーンショット 2024-05-07 17.21.03.png

TOKEN 取得

project > settings > access tokens > add new token をクリックします。

スクリーンショット 2024-05-07 18.02.12.png

access token の expiration date やネームを設定します。

これは、merge request を assignee の nickname になります。

スクリーンショット 2024-05-07 18.43.24.png

git push pull には owner の権限が必要なので、owner で設定します。

スクリーンショット 2024-05-07 18.23.05.png

登録した access key をセーブしましょう。

スクリーンショット 2024-05-07 18.02.30.png

TOKEN 適用

project > setting > CI/CD に移動します。

スクリーンショット 2024-05-07 17.38.39.png

閉まっている Variables を開けて、Add variable します。

スクリーンショット 2024-05-07 17.39.02.png

先、取得した token を value に入力してください。

スクリーンショット 2024-05-07 17.39.32.png

その中、Variables に Add variable

web page でやり方

MR の branch を作る

project に入ったら、branch を作ることができます。

スクリーンショット 2024-05-07 17.21.29.png
スクリーンショット 2024-05-07 17.22.03.png

create/close branch を作りました!

MR 作成 pipeline

project > build > Pipeline editor に入ります。

スクリーンショット 2024-05-07 17.45.09.png

左上から branch を選択して、configure pipeline をクリックします。

スクリーンショット 2024-05-07 17.45.28.png

では、何とか表示されますが、以下のコードを適当に変更して、入力してください。

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 します。

スクリーンショット 2024-05-07 17.50.35.png

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

スクリーンショット 2024-05-07 19.27.46.png

close MR

スクリーンショット 2024-05-07 19.29.51.png

schedule 設定

project > build > pipeline schedules に遷移して、新しい schedule を作ります。

スクリーンショット 2024-05-07 19.26.15.png

ここから cron の設定する必要があります。

月曜日から金曜日まで、朝9時に MR を作って、午後6時になったら、MR を削除します。

create close
スクリーンショット 2024-05-07 19.36.23.png スクリーンショット 2024-05-07 19.36.30.png

スクリーンショット 2024-05-07 19.37.15.png

このように設定されました。
cron に設定した時間にも実行しました、強制的に実行することもできるので、便利ですね。

まとめ

CICD 作ることは、普通に考えるコードと違うので、実行することは手間がかか利ますが、作成すれば、楽になるます。

参考したページ

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?