Open38

CI/CD・Pipeline系メモ

ktkt

bitnucket pipeline 各定義のメモ

image

コンテナイメージを指定。Docker Hubの公開イメージやプライベートイメージが利用できる

parallel

複数のstepを同時に実行する
parallelがなければstepは順次実行される

caches

キャッシュのことで、次回Pipelinesを動かした際にnpm installなどの処理を短縮できる

name

stepに名前をつけられる

artifacts

stepの成果物を後のstepで使用する為に使う

資料:
https://www.lyzon.co.jp/blog/2021/20210105_bitbucketpipelines/

https://qiita.com/mochio/items/33584357e924f55f9023

ktkt

gitlab runnersについて

GitLab CI/CDのjob 実行主体

pipeline内でjobが実行される時、

  • GitLab.com上のRunner
  • GitLab Runnerをインストールしたマシン上のいずれかで実行される

種類

Shared Runner

GitLab.comのリソースを共有する形でjobを実行するRunner

GitLabがデフォルトで提供する機能・リソースを利用する為、

利用ケース

  • CI/CDを気軽に試したい
  • SpecificRunnerを用意するマシンリソースがない
  • jobにリソースを大きく消費する処理がなく、簡単なCI/CDだけを想定している
  • 一度に大量のpipeline/jobを実行したい場合

Specific Runner

GitLabRunnerを導入した環境で、tokenを用いてregisterすることでGitLabと連携してCI/CDが実行される
Project単位でjob実行環境を専有可能なRunner

  • 自前のマシンリソースを利用してjobを処理したい
  • 物理CPUを複数使い並列処理を行いたい
  • Shared RunnerはGitLab.com上にあるため、ネットワークのボトルネックを避けたい
  • jobがどの環境で実行されているのかコントロールしたい
  • 限られた数のpipeline/jobをシーケンシャルに実行したい

Group Runner

Specific Runnerはproject単位だが、Group内のsubgroup, project共有可能なRunner

引用資料:
https://www.insight-tec.com/tech-blog/20201222_gitlab_runner/

ktkt

gitlab-ciのincludeについて

  • 同じリポジトリの別ファイル
  • 別リポジトリのファイル
  • GitLabに同梱されている各種テンプレート
  • HTTP/HTTPSでアクセスできるロケーション

からのファイルインクルードに対応

include:
  - <<: *inc_prj
    file: '〜/〜.yml'

引用資料:
https://qiita.com/yo_C_ta/items/ed20120bfafe2d36b491

ktkt

Grableとは

Gradle=グレイドル

ビルドシステムの事

Groovyという言語によってビルドの手順を定義する。
(GroovyはJavaと互換性のある言語)

2004年ごろに業界にMaven(メイブン)

Groovy(グルービー)というスクリプト言語で改良

Java系、特にAndroid系の開発でGradleが使われている

引用記事:
https://tech-lab.sios.jp/archives/9500
https://www.shoeisha.co.jp/article/detail/228

ktkt

gitlab-ci.yml job keywords

before_script

ジョブの前に実行される一連のコマンドをオーバーライドする

cache

後続の実行時にキャッシュする必要があるファイルのリスト

artifacts

成功時にジョブに添付するファイルとディレクトリのリスト

artifacts:paths ※公式より

パスにはプロジェクトディレクトリ($CI_PROJECT_DIR) からの相対パスを使用し、
直接外部にリンクできません。 globパターンと filepath.Matchをワイルドカードとして使用できます。

https://gitlab-docs.creationline.com/ee/ci/yaml/README.html#artifactspaths

  • expire_in:jobが期限切れになり削除される時間を指定する

when

ジョブを走らせるタイミング

  • always:ジョブのステータスに関係なく実行する
  • never:ジョブを実行させない

tags

ランナーの選択に使用されるタグのリストから、特定のランナーを選択する
ジョブを実行するには、ジョブにリストされているすべてのタグをランナーに割り当てる必要がある

variable

ジョブレベルでジョブ変数を定義する

  • GIT_DEPTH:

gitの深さを数値化

GIT_SUBMODULE_STRATEGY

同じGitLabプロジェクト内への参照(submodule)のあるリポジトリを扱う時に使用
デフォルトではsubmoduleを引っ張らない

  • none: (デフォルト): submoduleは引っ張ってこない
  • normal:トップレベルのsubmoduleのみ引っ張ってくる (submodule内は解決しない)
  • recursive:submoduleのsubmodule といった入れ子も解決する

