🏕️

GitHub Actionsでfly.ioに自動デプロイする

2023/03/10に公開
2

概要

Web Speed Hackathon 2023に参加するにあたって、GitHub Actionsから自動的にデプロイする対応(CD環境構築)を行った。
https://cyberagent.connpass.com/event/270424/

目的

イベントでのリリース推奨環境はfly.ioとなっていたが、fly.ioへのリリースをしている間ローカルの処理リソースを使うのが個人的に嫌だったので、CD環境を構築して自動リリースを行うことで開発に注力することを目的とする

内容

今回のCDではGitHub Actionsで下記の内容を実施した。

  1. Node環境のインストール
  2. リリース用資材のBuild
  3. fly.ioへのリリース

事前準備(2022年課題で試作)

当日いきなりCD環境を構築するのはハッカソンの期間を無駄に消費してしまうだけなので、同様にfly.ioが推奨リリース環境となっていた2022年の課題を元に事前準備を行った(該当のリポジトリをフォークして実施)

https://github.com/CyberAgentHack/web-speed-hackathon-2022

基本的にはローカル環境でリリースする作業をそのまま記載していく形になる

  1. まずはGithub Actinosの準備を行うため、GithubにアクセスしてActionsタブを選択
  2. 次に「Search workflows」に「node」を入力して検索
  3. 出てきたNode.jsの「Configure」を選択し、雛形が作成される
  4. 作成した雛形に対して、下記対応を実施する
     - Github Actionsの実行条件を「mainブランチにpushされた時」のみにする
     - Node.jsの利用するバージョンを16系のみにする
     - 今回利用するのはyarnであるため、キャッシュを「npm」から「yarn」に変更する
     - 依存関係のインストール処理を追加する
yaml
name: Node.js CI

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

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
-        node-version: [14.x, 16.x, 18.x]
+        node-version: [16.x]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

    steps:
      uses: actions/checkout@v3
+    
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
-        cache: 'npm'
+        cache: 'yarn'
+
+    - name: Install dependencies
+    - run: yarn --frozen-lockfile
-    - run: npm run build --if-present
-    - run: npm test
  1. 今回実行するのはfly.ioへのデプロイであるため、fly.ioのトークンを取得する必要がある。そのため、ローカル環境で下記コマンドを実行してトークンを取得する
flyctl auth token
  1. 取得したトークンをGithub Actionsの環境データに追加する
  • Githubを開いて、「Settings」タブを開く
  • サイドメニューの「Security > Secrets and variables > Actions」を選択する
  • 画面内に表示されている「New repository secret」を押下する
  • Nameに今回のトークンの名称(本記載では「FLY_API_TOKEN」と設定)Secretに5.で取得したトークンを入力を設定
  • 「Add secret」を押下
  1. 取得したトークンをYAMLのenvデータとして追加し、ビルドとデプロイの処理を追記する
    (今回はfly.ioへのリリースであるため、fly.io CLIを利用できるようにsuperfly/flyctl-actionsを利用した)
    https://github.com/superfly/flyctl-actions
yaml
name: Node.js CI

on:
  push:
    branches: [ "main" ]
+
+env:
+  FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
+
jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [16.x]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

    steps:
    - uses: actions/checkout@v3
+    - uses: superfly/flyctl-actions/setup-flyctl@master
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}

        cache: 'yarn'

    - name: Install dependencies
    - run: yarn --frozen-lockfile
+    - run: yarn build
+    - run: flyctl deploy

バージョンを固定した方がよいらしいが、仮利用なので一旦最新を取得する形で記載

  1. 変更したActionを保存するため、「Start commit」を押下し、必要に応じて情報を入力してcommitする

  2. yamlファイル更新時と、mainブランチにpushされた際にCDが動作するようになる
    サーバーが立ち上がる処理等が含まれているとビルドが終了しなくなるので注意する
    (Github Actionsのコストは時間当たりで掛かるので最初の1,2回は気にかけておく)

2023年課題のGithub Actions

ハッカソン当日に、作成しておいたGithub ActionsのYAMLを再利用して2023年課題のYAMLファイルを作成した。

差分としては利用されるNode.jsのバージョンが18系になったこと、パッケージマネージャーがyarnからpnpmに変わったこと。
pnpmについてはyarnと異なりactions/setup-nodeに含まれていないため、変更する必要がある

結果としてyamlファイルは下記のようになった

yaml
name: web-speed-hackathon-2023 CD

on:
  push:
    branches: [ "main" ]

env:
  FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
  
jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
-        node-version: [16.x]
+        node-version: [18.x]

    steps:
    - uses: actions/checkout@v3
+    - uses: pnpm/action-setup@v2.2.2
    - uses: superfly/flyctl-actions/setup-flyctl@master
-    - name: Use Node.js ${{ matrix.node-version }}
-      uses: actions/setup-node@v3
+    - uses: pnpm/action-setup@v2.2.2
      with:
        cache: 'pnpm'
-    - run: yarn --frozen-lockfile
-    - run: yarn build
+    - run: pnpm i --frozen-lockfile
+    - run: pnpm build
    - run: flyctl deploy --remote-only

(確認するとpnpmのキャッシュは効いてなかったのでそこは要改善。本番中は一旦無視して進行した)

挙動としては問題なく動作したので、以降のリリースはmainブランチにpushするのみで進めた。

【追記(2023/03/14)】
pnpmのキャッシュについてコメントにて情報を頂いたので、そちらを参照。
キャッシュにはsetup-nodeが必要との事(キャッシュ自体はsetup-nodeの機能)

Discussion

H524H524

不足してしまっていた部分について、回答を頂きありがとうございます。

キャッシュについては純粋にsetup-nodeの機能で、pnpmは関係ないんですね。