🐙

GitHub Actionsのubuntu-18.04がDeprecatedとなったので、ubuntu-latestへマイグレーションする

2022/08/23に公開

GitHub Actionsで ubuntu-18.04 がDeprecatedとなり、2022年12月1日にサポートが終了されることがアナウンスされています。
また、移行を促すために一時的に利用できなくなるブラウンアウトが行われています。

手動での移行

特定のubuntuのバージョンに依存していない場合は、単純にubuntu-latestへ移行するなどの対応することが解決できます。

ubuntu-18.04を利用しているGitHub Actionsのworkflowsファイルを次のように書き換えます。

name: test
on: [push, pull_request]
jobs:
  test:
    name: "Test on Node.js ${{ matrix.node-version }}"
-    runs-on: ubuntu-18.04
+    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [12, 14, 16]
    steps:
      - name: checkout
        uses: actions/checkout@v2
      - name: setup Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}
      - name: Install
        run: yarn install
      - name: Test
        run: yarn test

利用できるubuntu imageのバージョンはREADMEにまとめらています。

コマンドでの移行

大量のリポジトリや大量のworkflowファイルがあると、エディタで書き換えるよりもコマンドを使って移行するのが良い気はします。

自分は次のようなワンライナーを使っていました。
macOSでしか確認してないので、もっと丁寧なコマンドは誰かが書いてくれると思います。

ubuntu-18.04を利用しているかをチェックするワンライナー

find .github/workflows -type f -name "*.y*ml" -exec grep "ubuntu-18.04" {} +;

ubuntu-18.04ubuntu-latestへ書き換えるワンライナー

find .github/workflows -type f -name "*.y*ml" -exec sed -i "" -e "s/ubuntu-18.04/ubuntu-latest/" {} +;

大量のリポジトリをまとめてマイグレーションする

リポジトリが分かれていて、それぞれGitHub Actionsを利用していると移行が大変です。
自分も100コ以上のリポジトリがubuntu-18.04を利用していたので、Shepherdを使ってまとめてマイグレーションしました。

📝 ライブラリのアップデートとか必要な時まで放置しますが、CI自体が止まるとPRがきたときにCI自体が動かないので面倒だと思って、とりあえずCIが止まらないようにしたいと思ったのでまとめて移行しています。

Shepherdは、複数のリポジトリに対してコマンドを実行してPRを作れるツールです。次の記事でも紹介しています。

実際に、Shepherdのマイグレーションスクリプトは次のようなものを利用しました。
次のスクリプトではubuntu-18.04を利用してるリポジトリに対して、ubuntu-latestへ書き換えています。

id: 2022.08.23-ubuntu-18.04
title: "CI: update ubuntu-18.04 to ubuntu-latest"
adapter:
  type: github
  search_type: code
  search_query: org:{{user}} path:/.github/workflows # 対象のorgに書き換えて!
hooks:
  should_migrate:
    - ls .github/workflows
    - find .github/workflows -type f -name "*.y*ml" -exec grep "ubuntu-18.04" {} +;
  apply:
    - find .github/workflows -type f -name "*.y*ml" -exec sed -i "" -e "s/ubuntu-18.04/ubuntu-latest/" {} +;
  pr_message: echo "ref https://github.com/actions/runner-images/issues/6002"

📝 GitHubのPRを作るrate limitが強くなっていて、80ぐらいでrate limitにかかってしまうので、x-ratelimitをちゃんと見る実装が必要そうな気がします。別のツールがあるかもしれない。

Discussion