GitActionsについて備忘録

GithubActionsはCI/CDの1つ。
各種"イベント"をトリガーに実行開始される。
イベント=push,pull,request,timerなど
実行する処理はワークフロー(YAMLファイル)に定義
/.github/workflows/{NAME}.yml
実行する処理はワークフロー/ジョブ/ステップの3層構造になる。
```yaml:sample.yml
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"配下に指定

```yaml:sample.yml
#イベント
push #指定されたイベントが指定された条件下で発生した時に実行
pull_request #指定されたイベントが指定された条件下で発生した時に実行

#時間指定
schedule #決められた日時で定期的に実行

#マニュアル実行
workflow_dispatch #GitHubのWebページから手動実行

#ワークフロー依存
workflow_run #ワークフロー同士の依存関係を定義。別ワークフローがトリガーまたは完了した場合に実行
```
##### イベント(push)
プッシュイベント時に実行。
「指定ブランチ」にプッシュされた場合、ワークフローを実行。
```yaml:sample.yml
name: "Hello World Flow"

on: 
  push:
    branch:
      - main
      - 'releases/**'

jobs: 
  sample:
    ・・・省略・・・
```
パターン指定の例
- feature/* : "/"(スラッシュ)含まない任意ブランチ
- feature/** : feature以下全てのブランチ
- main : 完全一致するブランチ

「指定パス」にプッシュされた場合、ワークフローを実行。
```yaml:sample.yml
name: "Hello World Flow"

on: 
  push:
    paths:
      - '**.js'

jobs: 
  sample:
    ・・・省略・・・
```
パターン指定の例
- * : "/"(スラッシュ)以外の任意文字列と一致
- **.js : リポジトリ内のすべての".js"ファイル
- docs/* : ルート直下のdocsフォルダ直下ファイル
- docs/** : ルート直下のdocsフォルダ以下全ファイル

「指定ブランチ」かつ「指定パス」にプッシュされた場合、ワークフローを実行。との指定も出来る。

「指定タグ」が設定された場合、ワークフローを実行。
```yaml:sample.yml
name: "Hello World Flow"

on: 
  push:
    tags:
      - v2
      - v1.*

jobs: 
  sample:
    ・・・省略・・・
```

パターン指定の例
- * : "/"(スラッシュ)含まない任意タグ
- ** : 全てのタグ
- v2* : v2で始まる任意タグ
- v2 : 完全一致するタグ

##### イベント(pull_request)
プルリクエスト時に実行。
例)開発時のテスト実行。本番やステージ向けリリースの為の結合

```yaml:sample.yml
name: "Hello World Flow"

on: [pull_request]

jobs: 
  sample:
    ・・・省略・・・
```
「ブランチ」「パス」「ブランチ+パス」の指定は全てpullと同じ指定方法を取る。

##### 時刻指定(schedule)
cron形式で指定されたタイミングで定期的に実行
例)テストで時間がかかるもの(ブラウザ、パフォーマンス)、脆弱性検査

```yaml:sample.yml
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ページ上から手動実行
例)デバッグ実行。脆弱性検査。

```yaml:sample.yml
name: "Hello World Flow"

on:
  workflow_dispatch: #引数なしで実行できるようにする場合は値が空でOK

jobs: 
  sample:
    ・・・省略・・・
```
##### ワークフロー依存(workflow_run)
指定したワークフローが「要求」または「完了」したら実行
例)ワークフローを再利用したい場合、ビルドは同じワークフローを使ってリリースは別のワークフローにしたい

```yaml:sample.yml
name: "Hello World Flow"

on:
  workflow_run:
    workflows: ["Build"]
    types: [requested] #request(要求時に実行)かcompleted(完了時に実行)
    branches:
      - 'releases/**'
jobs: 
  sample:
    ・・・省略・・・
```

##### ジョブ
GithubActionsが実行する処理のカタマリ。
ワークフロー中ではルート直下に"jobs"を続けて記述
```yaml:sample.yml
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"以下に記述
```yaml:sample.yml
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)
```yaml:sample.yml
    ・・・省略・・・
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を定義する。
```yaml:sample.yml
    ・・・省略・・・
defaults: 
  run:
    shell: bash
    working-directory: tmp

jobs:
  sample:
    name: Hello World Job
    runs-on: ubuntu-latest
    steps:
    ・・・省略・・・
```

##### ステップ(run)
```yaml:sample.yml
    ・・・省略・・・
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が提供する環境がオススメ。