今までブログや日記等に travis-ci を使っていたところを、GitHub Actions に移行した。移行作業自体そこまで大変ではなかったけど、こういうのはメモしておかないと文法や作法を忘れてしまうので備忘録的に書いておく。
diary
プロジェクト概要
- レポジトリ: sh4869/diary: My Diary System written by Rust
- 構成
- ビルドツール: Rust
- デプロイ先: Firebase
手元でもざっとビルドできるように、cargo run
してからfirebase deploy
するとデプロイされるようになっている。デプロイ先はdiary.sh4869.net。
Before: Travis CI ファイル
dist: trusty
language: rust
rust:
- nightly
before_install:
- nvm install node
- nvm use node
- npm install -g firebase-tools
after_success: export RUST_BACKTRACE=1 && cargo run && firebase --token $FIREBASE_TOKEN
--project sh4869-diary deploy
notifications:
slack:
secure: (省略)
firebase は firebase-tools を使ってデプロイするようになっているので、Rust 環境に nvm を使って(これは Travis CI の Linux 環境)node をインストールしてから npm install で firebase tools をインストールしている。
After: GitHub Actions
name: Build and Deploy
on:
push:
branches:
- diary
- master
env:
CARGO_TERM_COLOR: always
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Install latest nightly
uses: actions-rs/toolchain@v1
with:
toolchain: nightly
override: true
- uses: actions/checkout@v2
- name: Run cargo check
uses: actions-rs/cargo@v1
with:
command: run
- name: GitHub Action for Firebase
uses: w9jds/firebase-action@v1.5.0
with:
args: deploy --token $FIREBASE_TOKEN --only hosting --project sh4869-diary
env:
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
- name: Slack Notification
if: success()
uses: tokorom/action-slack-incoming-webhook@master
env:
INCOMING_WEBHOOK_URL: ${{ secrets.SLACK_INCOMING_HOOKS }}
with:
text: deploy diaries.
attachments: |
[
{
"color": "good",
"author_name": "${{ github.actor }}",
"author_icon": "${{ github.event.sender.avatar_url }}",
"fields": [
{
"title": "Commit Message",
"value": "${{ github.event.head_commit.message }}"
}
]
}
]
上の Actions ファイルでは、以下のような順番でビルドを行っている。
- rust nightly インストール
- git repository checkout
- cargo run
- firebase deploy
- slack notification
git repository install
ソースコードをチェックアウトするだけ。
- uses: actions/checkout@v2
rust nightly インストール(& cargo run)
rust-toolchain · Actions · GitHub Marketplace
rust-toolchain を使うと、Rust の nightly 等を選択してインストールすることができる。ここでインストールした Cargo を使いたいので、override
にtrue
を指定している。
- name: Install latest nightly
uses: actions-rs/toolchain@v1
with:
toolchain: nightly
override: true
- name: Run cargo check
uses: actions-rs/cargo@v1
with:
command: run
firebase deploy
w9jds/firebase-action: GitHub Action for interacting with Firebase
Firebase deploy は firebase-action を使う。deploy するときに KEY が必要なので、firebase login:ci
で発行したキーを secrets に追加する。secrets は Repository Setting から追加できる。
- name: GitHub Action for Firebase
uses: w9jds/firebase-action@v1.5.0
with:
args: deploy --token $FIREBASE_TOKEN --only hosting --project sh4869-diary
env:
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
slack への通知
Github Actions から Slack へ通知するのを良い感じにしたい | Spinners Inc.
いくつか候補があったけれど、上の記事のが良さげだったので使わせてもらった。GitHub Actions の明確な利点は他人が作った Actions を使えることである。
- name: Slack Notification
if: success()
uses: tokorom/action-slack-incoming-webhook@master
env:
INCOMING_WEBHOOK_URL: ${{ secrets.SLACK_INCOMING_HOOKS }}
with:
text: deploy diaries.
attachments: |
[
{
"color": "good",
"author_name": "${{ github.actor }}",
"author_icon": "${{ github.event.sender.avatar_url }}",
"fields": [
{
"title": "Commit Message",
"value": "${{ github.event.head_commit.message }}"
}
]
}
]
失敗時にはGitHub Actions側からメールが来るようになっているため、成功時にだけSlackに通知が飛ぶようにしてある。
備考
on:
push:
branches:
- 'diary'
- 'master'
ここでdiary
, master
どちらも指定している。masterはプログラムがあるブランチ、diaryは日記本体があるブランチ。どちらのブランチにも .github/workflows
を置かないと動かないので気を付けること。
感想
Travis CI のように環境に対して記述していく感じではないので、若干戸惑いがあるが、他人が作った Actions を使えたりするのは便利。本当は build と deploy は別にしたいのだけど、ディレクトリごとキャッシュする方法がよくわからなかったのでまとめてしまった。あと yaml がつらい。他のやつも順次乗り換えて行きたい。