rules

パイプラインにジョブを追加するかどうかを決定するjob policyを設定する方法
一致するまで、個々のルール句のリストを順番に評価する

■条件がマージリクエストの場合、

if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

■変更がデフォルトブランチ(通常はmaster)にプッシュされた場合

'$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'

特に詳しく感じる記事:
https://qiita.com/ynott/items/1ff698868ef85e50f5a1

解説記事:
https://qiita.com/knjname/items/c69711dbe8ee17505298

公式(日本語):
https://gitlab-docs.creationline.com/ee/ci/yaml/README.html

公式:
https://docs.gitlab.com/ee/ci/yaml/index.html

classmethod
https://dev.classmethod.jp/articles/gitlab-runner-ci-cd-1/

ktkt

GitLabCI/CD Jobs

各ジョブは往路ジェクトに関連付いていて、
特定のブランチ更新やマージをトリガーとしてビルドジョブやテストジョブを呼び出す事ができる

  • マルチプラットフォーム
  • MRとの連携
  • 並列分散実行
  • ロギング機能
  • オートスケール
  • アーティファクトの管理

GitLabのリポジトリ機能、チケット管理機能、Dockerレジストリ機能とも簡単に連携できることがメリット

ktkt

GitLab Runner

CI/CD上から指示されたスクリプトを実行したり、
一時的にDockerコンテナを生成してジョブを実行したりするプロセス。

GitLab CI/CD

各Runnerにビルド実行を要求
結果を監視する

Runner

別プロセスでビルドやテストジョブを実行

ktkt

Executorの種類

Executor:遂行者

ジョブ実行方式の事で、RunnerをGitLab CI/CDに登録する時点でExecutorを選択する必要がある

  • Shell Executor
  • Docker Executor
  • Virtual Box Executor
  • SSH Executor
  • Kubernetes Executor
ktkt

Artifacts パラメータ

ジョブの実行結果をアーティファクトとして保存する際の定義を行う

path

成果物として保存したいアーティファクトが生成される場所を指定する

アーティファクトごとに一意の名前をつけておくと、
保存されてGitLab UIからダウンロードできる

ktkt

dependenciesパラメータ

artifactsパラメータと同時に使う

  • 特定のアーティファクトを次のステージのジョブに関連づける
  • アーティファクトの受け渡しを制御することができる
  • ステージで作成されたアーティファイトの共有を行わない場合はパラメータを空にすることで受け渡し処理をスキップできる
ktkt

GitLab CI/CDで不具合

pipelineに新規Stageを導入をしたプロジェクトで、以下の不具合が発生。

949WARNING: Uploading artifacts as "archive" to coordinator... failed  id= responseStatus=524 Origin Time-out status=524 token=
1950WARNING: Retrying...                                context=artifacts-uploader error=invalid argument
1951WARNING: Uploading artifacts as "archive" to coordinator... failed  id= responseStatus=524 Origin Time-out status=524 token=
1952WARNING: Retrying...                                context=artifacts-uploader error=invalid argument
1953Uploading artifacts as "archive" to coordinator... ok  id responseStatus=201 Created token=

言及:
https://gitlab.com/gitlab-org/gitlab/-/issues/34545

ktkt

Circle CIのOrbについて

ジョブ、コマンド、Executor などのパラメーター化
再利用が可能な設定要素をまとめた共有可能なオープンソースパッケージ

パッケージ化されたビルドコマンド/パイプライン

メリット

Orb では設定ファイルの要素をパラメーター化できる

設定の大幅な簡素化が可能

公式:
https://circleci.com/docs/ja/2.0/orb-intro/
参考記事:
https://buildersbox.corp-sansan.com/entry/2021/01/07/110000

ktkt

Circle CIのパフォーマンスプランについて

クレジットベースの従量課金制プラン

  • アクティブユーザー数 + 追加クレジット分の課金
  • 同時実行ジョブ数 80
  • IP アドレスの範囲機能
  • セルフホストランサー

同時実行ジョブ

キューに貯めずに同時に実行できるジョブの数
コンピューティングの料金は、アクセスしたコンテナやマシンの数ではなく、
コンピューティング リソースを使用した合計時間に応じて発生

同時実行ジョブを最大化しジョブの並行処理を利用して、
キューによる待ち時間を最小化できるよう、チームにとって最適なプランを選択できる

例:

