GitHub Actionsの処理の流れと基本的な使い方を理解する

GitHub Actionsの処理の流れと基本的な使い方を理解するための項目をまとめました。

### 概要

- GitHub ActionsとはGitHub上でpushやmerge、PR作成をトリガにして処理を走らせる機能です
  - テスト、ビルド、デプロイなどができます
- .github/workflows/*.ymlで記載されたファイルを実行します
- 料金はpublicリポジトリであれば無料になります

### 動作環境

- Apple M1
- macOS 13.4

### 処理の構成

GitHub Actionsは下記の項目から構成されます。

|用語|意味|
|--|--|
|workflow|一連の処理|
|job|workflow内の個々の実行タスク。1つ以上存在して専用のコンテナ内で順次・並列実行される。|
|step|job内での作業単位|
|script/action|step内での作業単位|

![](https://docs.github.com/assets/cb-25535/mw-1440/images/help/actions/overview-actions-simple.webp)
(参照:[GitHub Actions のコンポーネント](https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions#github-actions-%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88))


### GitHub Actionsの設定と実行

まずは試して流れを把握します。

- 任意のリポジトリを用意します。
- ローカルで`.github/workflows/github-actions-demo.yml`を作成します
    - 補足：`.github/workflows/*.yml`が検出されて処理が走ります
- 下記の内容を記載します
  - ```yml:github-actions-demo.yml
    name: GitHub Actions Demo
    run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
    on: [push]
    jobs:
      Explore-GitHub-Actions:
        runs-on: ubuntu-latest
        steps:
          - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
          - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
          - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
          - name: Check out repository code
            uses: actions/checkout@v4
          - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
          - run: echo "🖥️ The workflow is now ready to test your code on the runner."
          - name: List files in the repository
            run: |
              ls ${{ github.workspace }}
          - run: echo "🍏 This job's status is ${{ job.status }}."
    ```
- commitしてpushすると処理が走ります
- 結果はリポジトリの actions > All workflows > GitHub Actions Demo から確認できます
- Explore-GitHub-Actionsで詳細な結果を確認できます
  - [実行例](https://github.com/takuzo8679/github-actions/actions/runs/7147036843/job/19465835844)

### yml構文の理解

GitHub Actionsの実行結果とymlを比較しながらymlの構文を理解します。

|構文|意味|
|--|--|
|name|workflowの名前。コンソール上ではアクションタブに表示される|
|run-name|workflowから生成されたworkflow実行の名前。コンソール上では実行リストに表示される|
|on|workflowを実行するトリガ。主なものにpush, pull_request, schedule, issuesなどがある。その他の選択肢は[こちら](https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows)|
|jobs|以降に1つ以上のjobを記載する|
|jobs.\<job_id\>|jobへの一意な識別子。ここではExplore-GitHub-Actionsとした|
|jobs.\<job_id\>.runs-on|jobを実行するマシンの種類。選択例は[こちら](https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#github-%E3%83%9B%E3%82%B9%E3%83%86%E3%83%83%E3%83%89-%E3%83%A9%E3%83%B3%E3%83%8A%E3%83%BC%E3%81%AE%E9%81%B8%E6%8A%9E)|
|jobs.\<job_id\>.steps|以降にscript/actionを記載する|
|jobs.\<job_id\>.steps[*].run|OSのシェルを実行。コンソール上ではコマンドが表示されるが、後述するnameで上書き可能|
|jobs.\<job_id\>.steps[*].name|GitHubコンソールで実行結果のフローに表示させるstep名。|
|jobs.\<job_id\>.steps[*].uses|同リポジトリ、公開リポジトリ、またはコンテナで定義されているコマンド。詳細は[こちら](https://github.com/marketplace?type=actions)|
|env|環境変数|

### よく使われる構文

#### onのフィルターと複数イベント

```yml
on:
  # 実行タイミングをdevelopブランチ、release/ブランチ配下にPR作成された時に限定する(フィルター)
  pull_request:
    branches:
      - develop
      - 'release/**'
    # 除外ブランチ
    branches-ignore:
      - 'mona/octocat'
      - 'releases/**-alpha'
  # push時のイベントとして加える（複数化）
  push:
    branches:
      - staging:
      - 'release/**'
```

#### workflowと同じリポジトリ内にあるアクションの使用

前提として下記のフォルダ構成の場合

```sh
|-- hello-world (repository)
|   |__ .github
|       └── workflows
|           └── my-first-workflow.yml
|       └── actions
|           |__ hello-world-action
|               └── action.yml # 実行したいファイル
```

```yml
jobs:
  my_first_job:
    runs-on: ubuntu-latest
    steps:
      # リポジトリのcheckout
      - name: My first step - check out repository
        uses: actions/checkout@v4
      # アクションの呼び出し
      - name: Use local hello-world-action
        uses: ./.github/actions/hello-world-action
```

#### node環境の構築

ゼロから環境構築するのは大変なので既存のパッケージ化されたactionを使用します。[参考](https://github.com/marketplace/actions/setup-node-js-environment)


```yml
jobs:
  my_first_job:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
          with:
            # node-version: 18
            node-version-file: '.nvmrc'
            check-latest: false
            architecture: 'x64'
      - run: npm ci
      - run: npm test
```

## 参考

下記を参考にさせていただきした！

- [公式：概要](https://docs.github.com/ja/actions)
- [公式：ワークフロー構文](https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions)
- [Git Hub Actions入門](https://zenn.dev/hashito/articles/7c292f966c0b59)