GitHub Actionsがなにもしてないのにこわれた時の対処法

## 先に結論だけ

GitHub Actionsで[ubuntu-18.04イメージの非推奨化と削除プロセス](https://github.blog/changelog/2022-08-09-github-actions-the-ubuntu-18-04-actions-runner-image-is-being-deprecated-and-will-be-removed-by-12-1-22/)が始まりました。

[スターターテンプレート](https://github.com/actions/starter-workflows/blob/main/ci/node.js.yml)から作成したGitHub Actionsのワークフローは、実行環境の自動更新によって失敗する可能性があります。[Ubuntuのリリースサイクル](https://ubuntu.com/about/release-cycle)を超えて運用し続けるワークフローは、実行環境をバージョン固定しdependabotでactionを更新すべきです。

## はじめに

この記事は、GitHub Actionsの

- 実行環境の自動更新に関する情報
- 自動更新によって発生する問題
- 対処方法

について記録、共有するためのものです。

### 想定する環境

この記事は、2023/01/14時点のGitHub Actionsと`ubuntu-latest`を前提としています。

### 想定する読者

- すでにGitHub Actionsを使用している
- GitHub Actionsを使い始めたばかりだ
- 長期的に運用したい

すでにGitHub Actionsを使用しているユーザーを想定しているため、GitHub Actionsの紹介や、ツールのインストールについては解説しません。ご了承ください。

## 発生した問題

three.jsに依存したパッケージを開発しており、そのワークフローが失敗しました。エラーログを参照すると、WebGLの単体テストに必要なパッケージのインストールに失敗していました。

<details>
<summary>エラーログの全文</summary>
<pre>
<code>
Run sudo apt-get install libxi-dev xvfb libgl1-mesa-dev
Reading package lists...
Building dependency tree...
Reading state information...
xvfb is already the newest version (2:21.1.3-2ubuntu2.5).
The following additional packages will be installed:
  libegl-dev libegl-mesa0 libegl1 libgbm-dev libgbm1 libgl-dev libgl1-mesa-dri
  libglapi-mesa libgles-dev libgles1 libgles2 libglvnd-core-dev libglvnd-dev
  libglx-dev libglx-mesa0 libopengl-dev libopengl0 libxfixes-dev
Recommended packages:
  libgl1-amber-dri
The following NEW packages will be installed:
  libegl-dev libegl-mesa0 libegl1 libgl-dev libgl1-mesa-dev libgles-dev
  libgles1 libgles2 libglvnd-core-dev libglvnd-dev libglx-dev libopengl-dev
  libopengl0 libxfixes-dev libxi-dev
The following packages will be upgraded:
  libgbm-dev libgbm1 libgl1-mesa-dri libglapi-mesa libglx-mesa0
5 upgraded, 15 newly installed, 0 to remove and 33 not upgraded.
Need to get 8324 kB of archives.
After this operation, 4155 kB of additional disk space will be used.
Get:1 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libgbm-dev amd64 22.0.5-0ubuntu0.3 [9274 B]
Get:2 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libgbm1 amd64 22.0.5-0ubuntu0.3 [32.7 kB]
Get:3 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libgl1-mesa-dri amd64 22.0.5-0ubuntu0.3 [7469 kB]
Ign:4 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libglx-mesa0 amd64 22.0.5-0ubuntu0.3
Ign:5 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libglapi-mesa amd64 22.0.5-0ubuntu0.3
Ign:6 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libegl-mesa0 amd64 22.0.5-0ubuntu0.3
Ign:7 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libegl1 amd64 1.4.0-1
Ign:8 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libglx-dev amd64 1.4.0-1
Ign:9 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgl-dev amd64 1.4.0-1
Ign:10 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libegl-dev amd64 1.4.0-1
Ign:11 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgles1 amd64 1.4.0-1
Ign:12 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgles2 amd64 1.4.0-1
Ign:13 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgles-dev amd64 1.4.0-1
Ign:14 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libopengl0 amd64 1.4.0-1
Ign:15 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libopengl-dev amd64 1.4.0-1
Ign:16 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libxfixes-dev amd64 1:6.0.0-1
Ign:17 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libxi-dev amd64 2:1.8-1build1
Ign:18 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libglvnd-core-dev amd64 1.4.0-1
Ign:19 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libglvnd-dev amd64 1.4.0-1
Ign:20 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libgl1-mesa-dev amd64 22.0.5-0ubuntu0.3
Ign:4 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libglx-mesa0 amd64 22.0.5-0ubuntu0.3
Ign:5 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libglapi-mesa amd64 22.0.5-0ubuntu0.3
Ign:6 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libegl-mesa0 amd64 22.0.5-0ubuntu0.3
Ign:7 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libegl1 amd64 1.4.0-1
Ign:8 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libglx-dev amd64 1.4.0-1
Ign:9 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgl-dev amd64 1.4.0-1
Ign:10 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libegl-dev amd64 1.4.0-1
Ign:11 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgles1 amd64 1.4.0-1
Ign:12 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgles2 amd64 1.4.0-1
Ign:13 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgles-dev amd64 1.4.0-1
Ign:14 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libopengl0 amd64 1.4.0-1
Ign:15 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libopengl-dev amd64 1.4.0-1
Ign:16 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libxfixes-dev amd64 1:6.0.0-1
Ign:17 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libxi-dev amd64 2:1.8-1build1
Ign:18 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libglvnd-core-dev amd64 1.4.0-1
Ign:19 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libglvnd-dev amd64 1.4.0-1
Ign:20 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libgl1-mesa-dev amd64 22.0.5-0ubuntu0.3
Ign:4 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libglx-mesa0 amd64 22.0.5-0ubuntu0.3
Ign:5 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libglapi-mesa amd64 22.0.5-0ubuntu0.3
Ign:6 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libegl-mesa0 amd64 22.0.5-0ubuntu0.3
Ign:7 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libegl1 amd64 1.4.0-1
Ign:8 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libglx-dev amd64 1.4.0-1
Ign:9 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgl-dev amd64 1.4.0-1
Ign:10 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libegl-dev amd64 1.4.0-1
Ign:11 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgles1 amd64 1.4.0-1
Ign:12 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgles2 amd64 1.4.0-1
Ign:13 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgles-dev amd64 1.4.0-1
Ign:14 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libopengl0 amd64 1.4.0-1
Ign:15 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libopengl-dev amd64 1.4.0-1
Ign:16 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libxfixes-dev amd64 1:6.0.0-1
Ign:17 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libxi-dev amd64 2:1.8-1build1
Ign:18 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libglvnd-core-dev amd64 1.4.0-1
Ign:19 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libglvnd-dev amd64 1.4.0-1
Ign:20 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libgl1-mesa-dev amd64 22.0.5-0ubuntu0.3
Err:4 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libglx-mesa0 amd64 22.0.5-0ubuntu0.3
  Connection failed [IP: 52.252.75.106 80]
Err:5 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libglapi-mesa amd64 22.0.5-0ubuntu0.3
  Could not connect to azure.archive.ubuntu.com:80 (52.252.75.106), connection timed out [IP: 52.252.75.106 80]
Err:6 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libegl-mesa0 amd64 22.0.5-0ubuntu0.3
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:7 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libegl1 amd64 1.4.0-1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:8 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libglx-dev amd64 1.4.0-1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:9 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgl-dev amd64 1.4.0-1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:10 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libegl-dev amd64 1.4.0-1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:11 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgles1 amd64 1.4.0-1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:12 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgles2 amd64 1.4.0-1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:13 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libgles-dev amd64 1.4.0-1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:14 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libopengl0 amd64 1.4.0-1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:15 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libopengl-dev amd64 1.4.0-1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:16 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libxfixes-dev amd64 1:6.0.0-1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:17 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libxi-dev amd64 2:1.8-1build1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:18 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libglvnd-core-dev amd64 1.4.0-1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:19 http://azure.archive.ubuntu.com/ubuntu jammy/main amd64 libglvnd-dev amd64 1.4.0-1
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Err:20 http://azure.archive.ubuntu.com/ubuntu jammy-updates/main amd64 libgl1-mesa-dev amd64 22.0.5-0ubuntu0.3
  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
Fetched 7511 kB in 3min 38s (34.4 kB/s)
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/m/mesa/libglx-mesa0_22.0.5-0ubuntu0.3_amd64.deb  Connection failed [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/m/mesa/libglapi-mesa_22.0.5-0ubuntu0.3_amd64.deb  Could not connect to azure.archive.ubuntu.com:80 (52.252.75.106), connection timed out [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/m/mesa/libegl-mesa0_22.0.5-0ubuntu0.3_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libg/libglvnd/libegl1_1.4.0-1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libg/libglvnd/libglx-dev_1.4.0-1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libg/libglvnd/libgl-dev_1.4.0-1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libg/libglvnd/libegl-dev_1.4.0-1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libg/libglvnd/libgles1_1.4.0-1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libg/libglvnd/libgles2_1.4.0-1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libg/libglvnd/libgles-dev_1.4.0-1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libg/libglvnd/libopengl0_1.4.0-1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libg/libglvnd/libopengl-dev_1.4.0-1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libx/libxfixes/libxfixes-dev_6.0.0-1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libx/libxi/libxi-dev_1.8-1build1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libg/libglvnd/libglvnd-core-dev_1.4.0-1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/libg/libglvnd/libglvnd-dev_1.4.0-1_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Failed to fetch http://azure.archive.ubuntu.com/ubuntu/pool/main/m/mesa/libgl1-mesa-dev_22.0.5-0ubuntu0.3_amd64.deb  Unable to connect to azure.archive.ubuntu.com:http: [IP: 52.252.75.106 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
Error: Process completed with exit code 100.
</code>
</pre>
</details>



## 原因

この問題はGitHub Actionsの実行環境イメージが更新されたため起きました。

### `ubuntu-latest`イメージの変更

https://github.blog/changelog/2022-11-09-github-actions-ubuntu-latest-workflows-will-use-ubuntu-22-04/

GitHub Actionsの実行環境ラベル`ubuntu-latest`が、2022年10月から`ubuntu-22.04`に自動更新されました。

```yaml
name: Node.js CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:

    runs-on: ubuntu-latest
             ^^^^^^^^^^^^^
```

node.jsでのテスト環境は、多くのユーザーがこの[スターターテンプレート](https://github.com/actions/starter-workflows/blob/main/ci/node.js.yml)から構築を始めていると思います。このテンプレートでは、実行環境をラベル`ubuntu-latest`で指定していますが、このラベルでは実行環境が自動更新されます。

### ワークフローが実行環境に依存していた

問題が発生したプロジェクトでは、WebGL単体テストのため仮想ディスプレイドライバーを追加でインストールしていました。該当するスクリプトは以下の通りです。

```shell
sudo apt-get install libxi-dev xvfb libgl1-mesa-dev
```

これらのパッケージはテスト環境を構築した`ubuntu-18.04`では必須でした。しかし`ubuntu-22.04`では`xvfb`がイメージに同梱されていて追加インストールが不要になりました。

## 対策

今回の問題はGitHub Actionsの実行環境が自動更新され、ワークフローのセットアップ処理が実行環境に依存したために起きました。この問題の再発を防ぐためにワークフローを修正します。

### 実行環境バージョンの固定

```diff_yaml
name: Build on Ubuntu
on: push

jobs:
  build:
-    runs-on: ubuntu-latest
+    runs-on: ubuntu-22.04
```

CI環境の構築が終わり、動作が安定した段階で実行環境のバージョンを固定します。

仮に実行環境が非推奨や削除になった場合、GitHub Actionsのエラーログにそのことが表示されるでしょう。自動更新よりもバージョンを固定した方が問題の切り分けが楽になります。

どのバージョンに固定するかは、公式ドキュメントの[イメージ一覧](https://github.com/actions/runner-images/#available-images)を見て検討してください。

### actionの更新

ワークフロー内で利用されているactionも、指定方法によってはバージョンが自動更新されます。たとえば`setup-node`の場合

```yaml
- uses: actions/setup-node@v3
- uses: actions/setup-node@v3.6
- uses: actions/setup-node@v3.6.0
```

という[バージョンの指定方法](https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#example-using-versioned-actions)があります。バージョン指定が省略された場合、その範囲で最新のactionを利用します。

GitHub Actionsの[クイックスタートガイド](https://docs.github.com/ja/actions/quickstart)ではメジャーバージョンを指定し、マイナーバージョンの更新を自動化しています。頻繁にセキュリティーアップデートが入るため、actionは自動更新した方が安全だという方針です。しかしこの方針では、actionsの更新によってCIが失敗した場合、問題の切り分けが難しくなります。また可能性は低いですが、悪意あるactionがリリースされてしまった場合、あなたのワークフローはそのactionを使用してしまいます。

https://docs.github.com/ja/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot

そうした問題を解決するため、DependabotがGithub Actionsの更新に対応しました。

_▼.github/dependabot.yml_

```yaml
version: 2
updates:

  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
```

設定ファイル`.github/dependabot.yml`を作成すると、定期的にDependabotがワークフローファイルを走査します。セキュリティパッチが公開されている場合、Dependabotはactionを更新するプルリクエストを作成します。プルリクエストのマージ前にテストをすれば、actionの更新がテストに影響を与えないとわかります。

### apt-get update

テスト環境に追加パッケージが必要な場合は、インストールの前に`apt-get update`コマンドを使うべきです。

```diff_yaml
name: Build on Ubuntu
on: push

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
      - name: パッケージのインストール前にapt-get updateをあわせて実行する
        run: |
-          sudo apt-get install jq
+          sudo apt-get update
+          sudo apt-get install jq
```



https://docs.github.com/en/actions/using-github-hosted-runners/customizing-github-hosted-runners#installing-software-on-ubuntu-runners

> Note: Always run sudo apt-get update before installing a package. In case the apt index is stale, this command fetches and re-indexes any available packages, which helps prevent package installation failures.
> 注意: パッケージをインストールする前には、必ず sudo apt-get update を実行してください。apt のインデックスが古くなっている場合、このコマンドは利用可能なパッケージを取得してインデックスを再作成し、パッケージのインストールに失敗するのを防ぐのに役立ちます。

実行環境イメージのインデックスファイルは最新のものとは限りません。実行前にインデックスファイルを更新すれば、インストールに関する失敗を防げます。

## 個人的な感想

GitHub Actionsが[2019年に一般公開され](https://github.blog/jp/2019-08-21-github-actions-now-supports-ci-cd/)てから、Ubuntuイメージの非推奨化と削除は初めての出来事だと思われます。今後も継続的なメンテナンスが必要になるという前提で、GitHub Actions運用のための時間を確保しなければいけません。

以上、ありがとうございました。

## 参考記事

https://github.com/juliangruber/browser-run/issues/147

https://zenn.dev/snowcait/articles/ae7511ea14051e98a5da