あるワークフローに実行時間 5 分のジョブが 10 個含まれている
同時に 1 つのジョブしか処理できない場合、
ジョブは順番に実行されていき、ワークフロー全体が完了するまでに 50 分

同時実行のスケーリングを利用した場合、
10 個のジョブがすべて同時に実行され、ワークフロー全体を 5 分で完了

どちらのケースでもマシン 10 台を 5 分ずつ使用しているため、合計使用時間は 50 分

利用レビュー記事:
https://crumbjp.hateblo.jp/entry/2021/06/11/1時間超えのCIを10分以下にした話

IP アドレスの範囲機能
https://circleci.com/docs/ja/2.0/ip-ranges/

ランナーについて
https://www.cresco.co.jp/blog/entry/19097/

Orb
https://circleci.com/docs/ja/2.0/orb-intro/

よくある質問
https://circleci.com/docs/ja/2.0/faq/

ktkt

Circle CIのワークフロー解説

ざっくりとキャッチアップした所のメモ

基本的な流れ

workflows: キーを使用し、
ジョブ名のリストから成る jobs: キーをネストすることによって定義

workflows:
  version: 2
  build_and_test:
    jobs:
      - build
      - test
  • 早く終わるジョブをワークフローの先頭に移動させる

依存関係は requires: キーを設定することで定義

workflows:
  version: 2
  build-test-and-deploy:
    jobs:
      - build
      - test1:
          requires:
            - build
      - test2:
          requires:
            - test1
      - deploy:
          requires:
            - test2

手動承認フロー

type: approvalキーを指定したjobsを追加

filters.branches.only 指定ブランチのみが実行される

type: approval
          requires:
            - test1
          filters:
            branches:
              only:
                - main_branch

↑マスター、メインブランチには承認フローを導入したい場合の設定例

公式:
https://circleci.com/docs2/ja/2.0/workflows

ktkt

::set-outputについての解説 → core.setOutput推奨

注:非推奨になっている

core.setOutputが良さそう

出力パラメータに値を代入する
echo "::set-output name=NAME::VALUE"でNAMEにVALUEを代入する

ユースケース:

後のステップに値を渡したい時など

Aステップでコマンド実行

BステップでAステップで実行したコマンドの標準出力をslackに通知する等

引用記事:
https://qiita.com/chanhama/items/415a0a26bbb186efc47a

↑をエスケープせずに@actions/core の core.setOutput()で対応
https://gotohayato.com/content/558/

公式:

core.setOutput:
https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#example-creating-an-annotation-for-an-error

複数行の標準出力を改行コードでエスケープして代入可能にする
https://github.com/orgs/community/discussions/26288

ktkt

Github Actions マトリクスビルドについて

ワークフローを特定のパラメータの組み合わせで繰り返し実行したい時に利用する機能

ユースケース:

ライブラリのテストを複数のOS 、プログラミング言語バージョンの組み合わせで行う

見本

strategy:
 matrix:
  os: [ubuntu-latest, windows-latest, macos-latest]
  node: [10, 12]

引用資料:Github-Actions実践入門

ktkt

Github Actions cronで定期実行

以下のように設定する

on:
 schedule
  - cron: '0 3 * * *'

引用資料:Github-Actions実践入門

ktkt

Github Actions 関数 hashFilesについて

hashFiles('ファイルのパス')

ファイルのパスに一致する全てのファイルのハッシュを計算

ワークスペースからの相対パスとして評価され、ワークスペース外のファイルは評価されない

hashFiles('**/*.js')

ユースケース:

composerのcache等

ktkt

Github Actions キャッシュについて

actions/cache

ワークフロー実行中にキャッシュを扱うアクション

path:キャッシュとして保存・復元するファイルパス

  • 必須
  • ファイル、ディレクトリ、ワイルドカードによるパターンを複数指定可能

kye:

  • 必須

restore-keys:キャッシュ復元時にkyeに一致するキャッシュが存在しなかった時に使われる一覧

  • YAMLのリストではなく、改行区切りの文字で指定

cache-hit:keyに一致するキャッシュが存在 = true、存在しない = false

引用資料:Github-Actions実践入門

ktkt

Github Actions アーティファクト

ビルドで生成したファイルをビルド後に保存して、その情報を後続フローや他のフローに渡す機能

actions/upload-artifact アップロードアクション

  • name:アーティファクトの名前 省略するとデフォルトでartifactという名前になる
  • path:アーティファクトとしてアップロードするファイル、ディレクトリ
  • 必須
  • 相対パスを指定した時はワークスペースからの相対パスと判定される
  • ワイルドカードを利用可能

