[CI] モジュールリリース方法の設計と実装

285
NO IMAGE

要件

  • npmモジュールをビルドして、Azureへプッシュする
  • ビルドツールとして、jenkinsを用いる

設計

  1. Azureは、同バージョンのパッケージをリリースできないので、package.jsonのバージョンの差分を確認して、差分がないときは、リリースしないようにする。
  2. 開発と運用を切り離すことを目的として、パッケージが増えてもコードの修正をしなくて済むように、特定のディレクトリ下のパッケージをリリースするようにする。
  3. ディレクトリ構成は、以下を想定。jenkinsfileの実行はrootから行われる。
/root
  - /module1
    - package.json
  - /module2
    - package.json
  ・
 ・
 ・

実装

実際の実装は、次のようにしました。

stages {

  stage('module build') {
    agent {
            ...
    }
    steps {
      sh 'yarn clean && yarn install && yarn build'
    }
  }

  stage('truncus-frontend release') {
    agent {
            ...
    }
    steps {
      sh ```
        echo "release check"
        diff_results=(git diff --name-only HEAD^ HEAD) // gitの現在と直前のコミットを比較し、結果を取得
        current_dir=pwd

        for (( i = 0; i < ${#diff_results[@]}; ++i )); do // 変更点ごとにfor文を回す。 <= 設計2への対応

          if [[ ${diff_results[$i]} =~ ^.*/package.json$ ]]; then // package.jsonに変更があったかを判定

            package_json_diff=git log -1 -p ${diff_results[$i]}
            new_version=echo "$package_json_diff" | grep '+\s*"version":\s*' | grep -o '[0-9].[0-9].[0-9]*' // package.jsonのversionの差分を取得

            if [ -n "$new_version" ]; then // versionの変更があったかを判定 <= 設計1への対応
              module_dir=cut -d'/' -f 1 <<<${diff_results[$i]}
              cd "$current_dir/$module_dir"
              yarn deploy
            fi
          fi
        done
      ```
    }
  }
}

振り返り

  1. モジュールのテストを追加するようになった際は、テストをビルドの後に追加する。テストが通った時のみ、リリースを許可するのか。テストが通らずともリリースをしてしまうのかは、状況をみて判断する。
  2. バージョン変更が行われた場合、勝手にリリースされるつくりになっている。これは、開発側がバージョン変更を行った = リリースを要求したと判断して、この実装にしているが、バージョンを上げたとしても、リリース時を決めたいというときは、つくりを変える必要がある。
  3. jenkinsファイルは環境に依存しないつくりにするようにする。
  4. モジュールの修復は速やかに行えるようにできるようにする。ログの取得と通知。
  5. モジュールが増えてきた際、重量ビルドとフィードバックのバランスをとる必要がある。今回のつくりは、ビルドからリリースまでは一貫しているが、分離できるようにしていった方がいい。
  6. 頻繁にモジュールの変更が今のところないので、ビルドタイミングは手動にした。