2024年9月13日金曜日

Gitlab CI でセマンティクスバージョンを比較する

Gitlab CI でセマンティクスバージョンを比較する

概要

過去に前のバージョンを保存する方法を紹介しました
今回は取得したバージョン同士を比較するジョブを追加します

環境

  • 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 件のコメント:

コメントを投稿