[GitHub Actions] コミットを作成せずに GitHub Pages へデプロイする

ワークフローの実行中に変更したファイルを GitHub Pages へデプロイする方法のひとつとして「GitHub Actions でコミットを作成する」というものがありますが、本記事ではコミットを作成せずにデプロイします。

# 1. カスタムワークフローの作成

参考「[ギットハブ　アクション　のワークフロー構文 - GitHub Enterprise Cloud Docs](https://docs.github.com/ja/enterprise-cloud@latest/actions/writing-workflows/workflow-syntax-for-github-actions)」

## 1.1. `push` 時

```yaml:.github/workflows/example.yml
name: Deploy content to Pages

on:
  push:
    branches:
      - main
  workflow_dispatch:

concurrency:
  group: pages
  cancel-in-progress: false

jobs:

  build:
    runs-on: ubuntu-latest
    steps:

      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Pages
        uses: actions/configure-pages@v5

      - name: Create file
        run: date > docs/date.txt

      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: docs

  deploy:
    permissions:
      pages: write
      id-token: write
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    needs: build
    steps:

      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4
```

参考「[GitHub Pages でのカスタム ワークフローの使用 - GitHub Docs](https://docs.github.com/ja/pages/getting-started-with-github-pages/using-custom-workflows-with-github-pages)」
参考「[starter-workflows/pages at main · actions/starter-workflows · GitHub](https://github.com/actions/starter-workflows/tree/main/pages)」

### 1.1.1. ワークフロー

設定:

- `push` 時に実行する
    - `on.push`
- Actions から手動実行出来るようにする
    - `on.workflow_dispatch`
- 多重起動しないようにする
    - `concurrency.group`
- 既に実行開始している場合は中止しない
    - `concurrency.cancel-in-progress: false`

※権限 `permissions.contents: read` はデフォルトの設定が `write` の場合に書き込みが行われないようにするための設定なため、必須ではありません。

参考「[既定の GITHUB_TOKEN のアクセス許可の構成 - リポジトリの GitHub Actions の設定を管理する - GitHub Docs](https://docs.github.com/ja/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#configuring-the-default-github_token-permissions)」

### 1.1.2. `build` ジョブ

ここでは以下のスクリプトを実行してファイルを動的に生成します。

```bash
date > docs/date.txt
```

ステップ:

- リポジトリにアクセス出来るようにする
    - `uses: actions/checkout@v4`
- GitHub Pages を有効化する
    - `uses: actions/configure-pages@v5`
- 成果物をアップロードする
    - `uses: actions/upload-pages-artifact@v3`
    - ディレクトリを指定
        - `path: docs`

ディレクトリ `docs` 内に存在する静的なファイルも含めてアップロードされます。

### 1.1.3. `deploy` ジョブ

設定:

- GitHub Pages へのデプロイ時に必要な権限
    - `permissions.pages: write`
    - `permissions.id-token: write`
- デプロイ環境
    - `environment.name: github-pages`
    - `environment.url: ${{ steps.deployment.outputs.page_url }}`

ステップ:

- アップロードされた成果物をデプロイする
    - `id: deployment`
    - `uses: actions/deploy-pages@v4`

ステップの出力から GitHub Pages のサイト URL を取得し、デプロイ環境の URL を設定します:

- `steps.deployment.outputs.page_url`

参考「[jobs.<job_id>.steps[*].id - ギットハブ　アクション　のワークフロー構文 - GitHub Enterprise Cloud Docs](https://docs.github.com/ja/enterprise-cloud@latest/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsid)」
参考「[steps context - Accessing contextual information about workflow runs - GitHub Enterprise Cloud Docs](https://docs.github.com/ja/enterprise-cloud@latest/actions/writing-workflows/choosing-what-your-workflow-does/accessing-contextual-information-about-workflow-runs#steps-context)」
参考「[Outputs - actions/deploy-pages at v4.0.5](https://github.com/actions/deploy-pages/tree/v4.0.5?tab=readme-ov-file#outputs-)」
参考「[jobs.<job_id>.environment - ギットハブ　アクション　のワークフロー構文 - GitHub Enterprise Cloud Docs](https://docs.github.com/ja/enterprise-cloud@latest/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idenvironment)」

## 1.2. `push` 時および `cron` `schedule` 時

ワークフローのトリガーを追加することで `cron` の設定も可能です。

```yaml:.github/workflows/example.yml (一部)

on:
  push:
    branches:
      - main
  schedule:
    - cron: '45 21 * * *'
  workflow_dispatch:

```

※ GitHub Pages の `cron` は遅延が発生したりジョブの一部が破棄される場合があります。

参考「[schedule - ワークフローをトリガーするイベント - GitHub Docs](https://docs.github.com/ja/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#schedule)」
参考「[Crontab.guru - The cron schedule expression generator](https://crontab.guru/)」

ワークフローからのデプロイは「アクティビティ」とみなされないため、「ワークフローが 60 日で無効化されないようにする」対策が必要です。

参考「[[GitHub Actions] ワークフローが 60 日で無効化されないようにする - Qiita](https://qiita.com/kerupani129/items/fda97ed2cf34a156d47d)」

# 2. リポジトリの設定

リポジトリの設定を変更することで、Github Actions から GitHub Pages へデプロイ可能になります。

※ワークフロー自体は GitHub Pages の設定に影響しませんが、ワークフローが GitHub Pages へデプロイすると自動で設定に反映されます。

Settings:

- Code and automation
Pages
    - Build and deployment
    Source: Github Actions

参考「[カスタム GitHub Actions ワークフローによる公開 - GitHub Pages サイトの公開元を設定する - GitHub Docs](https://docs.github.com/ja/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0-github-actions-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AB%E3%82%88%E3%82%8B%E5%85%AC%E9%96%8B)」