actions/download-artifact ダウンロードアクション
uploadジョブであげたファイルをdownloadジョブ中でダウンロードして使用できる

  • name:アーティファクトの名前 省略するとデフォルトでartifactという名前になる
  • path:アーティファクトをダウンロードして展開する先のファイルパス

例:

uses: actions/upload-artifact@v2

引用資料:Github-Actions実践入門

ktkt

Github Actions キャッシュとアーティファクトの違い

キャッシュ:

ジョブやワークフローの複数の実行の間でファイルを再利用する
依存パッケージのような変更の少ないファイルに対して使用

アーティファクト:

ワークフローの1回の実行内でファイルを複数のジョブ間で受け渡したり、
ワークフロー完了後に利用するファイルを保存するために使う

バイナリ、アーカイブ、デバッグ用のログ、テスト結果、カバレッジ情報など

引用資料:Github-Actions実践入門

ktkt

GITHUB_SHA・GITHUB_REF

イベント発生時に設定される環境変数

pushイベント

GITHUB_SHA = pushされたコミットのSHAが設定される
pushした時点のブランチ上のワークフロー設定ファイルを元に、
実行されるワークフローが決定される

issue_comment

デフォルトブランチ 最新ブランチのSHA

ktkt

Github Actions ログによるコマンド実行(echoの活用)

ワークフロー実行中に特定のフォーマットの文字列を出力することで以下のことができる

  • 環境変数の設定
  • アウトプットの設定
  • PATHの追加
  • debugメッセージの出力
  • warningメッセージの出力
  • errorメッセージの出力
  • ログのマスク
  • コマンド実行の停止・再開

例:

# echo "::<コマンド名> <key><value>,<key><value>::<コマンドバリュー>"

echo "::set-env name=TZ::Asia/NorthEast-1"

引用資料:Github-Actions実践入門

ktkt

Github Actions セルフホストランナーについて

自分の管理するマシン、VM、コンテナ上でワークフローを実行する
リポジトリ単位、organization単位で追加可能

マネージドランナー:

  • 環境が自動更新・運用お任せでOK
  • ジョブ実行ごとにクリーンなVMを利用
  • プライベートリポジトリだと料金発生

セルフホストランナー:

  • 既存のローカルマシン、クラウドサービス上のリソースを利用できる
  • 独自要件に合わせてカスタマイズ可能
  • 複数のジョブ実行間で環境の持ち越し可能
  • プライベートリポジトリで無料

セキュリティ

パブリックリポジトリでセルフホストランナーを利用する事は非推奨

PRでリスクあるコードを実行される恐れがある

引用資料:Github-Actions実践入門

ktkt

アクションについて

種類:対応OS

JavaScript:Linux、macOS、Windows
Dockerコンテナ:Linux

JSの特徴:

  • 全てのVM環境から直接実行できる
  • Dockerコンテナと比べてイメージのダウンロードやビルド、コンテナの起動コストが発生しない
  • ↑の為高速

Dcokerの特徴:

  • OSがLinuxのみ
  • プロセスが隔離されていていつも同じ環境でアクションを実行できる
  • イメージのダウンロード、ビルド、コンテナの起動コストが生じる
  • ↑の為速度はJSより遅め

アクションのバージョン指定

commit SHA:actions.setup^node@**SHA**
タグ:actions/setup-node@v*.*.*.
ブランチ:actions/setup-node@master

引用資料:Github-Actions実践入門

ktkt

Github Actionsでnpmプライベートリポジトリをinstallする

以下でnpm installが成功した

- uses: actions/checkout@v3
  with:
     persist-credentials: false

- name: Github Apps Token
  id: github_access_token
  uses: tibdex/github-app-token@v1
  with:
      app_id: ****
      installation_id: ****
      private_key: ${{ secrets.KEY }}

- name: Install npm
  env:
      GITHUB_TOKEN: ${{ steps.github_access_token.outputs.token }}
  run: |
     git config --global --add url."https://x-access-token:$GITHUB_TOKEN@github.com/".insteadOf "https://github.com/"
     npm install

実装で活用した記事:
https://horimisli.me/entry/issue-token-with-github-apps/

stack over flow:
https://stackoverflow.com/questions/59644303/install-an-npm-module-from-a-private-github-repository-using-github-actions

