概要
過去に前のバージョンを保存する方法を紹介しました
今回は取得したバージョン同士を比較するジョブを追加します
環境
-
Gitlab.com 17.4.0-pre* Runner (docker-mahcine executor ruby:3.1)
.gitlab-ci.yml
compare ジョブを追加しています
sort した結果現在のバージョンと違うバージョンが返ってきたらバージョンアップと判断しています
stages:
- save_versions
- fetch_versions
- check_versions
- compare_versions
save:
stage: save_versions
script:
- |
# バージョンファイルがすでにある場合は前回のバージョンファイルに移動する
mkdir -p $CI_PROJECT_DIR/build/cache
mkdir -p $CI_PROJECT_DIR/build/artifacts
# ファイルが何もないと各種ディレクトリが破棄されるのでファイル作成
touch $CI_PROJECT_DIR/build/cache/keep.txt
touch $CI_PROJECT_DIR/build/artifacts/keep.txt
if [ -f $CI_PROJECT_DIR/build/cache/prometheus.txt ]; then
mv $CI_PROJECT_DIR/build/cache/prometheus.txt $CI_PROJECT_DIR/build/artifacts/pre_prometheus.txt
echo "Prometheus pre version:"
cat $CI_PROJECT_DIR/build/artifacts/pre_prometheus.txt
fi
if [ -f $CI_PROJECT_DIR/build/cache/alertmanager.txt ]; then
mv $CI_PROJECT_DIR/build/cache/alertmanager.txt $CI_PROJECT_DIR/build/artifacts/pre_alertmanager.txt
echo "Alertmanager pre version:"
cat $CI_PROJECT_DIR/build/artifacts/pre_alertmanager.txt
fi
if [ -f $CI_PROJECT_DIR/build/cache/node_exporter.txt ]; then
mv $CI_PROJECT_DIR/build/cache/node_exporter.txt $CI_PROJECT_DIR/build/artifacts/pre_node_exporter.txt
echo "Node Exporter pre version:"
cat $CI_PROJECT_DIR/build/artifacts/pre_node_exporter.txt
fi
# 前回のパイプラインを参照するために cache を使う
cache:
paths:
- $CI_PROJECT_DIR/build/cache/*.txt
# ジョブ間で結果を共有するために artifacts を使う
artifacts:
paths:
- $CI_PROJECT_DIR/build/artifacts/*.txt
# 任意のタグに基づいてバージョン情報を取得するジョブ
fetch:
stage: fetch_versions
script:
- echo "Checking versions for the specified tag -> $TARGET_TAG"
# GitLabソースコードをクローン
- git clone https://gitlab.com/gitlab-org/omnibus-gitlab.git
- cd omnibus-gitlab
# ユーザーが指定したタグにチェックアウト
- git checkout $TARGET_TAG
# prometheusのバージョンを取得
- grep 'Gitlab::Version.new' config/software/prometheus.rb | sed -n "s/.*'\(.*\)'.*/\1/p" > $CI_PROJECT_DIR/build/artifacts/prometheus.txt
# Alertmanagerのバージョンを取得
- grep 'Gitlab::Version.new' config/software/alertmanager.rb | sed -n "s/.*'\(.*\)'.*/\1/p" > $CI_PROJECT_DIR/build/artifacts/alertmanager.txt
# Node Exporterのバージョンを取得
- grep 'Gitlab::Version.new' config/software/node-exporter.rb | sed -n "s/.*'\(.*\)'.*/\1/p" > $CI_PROJECT_DIR/build/artifacts/node_exporter.txt
# 前回のジョブの結果を使用するために artifacts を使う
artifacts:
paths:
- $CI_PROJECT_DIR/build/artifacts/*.txt
# ジョブの実行にはTARGET_TAG変数が必須
rules:
- if: '$TARGET_TAG != null'
check:
stage: check_versions
script:
- echo "Prometheus version:"
- cat $CI_PROJECT_DIR/build/artifacts/prometheus.txt
- echo "Alertmanager version:"
- cat $CI_PROJECT_DIR/build/artifacts/alertmanager.txt
- echo "Node Exporter version:"
- cat $CI_PROJECT_DIR/build/artifacts/node_exporter.txt
# 結果をキャッシュに保存する
- cp $CI_PROJECT_DIR/build/artifacts/prometheus.txt $CI_PROJECT_DIR/build/cache/prometheus.txt
- cp $CI_PROJECT_DIR/build/artifacts/alertmanager.txt $CI_PROJECT_DIR/build/cache/alertmanager.txt
- cp $CI_PROJECT_DIR/build/artifacts/node_exporter.txt $CI_PROJECT_DIR/build/cache/node_exporter.txt
- ls $CI_PROJECT_DIR/build/cache
- ls $CI_PROJECT_DIR/build/artifacts
# 次回のパイプラインに結果を残すために cache を使う
cache:
paths:
- $CI_PROJECT_DIR/build/cache/*.txt
# 前回のジョブの結果を使用するために artifacts を使う
artifacts:
paths:
- $CI_PROJECT_DIR/build/artifacts/*.txt
compare:
stage: compare_versions
script:
- |
# 前の Prometheus のバージョン情報を取得
if [ -f $CI_PROJECT_DIR/build/artifacts/pre_prometheus.txt ]; then
PREV_VERSION=$(cat $CI_PROJECT_DIR/build/artifacts/pre_prometheus.txt)
# PREV_VERSION="0.0.0" # for test
else
exit 1
fi
# 現在の Prometheus のバージョン情報を取得
if [ -f $CI_PROJECT_DIR/build/artifacts/prometheus.txt ]; then
CURRENT_VERSION=$(cat $CI_PROJECT_DIR/build/artifacts/prometheus.txt)
else
exit 1;
fi
# バージョン比較のための関数
version_gt() {
[ "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" != "$1" ]
}
# バージョンを比較
if version_gt "$CURRENT_VERSION" "$PREV_VERSION"; then
echo "Version has increased from $PREV_VERSION to $CURRENT_VERSION"
else
echo "Version is unchanged."
exit 0
fi
# 前回のジョブの結果を使用するために artifacts を使う
artifacts:
paths:
- $CI_PROJECT_DIR/build/artifacts/*.txt
最後に
今回はシェルスクリプトで実現していますが正しく比較したいのであれば Python などを使う方法を検討してください
0 件のコメント:
コメントを投稿