GitHub Actionsとは
GitHub Actionsベストプラティクス
GitHub Actions料金 Datadogによる可視化と削減のヒント
モノレポで GitHub Actions の jest coverage report を動かす
- 現在のソフトウェア開発における課題
ソフトウェア開発を取り巻く環境は日々変化し、様々なツールやライブラリが次々と登場する時代がやってきました。これまで人が行っていた作業やハードウェアが実行していたタスクは、どんどんソフトウェアに置き換えられ、我々はソフトウェアに覆われた世界に向かって加速しています。これは喜ばしいことですが、一方で新しいツールができることや、それらを正しく連携させるための設定はどんどん複雑化し、本来の目的だったソフトウェア開発のために十分な時間を取れないといったケースが増えています。 GitHubの利用形態について分析すると、全ユーザの約60%がリポジトリと何らかの外部ツールやサービスを連携させている、という結果がわかっていました。そこでGitHubでは、ソフトウェア開発のプラットフォームとしてこの問題を解決し、開発者の体験をより良いものにするにはどうしたらいいか考え、2018年10月にGitHub Actionsを発表しました。 ソフトウェアのソースコードを一定の品質に保ちつつ速いサイクルで開発・デプロイするために、現代ではこれだけ多様な技術が使われるようになりました。テスト、ビルド、デプロイのパターンだけでも多くの選択肢があり、その他のツールの利用も含めると組み合わせは無限にあります。苦労してプロジェクトに最適な組み合わ せを見つけ、ワークフローを作り上げたとしても、今まではそれをコードとして記述するスタンダードな方法がなかったので、GitHub上で共有したり再利用することができないという問題がありました。
ジョブサマリー
GitHub Actionsでジョブサマリー機能が利用可能になり、各ジョブによって生成される実行サマリーにカスタムMarkdownコンテンツを出力できるようになった。
dependabot.yml
GitHub actionsまとめる
GitHub ActionsのTipsやベストプラクティスを淡々と記録する
GitHub Appsトークン解体新書:GitHub ActionsからPATを駆逐する技術
GitHub ActionsからIAMロールを利用する。
Actions secretsはGitHub側で暗号化されていますが、アクセスキーに紐づくAWS IAM(Identity and AccessManagement)ポリシーも必要最低限の権限付与に留めることが重要。 しかし、特定のAWS IAMユーザーに紐づく固定のアクセスキーをGitHub Actionsのようなサービスに設定する運用にはまだ懸念が残る、。 、GitHubActionsでサポートされているOpenIDConnectを使ったしくみを組み合わせることで、AWS IAM Roleから一時的なアクセスキーを取得できるようになります。 以下の例では、もともとaws accesskey idとaws secret accesskeyを設定していたところがrole to assumeに変わっています。このようにGitHubActionsに固定のアクセスキーを設定する必要がなくなり、よりセキュアに運用できます。
GitHub actions debug
この記述で対応可能
- name: Debug
if: ${{ always() }}
uses: mxschmitt/action-tmate@v3
GitHub Actions 料金
※前提としてプライベートリポジトリが料金かかる。パブリックは無料。
OSによって料金が変わる。
Linuxは1分あたり0.008ドルと安価
Windowsは0.016ドル(2倍)
macOSは0.08ドル(10倍)という価格
GitHub Actions実行単位
3つの実行単位が存在する。
- workflow
- Job(1つのworkflow複数指定可能)
- Step
高速化
CI/CDのビルドでは、リポジトリが依存するパッケージのダウンロードが原因でビルド時間が長くなってしまうことがある。 理由として、近年のCI/CDではビルドごとに完全にクリーンな実行環境が用意され、前回のビルドでダウンロードしたファイルが持ち越されないため。 このため、CI/CDが提供するキャッシュ機能を用いて、異なるビルド間でダウンロードしたパッケージを使い回して高速化することがよくある。 GitHub Actionsでもキャッシュ機能が提供されている。
Action内ではwarnでは止まらない
GitHub Actionsの処理では警告(warn)はsuccessとして通るので注意。
プルリクエストのpaths条件
GitHub Actions ワークフローで複数のジョブ実行を制御する
GitHub Actions ワークフローで複数のジョブ実行を制御する
cache
キャッシュ有効期限 おそらくキャッシュサーバから削除されるのは7日間アクセスがなかったら削除される。
キャッシュスコープ キャッシュのスコープはキーとブランチです。 デフォルトのブランチ キャッシュは、他のブランチで使用できる(developのは他で使える)。 トピックブランチはトピックブランチ内でしか使えない。
GitHub Actions公式のキャッシュ機能である actions/cache
は
- Pull Requestでコケた時にRe-run jobsするとactions/cacheアクションが正常に動作しない
- actions/cacheアクションは時折キャッシュの取得に失敗することがある
GitHub Actionsにはactions/cacheというものがあって、ビルド時の依存関係を解決したものとかをキャッシュしておくことができます。 標準ではGitHubが提供するキャッシュサーバにファイルが保存されるんですが、さまざまな事情により自分たちが管理するストレージに置きたいことがあります。
以下のusesの結果 出力としてcache-hitというbool値が出力される。 GitHubにはこう書いてありますが、falseが空値で返ってくることや、後に出てくる判定で'true'を使っていることから、文字列が返ってきている気がします。
- uses: actions/cache@v1
with:
path: ~/go/pkg/mod # キャッシュの保存先(ディレクトリ)を指定する
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} # どのキャッシュを使うかなどの識別子に使う
restore-keys: | # keyが見つからなかった場合に、他のキャッシュを探索するのに使うキーを指定
${{ runner.os }}-go-
- uses: actions/cache@v1がやっていること path, keyは必須で、restore-keysのみオプションです。
次に、このactionが何をやっているのか、簡単に整理します。
- keyやrestore-keysに基づいて、キャッシュが存在するか調査します。
- 調査結果ごとの処理を行います。
キャッシュが存在すれば、cache-hitにtrueが入る。job終了時、キャッシュの保存は行われない。 キャッシュが存在しなかった場合、keyを予約。cache-hitには空値が入っている。job終了時、pathで指定されたディレクトリにキャッシュの保存を試みる。作られるキャッシュは、keyで識別可能になります。
プロジェクトにcacheを適用する
これが助けてくれた 参考URL
cache生存確認
参考URL 2022年6月27日以降 GitHub Actions Cache APIを介してキャッシュのクエリと管理ができるようになった。
新しいキャッシュを使用したい場合は key
および restore-keys
どちらかを変更する必要。
GitHub アクションのキャッシュが古くなる。
GitHub Action処理 種類
- post処理 ジョブのステップが全部終わった後に行う処理のこと。
基本的には action で設定したものをもとに戻したり、docker コンテナを停止したりするのに利用されています。
GitHub Actions動作環境遍歴
Docker(遅い)→ Node(デファクトスタンダード)
- DockerベースのGitHub Actions(よ かったが動作が遅すぎる)
- Nodeベース(早いけどシェルスクリプトでできる動作ができない場合も)
GitHub Actionでできること
- cronみたいなこと
- webhooksで実行
- pushなどのGitHub eventで実行
GitHub Actionsは、ほかのCI/CDツールと同様、リポジトリに対するプッシュやプルリクエストといった操作、もしくは指定した時刻になるといったイベントをトリガーとして、あらかじめ定義しておいた処理を実行する機能。
たとえばリポジトリにコミットが行われた際に特定の処理を実行したり、毎日決まった時刻に特定の処理を実行したりする、といったことを実現できる。これらの処理はGitHubが提供するサーバー上に用意された仮想マシン内で実行できるため、ユーザーが独自にサーバーなどを準備する必要はない点が最大のメリット。
仮想マシン上で利用できるOSとは 仮想マシン上で利用できるOSとしては、Linux(Ubuntu)およびWindows、macOSに対応している。 仮想マシン上にはOSだけでなく、さまざまな言語のコンパイラや各種ランタイム、主要ライブラリといったソフトウェア開発環境も標準でインストールされ ている。 さらに、sudoコマンドを使ってroot権限でコマンドを実行させることもできる。 つまり一般的なサーバー上で実行できるほとんどの処理を実行できる。 利用規約によって禁止されている処理ですら(アカウント凍結といったペナルティなどを受ける可能性は高いが)実行自体は可能。
また特別なハードウェアが必要な場合や、後述する制約を回避したい場合、 また仮想マシン内でなく実マシン上で実行させたいといった場合は、ユーザーのサーバー上で処理を実行させることもできるようになっている。
GitHub Action基本
workflowの定義
リポジトリに次のディレクトリを作成し、その中にYAML形式で定義する
.github/workflows/
YAMLファイルの名前は自由
workflowsの中身を確認してみる
ymlのnameがActionsのtest一覧に ymlのjogsのtest名がnameに紐付きじゃばらで出る
拡張子
.yml
.yaml
のどちらでも可能。
job
Job間での共有(リファレンス) 複数Job間でデータを共有する
ひとつのファイルに複数のjobを指定可能。
原則として各jobは並列に実行されるが依存関係(他のジョブ終了を待つ)を設定することも可能(needs)
needsなどを指定しない場合は並列で実行される
各ジョブは仮想環境の新しいインスタンスで実行される(つまり別々のGitHub Actions Runner(別々のOS)で実行される) したがってジョブ間で環境変数やファイル/セットアップ処理の結果などは共有されない
- 共有したい場合 解決策の1つにArtifactsのUpload/Downloadがある。 残念ながら今のところGitHub ActionsにはJob間で共有可能なグローバルスコープの変数などはない。
# job1の成果物をjob2にはdefaultでは共有ができない。
jobs:
job1:
runs-on: ubuntu-latest
job2:
runs-on:
Steps
実行コンテキストという観点
GitHub ActionsではStepごとに1つのシェルが与えられる。(つまり異なるStepに書かれたコマンドは違うシェル上で実行される)
jobが実行する処理の集合
同じjobのstepは同じ仮想環境で実行されるのでファイルやセットアップ処理は共有できる。
しかし各ステップは別プロセスなのでステップ内で定義した環境変数は共有できない。
jobs.<job_id>.env
で定義した環境変数は全stepで利用できる
※jobの中にさらに細かい粒度で、stepが存在:stepはjobと違い上から順に実行される
# job1の成果物をjob2にはdefaultでは共有ができない。
jobs:
build:
job1:
steps:
- uses: actions/checkout@v3
job2:
steps:
- uses: actions/checkout@v3