とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど

開催予定の勉強会

読者登録と各種SNSのフォローもよろしくお願いいたします。

自宅のインフラ環境をIaCとGitHub Actionsで管理

以前IaCとCircleCIで自宅のインフラ環境を管理する方法を記事にしました。

devops-blog.virtualtech.jp

今回はIaCとGitHub Actionsで管理する方法を書いていきます。

とはいっても、CIの設定を変更していくだけなので、以前の記事から「GitHubの設定」まで終わらせておきます。

GitHub Actionsの設定

先にシークレットを登録してしまいましょう。登録方法は以下です。

GitHub Actions でのシークレットの使用 - GitHub Docs

シークレットの内容は以下です。

Name Value
token メモしたトークン
secret メモしたクライアントシークレット
botdeviceid メモしたdeviceId

次にワークフローの定義を置いておくディレクトリを作ります。

mkdir -p .github/workflows

ワークフローの定義を置いていきます。GitHub Actionsは.github/workflows以下に置いたYAMLフォーマットのファイルをワークフローとして実行してくれるので、ファイル名はなんでも大丈夫です。今回は.github/workflows/bot.yamlというファイル名にしておきます。

on:
  push:
    branches:
      - main
    paths:
      - .github/workflows/bot.yaml
      - config.yaml

jobs:
  light_toggle:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Generate sign
        id: sign
        run: |
          token="${{ secrets.token }}"
          secret="${{ secrets.secret }}"
          t="$(date +%s%3N)"
          nonce="$(uuidgen)"
          sign="$(echo -n "$token$t$nonce" | openssl dgst -binary -sha256 -hmac "$secret" | base64)"
          echo "t=$t" >> $GITHUB_OUTPUT
          echo "nonce=$nonce" >> $GITHUB_OUTPUT
          echo "sign=$sign" >> $GITHUB_OUTPUT

      - name: Run read-yaml action
        id: yaml-data
        uses: jbutcher5/read-yaml@main
        with:
          file: './config.yaml'
          key-path: '["bot", "command"]'

      - name: Light toggle
        run: |
          curl -X POST \
               -H "Content-Type: application/json; charset=utf8" \
               -H "Authorization: ${{ secrets.token }}" \
               -H "t: ${{ steps.sign.outputs.t }}" \
               -H "sign: ${{ steps.sign.outputs.sign }}" \
               -H "nonce: ${{ steps.sign.outputs.nonce }}" \
               -d '{"command": "'${{ steps.yaml-data.outputs.data }}'", "paramter": "default", "commandType": "default"}' \
               "https://api.switch-bot.com/v1.1/devices/${{ secrets.botdeviceid }}/commands"

少し補足しておくと、Run read-yaml actionconfig.yamlをパースして、Light toggleから値を取得しています。

config.yamlを作ります。

bot:
  # command: turnOff
  command: turnOn
  # command: press

.github/workflows/bot.yamlconfig.yamlをGitHubにPushするとActionsが動き出すので確認してみます。

ワークフローの実行はブランチとパスで制御されています。もしかすると初回だけ動かないかもしれません。その場合はconfig.yamlを少し弄ってcommitし直すと動き出すと思います。