今までブログや日記等に travis-ci を使っていたところを、GitHub Actions に移行した。移行作業自体そこまで大変ではなかったけど、こういうのはメモしておかないと文法や作法を忘れてしまうので備忘録的に書いておく。

diary

プロジェクト概要

手元でもざっとビルドできるように、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: [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

Features • GitHub Actions

ソースコードをチェックアウトするだけ。

- uses: actions/checkout@v2

rust nightly インストール(& cargo run)

rust-toolchain · Actions · GitHub Marketplace

rust-toolchain を使うと、Rust の nightly 等を選択してインストールすることができる。ここでインストールした Cargo を使いたいので、overridetrueを指定している。

- 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 Actionsn の明確な利点は他人が作った 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 }}"
            }
          ]
        }
      ]

成功時だけ飛ばしているのは失敗時にはメールが来るようになっているので。

TODO

  • diary を別ブランチにする

感想

Travis CI のように環境に対して記述していく感じではないので、若干戸惑いがあるが、他人が作った Actions を使えたりするのは便利。本当は build と deploy は別にしたいのだけど、ディレクトリごとキャッシュする方法がよくわからなかったのでまとめてしまった。あと yaml がつらい。 他のやつも順次乗り換えて行きたい。