GithubActionsはCI/CDの1つ。
各種"イベント"をトリガーに実行開始される。
イベント=push,pull,request,timerなど
実行する処理はワークフロー(YAMLファイル)に定義
/.github/workflows/{NAME}.yml
実行する処理はワークフロー/ジョブ/ステップの3層構造になる。
name: "Hello World Flow" #ワークフローの名称
on: #トリガーの指定
push:
paths:
- ".github/workflows/**"
jobs: #ジョブの指定
sample:
name: Hello World Job
runs-on: ubuntu-latest #実行環境の指定
steps: #ステップの指定
-run: echo "Hello World !"
トリガー
トリガーとは、Github Actionsが実行されるキッカケ(イベント)
ワークフロー中では"on"配下に指定
#イベント
push #指定されたイベントが指定された条件下で発生した時に実行
pull_request #指定されたイベントが指定された条件下で発生した時に実行
#時間指定
schedule #決められた日時で定期的に実行
#マニュアル実行
workflow_dispatch #GitHubのWebページから手動実行
#ワークフロー依存
workflow_run #ワークフロー同士の依存関係を定義。別ワークフローがトリガーまたは完了した場合に実行
イベント(push)
プッシュイベント時に実行。
「指定ブランチ」にプッシュされた場合、ワークフローを実行。
name: "Hello World Flow"
on:
push:
branch:
- main
- 'releases/**'
jobs:
sample:
・・・省略・・・
パターン指定の例
- feature/* : "/"(スラッシュ)含まない任意ブランチ
- feature/** : feature以下全てのブランチ
- main : 完全一致するブランチ
「指定パス」にプッシュされた場合、ワークフローを実行。
name: "Hello World Flow"
on:
push:
paths:
- '**.js'
jobs:
sample:
・・・省略・・・
パターン指定の例
-
- : "/"(スラッシュ)以外の任意文字列と一致
- **.js : リポジトリ内のすべての".js"ファイル
- docs/* : ルート直下のdocsフォルダ直下ファイル
- docs/** : ルート直下のdocsフォルダ以下全ファイル
「指定ブランチ」かつ「指定パス」にプッシュされた場合、ワークフローを実行。との指定も出来る。
「指定タグ」が設定された場合、ワークフローを実行。
name: "Hello World Flow"
on:
push:
tags:
- v2
- v1.*
jobs:
sample:
・・・省略・・・
パターン指定の例
-
- : "/"(スラッシュ)含まない任意タグ
- ** : 全てのタグ
- v2* : v2で始まる任意タグ
- v2 : 完全一致するタグ
イベント(pull_request)
プルリクエスト時に実行。
例)開発時のテスト実行。本番やステージ向けリリースの為の結合
name: "Hello World Flow"
on: [pull_request]
jobs:
sample:
・・・省略・・・
「ブランチ」「パス」「ブランチ+パス」の指定は全てpullと同じ指定方法を取る。
時刻指定(schedule)
cron形式で指定されたタイミングで定期的に実行
例)テストで時間がかかるもの(ブラウザ、パフォーマンス)、脆弱性検査
name: "Hello World Flow"
on:
schedule:
- cron: '30 5 * * 1,3'
- cron: '30 5 * * 2,4'
jobs:
sample:
・・・省略・・・
cron形式とは
0 5 * * 6 = 毎週土曜日 朝5:00に実行
| | | | └ 週の何曜日か(0~6またはSUN~SAT)
| | | └ 月(1~12またはJAN~DEC)
| | └ 1か月の何日目か(1~31)
| └ 時(0~23)
└ 分(0~59)
マニュアル実行(workflow_dispatch)
GitHubのWebページ上から手動実行
例)デバッグ実行。脆弱性検査。
name: "Hello World Flow"
on:
workflow_dispatch: #引数なしで実行できるようにする場合は値が空でOK
jobs:
sample:
・・・省略・・・
ワークフロー依存(workflow_run)
指定したワークフローが「要求」または「完了」したら実行
例)ワークフローを再利用したい場合、ビルドは同じワークフローを使ってリリースは別のワークフローにしたい
name: "Hello World Flow"
on:
workflow_run:
workflows: ["Build"]
types: [requested] #request(要求時に実行)かcompleted(完了時に実行)
branches:
- 'releases/**'
jobs:
sample:
・・・省略・・・
ジョブ
GithubActionsが実行する処理のカタマリ。
ワークフロー中ではルート直下に"jobs"を続けて記述
name: "Hello World Flow"
on:[push, workflow_dispatch]
jobs: #ジョブの指定
sample: #ジョブIDの指定
name: Hello World Job #ジョブ名の指定
runs-on: ubuntu-latest #実行環境(ランナー)の指定
steps: #実行する処理(ステップ)を指定
-run: echo "Hello World !"
ステップ
ワークフロー中では"jobs.{JOB_ID}.steps"以下に記述
name: "Hello World Flow"
on:[push, workflow_dispatch]
jobs:
sample:
name: Hello World Job
runs-on: ubuntu-latest
steps:
-uses: actions/checkout@v3" #再利用可能なアクション。
-run: echo "Hello World !" #CLI(.sh)プログラムの実行
ステップ(run)
・・・省略・・・
jobs:
sample:
name: Hello World Job
runs-on: ubuntu-latest
steps:
-name: Greeting message #ステップの表示名を設定
id: greeting #ステップIDを設定
run: | #複数行シェルスクリプトを記述
echo "Hello" #シェルスクリプトを記述
echo "${NAME}"
env: #環境設定を設定
NAME: tanaka
shell: bash #bash,pwsh,python,cmd,powershellなど選択可能
working-directory: tmp #ワークディレクトリの指定
すべての環境で同じ環境設定を構築したい場合、defaultsを定義する。
・・・省略・・・
defaults:
run:
shell: bash
working-directory: tmp
jobs:
sample:
name: Hello World Job
runs-on: ubuntu-latest
steps:
・・・省略・・・
ステップ(run)
・・・省略・・・
jobs:
sample:
name: Hello World Job
runs-on: ubuntu-latest
steps:
-name: Greeting message #ステップの表示名を設定
id: greeting #ステップIDを設定
uses: actions/checkout@v3 #実行したいアクションをバージョン番号付きで記述
with: #アクションごとに必要とされる引数を指定。
fetch-depth: 0
ランナー
ランナーとは、GithubActionsの処理を実行する環境。
ランナーはジョブ単位で起動するため、ジョブ間で情報連携するには工夫が必要。
Githubが提供する環境と自身で構築する環境があるが、Githubが提供する環境がオススメ。