参考にした記事メモ

Github Apps経由でtokenを用いてActionsで使う記事:
https://zenn.dev/suzutan/articles/how-to-use-github-apps-token-in-github-actions

insteadOfの解説記事:
https://kakakakakku.hatenablog.com/entry/2020/03/27/093150

git configの解説:
https://blog.katsubemakito.net/git/git-config-1st

詳細解説 (npmではない)
https://zenn.dev/sakojun/scraps/9b1c78851809f5

OAuth・Basic認証の解説記事:
https://qiita.com/kkdmgs110/items/45a09525ba02f79b79fc

PHP privateなリポジトリのPersonal AcessTokenを取得 解説:
https://taisablog.com/archives/gitlab-composer

HTTP-basedについて
https://docs.github.com/en/developers/apps/building-github-apps/authenticating-with-github-apps#http-based-git-access-by-an-installation

Git Hub Actions入門
https://zenn.dev/hashito/articles/7c292f966c0b59

ktkt

Actions actions/checkoutでのpersist-credentials 設定について

The auth token is persisted in the local git config. This enables your scripts to run authenticated git commands. The token is removed during post-job cleanup. Set persist-credentials: false to opt-out.

# Whether to configure the token or SSH key with the local git config
    # Default: true
    persist-credentials: ''

公式
https://github.com/actions/checkout

I propose the persist-credentials feature be removed completely and then v3 be released. Otherwise, if that's not practical, then at least the default should be changed to false.

Just as a heads up for anyone stumbling upon this issue:

①persist-credentials: false is only relevant when you use ssh authentication, because
②GITHUB_TOKEN is always exposed to all jobs, and by default has write access to your repo.
So if you want to harden security, apart from setting persist-credentials: false for ssh auth, make sure that GITHUB_TOKEN auth has no write permission to your repo.

Issue
https://github.com/actions/checkout/issues/485

trueのままだと後続のgitコマンドでデフォルトのアクセストークンが使われるような設定になってしまう。
セキュリティ的にもfalseに設定しておく事が望ましい。

ktkt

GITHUB_TOKEN シークレットトークンについて

自分用整理

GIthubでは、GitHub Actions の代理で認証を受けるために使用できるトークンが提供される

いつ?

各ワークフロー実行の開始時

ワークフローで使用する一意の GITHUB_TOKEN シークレットが自動的に作成される
GITHUB_TOKEN はワークフロー実行での認証に使用可能

Actionsでリポジトリに登録したGitHub Appをインストール

GITHUB_TOKEN シークレットは GitHub App インストール アクセス トークン

インストールアクセストークンは、
リポジトリにインストールされたGitHub Appの代わりに認証を受けるために利用

ジョブが終了するか最大 24 時間後にGITHUB_TOKEN の有効期限が切れる

公式:
https://docs.github.com/ja/actions/security-guides/automatic-token-authentication

ktkt

Circle CIのリポジトリに入れたい環境変数をjsonに記載してシェルからAPIで一括登録する

メモ (大まかなシェルの枠組みはchatGPT経由で出力してもらった)

#!/usr/bin/env bash -ex

# 実行時のログ
LOG=~/circleci_import/import.log
exec &> $LOG

# APIトークン、組織名、プロジェクト名を設定
API_TOKEN="Circle CIのPersonal API Tokens"
ORG_NAME="組織名"
PROJECT_NAME="リポジトリ名"

# JSONファイルのパスを設定
JSON_FILE_PATH="****.json"

# JSONファイルから環境変数を読み込んでCircleCI APIで登録
jq -c '.[]' "${JSON_FILE_PATH}" | while IFS= read -r line; do
  VARIABLE_NAME=$(echo "$line" | jq -r '.name')
  VARIABLE_VALUE=$(echo "$line" | jq -r '.value')

  curl -s --request POST \
    --url https://circleci.com/api/v2/project/github/${ORG_NAME}/${PROJECT_NAME}/envvar \
    --header "Circle-Token: ${API_TOKEN}" \
    --header 'content-type: application/json' \
    --data "{\"name\":\"${VARIABLE_NAME}\", \"value\":\"${VARIABLE_VALUE}\"}"
done

※注意点
パーソナルアクセストークンは以下の形で読み込ませる
--header "Circle-Token: ${API_TOKEN}"

公式の例には記載されてない為、見落としていた。。
https://circleci.com/docs/api/v2/index.html#operation/createEnvVar