GitLab CI_PIPELINE_IID のリセットは可能?現実的な対応方法
GitLab CI_PIPELINE_IID のリセットは可能?現実的な対応方法. Practical notes and implementation steps.
公式には推奨されておらず、
ci_pipeline_iid をリセットする方法も提供されていません。
この値を本当にリセットしたい場合は、
プロジェクトを削除して再作成する必要があります。
そのときに初めて pipeline IID がリセットされます。
ただし、この破壊的な方法を採用するケースは多くありません。
そのため、ユニークな ID が必要なら
自分でルールを作る必要があります。
gitlab-ci.yml の仕組みを使えば、
同等の効果を実現できます。
以下はサンプルコードです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
stages:
- prepare
- build
variables:
COUNTER_FILE: counter.txt
# 準備ステージ:カウンターを読み込む or 初期化
prepare_counter:
stage: prepare
script:
- |
if [ -f $COUNTER_FILE ]; then
echo "Found counter file."
COUNTER=$(cat $COUNTER_FILE)
COUNTER=$((COUNTER + 1))
else
echo "No counter file found, start from 1."
COUNTER=1
fi
echo $COUNTER > $COUNTER_FILE
echo "PIPELINE_COUNTER=$COUNTER" >> variables.env
artifacts:
reports:
dotenv: variables.env
cache:
key: project-counter
paths:
- $COUNTER_FILE
# build job では PIPELINE_COUNTER を直接利用可能
build_job:
stage: build
dependencies:
- prepare_counter
script:
- echo "This is build number: $PIPELINE_COUNTER"
GitLab CI では、
cache は異なる pipeline/job 間でファイルを共有するために使われます。
cache key を削除・変更しない限り、counter.txt は保持され、後続 pipeline でも使われます。
この例では:
1
2
3
4
cache:
key: project-counter
paths:
- $COUNTER_FILE
すべての pipeline が同じ cache key(project-counter)を使います。
そのため同一プロジェクト内の pipeline は同じ counter.txt を共有します。
pipeline 実行後、
GitLab Runner は更新済みの counter.txt を cache に保存します。
次の pipeline はそれを再利用します。
注意事項:
- cache は永続を保証しません。
- runner / ストレージの状況に応じて、GitLab が古い cache を削除することがあります(特に self-hosted runner のディスククリーン時)。
- cache が消えた場合、次の pipeline は「counter.txt が見つからない -> 1 から開始」となります。
- pipeline 同時実行時は race condition が起きる可能性があります。
- 2 つの pipeline が同時に走ると、同じ古い cache を読み、同じ連番を計算してしまうことがあります。
- 要件が「必ず一意で重複なし」であれば、外部ストレージ(DB、Git tag、Artifacts API など)を検討してください。
参考資料:
この投稿は投稿者によって CC BY 4.0 の下でライセンスされています。