GitHub Actionsでは定期実行(schedule)のイベントがサポートされておりCron形式で定期的に実行されるワークフローを定義できます。しかし、scheduleではなくpushイベントで動作を確認したいときでも、定期的に実行されるワークフローの中に破壊的な処理(ファイル書き込みやAPI呼び出し)があると安心して実行することができません。
ローカルでDockerコンテナを使って確認するactというツールもありますが、個人ごとに環境を用意する必要があったり、微妙に挙動が不安に感じることもあってnot for meな気がしています。
そこで、各種CLIに付随するdry run的な挙動を実現するために、Workflowをトリガーするイベントによって処理を分岐させ安全に挙動を確認できるようにしました。
次のワークフローはDenoで外部APIから取得してきたデータをファイルに格納し、add-and-commitアクションでリポジトリにcommitするものです。
name: Run task
on:
schedule:
- cron: '30 0 * * *'
push:
jobs:
run:
runs-on: ubuntu-latest
steps:
- run: echo "event name is:" ${{ github.event_name }}
- name: Checkout repo
uses: actions/checkout@v3
- name: Setup Deno
uses: denoland/setup-deno@v1
with:
deno-version: v1.23
# ファイルの書き込みを行うプログラムを実行しています
- name: Run script
run: >
deno run
--allow-write
--allow-env=MY_SECRET_TOKEN
--allow-net=api.example.com
index.ts
env:
MY_SECRET_TOKEN: ${{ secrets.MY_SECRET_TOKEN }}
# 作成されたファイルのDiffが出力される
- run: git add . -N && git diff .
- uses: EndBug/add-and-commit@v9
if: github.event_name == 'schedule' # この条件文によってScheduleのときだけコミットされるようになる
ワークフローのイベントにはScheduleとPushが設定されているため、定期的に実行されるだけでなくプッシュされたときにもワークフローが実行されます。
ただ、プッシュされた時はファイルが作成されたことは確認したいのですが、コミットされるのは望ましくありません。
そこでStepに条件文を指定し、トリガーとなったイベント名を取得するgithub.event_name
を使ってScheduleの時のみコミットを行うように指定します。
また、デバッグ用として作成されたファイルのDiffを表示するためにgit add . -N && git diff .
を実行するようにしました。
これら対応を行うことである程度安心して挙動を確認できるようになりました。
GitHub Actionsのワークフロー構文に関してはドキュメントがしっかりしていて、しかも日本語対応しています。ドキュメントを読みましょう。
今回は触れませんでしたが、簡単なタスクを書くのであればDenoが良かったです。
この記事はエンジニアリングに興味があるデザイナー、デザインに興味があるエンジニア Advent Calendar 22日目の記事です。 私は以前ウェブアプリケーションエンジニア(サーバーとウェブフ
技術書典10で『つのぶえ出版』としてReactとGatsbyJSの入門本を頒布予定です。 > どんな本かどんな本か 一言でいうと、React/Gatsbyでウェブサイトを書けるようになる本です
欲しいものはAmazonに売ってないので、独自にリストを作ることにしました。 - いい感じの動画を作るセンス 今年に入ってAfter Effectsを使ったアニメーションを作ったりしています。Tw