GitHub Actionsでfly.ioに自動デプロイする
概要
Web Speed Hackathon 2023に参加するにあたって、GitHub Actionsから自動的にデプロイする対応(CD環境構築)を行った。
目的
イベントでのリリース推奨環境はfly.ioとなっていたが、fly.ioへのリリースをしている間ローカルの処理リソースを使うのが個人的に嫌だったので、CD環境を構築して自動リリースを行うことで開発に注力することを目的とする
内容
今回のCDではGitHub Actionsで下記の内容を実施した。
- Node環境のインストール
- リリース用資材のBuild
- fly.ioへのリリース
事前準備(2022年課題で試作)
当日いきなりCD環境を構築するのはハッカソンの期間を無駄に消費してしまうだけなので、同様にfly.ioが推奨リリース環境となっていた2022年の課題を元に事前準備を行った(該当のリポジトリをフォークして実施)
基本的にはローカル環境でリリースする作業をそのまま記載していく形になる
- まずはGithub Actinosの準備を行うため、GithubにアクセスしてActionsタブを選択
- 次に「Search workflows」に「node」を入力して検索
- 出てきたNode.jsの「Configure」を選択し、雛形が作成される
- 作成した雛形に対して、下記対応を実施する
- Github Actionsの実行条件を「mainブランチにpushされた時」のみにする
- Node.jsの利用するバージョンを16系のみにする
- 今回利用するのはyarnであるため、キャッシュを「npm」から「yarn」に変更する
- 依存関係のインストール処理を追加する
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
- 今回実行するのはfly.ioへのデプロイであるため、fly.ioのトークンを取得する必要がある。そのため、ローカル環境で下記コマンドを実行してトークンを取得する
flyctl auth token
- 取得したトークンをGithub Actionsの環境データに追加する
- Githubを開いて、「Settings」タブを開く
- サイドメニューの「Security > Secrets and variables > Actions」を選択する
- 画面内に表示されている「New repository secret」を押下する
- Nameに今回のトークンの名称(本記載では「FLY_API_TOKEN」と設定)Secretに5.で取得したトークンを入力を設定
- 「Add secret」を押下
- 取得したトークンをYAMLのenvデータとして追加し、ビルドとデプロイの処理を追記する
(今回はfly.ioへのリリースであるため、fly.io CLIを利用できるようにsuperfly/flyctl-actionsを利用した)
https://github.com/superfly/flyctl-actions
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
バージョンを固定した方がよいらしいが、仮利用なので一旦最新を取得する形で記載
-
変更したActionを保存するため、「Start commit」を押下し、必要に応じて情報を入力してcommitする
-
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ファイルは下記のようになった
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
参考になる情報ありがとうございます。
pnpmのcacheは、use: superfly/...の次の行を以下のように、pnpmをsetup-nodeに書き直したら有効になりました。
不足してしまっていた部分について、回答を頂きありがとうございます。
キャッシュについては純粋にsetup-nodeの機能で、pnpmは関係ないんですね。