ぼちぼちやってたのでメモ。

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がつらい。他のやつも順次乗り換えて行きたい。