同じテストやデプロイの手順を毎回手で実行していたとき、コミット後に何も考えずに自動で処理してくれる仕組みが欲しかった。そこで個人開発のリポジトリにいくつかの GitHub Actions ワークフローを組み込んだところ、作業の手間が大きく減り、品質も安定した。ここでは実際に作って役立ったワークフローを10個紹介する。
テスト実行でコード品質を守る(Node.js)
テストを忘れがちで、ローカルでは通るのにCIで落ちることが多かった。npm test を実行するワークフローを作り、プッシュごとに自動でテストを走らせた。
name: Node CI
on:
push:
branches: [ main ]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
- run: npm test
使ってみたらテスト落ちがすぐに検出でき、修正漏れがほぼなくなった。プッシュ後にGitHubのチェックが緑になるのを見ると安心感があった。
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
最新ツール・トレンド情報をずんだもん×めたんが解説するYouTubeチャンネルを運営しています!
いいね、チャンネル登録してもらえると嬉しいです🙇♂️
ハジメル.dev: https://hajimeru-dev.vercel.app/
「ひとりで続けるのは難しい」「何から学べばいいか分からない」という方向けに、
プログラミングのマンツーマンレッスンサービス「ハジメル.dev」も運営しています。
未経験OK・オンライン完結・月額制/違約金なしなので、気軽に無料相談してみてください🙇♂️
海外テックニュースを追いたいけど、英語や情報量の多さで大変…という方向けに、
Hacker News の話題を日本語でサクッと追える「HackerNews 日本語まとめ & AI要約」
を個人開発しました!
技術トレンド収集に使ってもらえると嬉しいです🔥🙇♂️
→ HackerNews 日本語まとめ & AI要約: https://hn-matome-2ht.pages.dev/
「ニャンパイアサバイバー」というヴァンパイアサバイバーリスペクトのゲームを作成しました!
もしよろしければ遊んで頂けると嬉しいです😭
習い事教室の先生向けに、SNS 投稿・生徒募集・保護者通知の文章を AI で生成する Web サービス「おしらせAI」を個人開発しました。Next.js + Supabase + LLM で構成しており、無料で月 10 回まで試用できます。よければ触ってみてください。
→ おしらせAI: https://oshirase-ai.vercel.app/
言いたいことがうまく伝わらない…という方向けに、会話の言い方を添削する「伝え方ラボ」を開発中です。
場面を選んで自分の言葉で返すと、何が伝わっていないかの指摘と、そのまま使える言い換えが返ってきます。
ChatGPT に相談すると褒めから入って直すべきところが残りがちなので、指摘側に振り切りました。
現在は公開時にお知らせするメール登録のみ受付中です🙇♂️
→ 伝え方ラボ: https://tsutaekata-lab.pages.dev/
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
ライブラリのアップデートを自動で確認(Dependabot ライク)
依存パッケージの更新を手動で確認するのが面倒で、古いバージョンのまま放置しがちだった。スケジュールで npm outdated を実行し、結果をIssueに投稿するワークフローを作った。
name: Dependency Check
on:
schedule:
- cron: '0 2 * * 1' # 毎週月曜 02:00 UTC
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm outdated > outdated.txt
- if: ${{ always() }}
uses: peter-evans/create-issue-from-file@v4
with:
title: 『週次依存関係チェック』結果
content-filepath: outdated.txt
labels: dependencies
これで毎週月曜に更新候補がIssueとして届き、見逃しなくアップデート作業に取り掛かれるようになった。
ビルド成果物をリリースに自動添付(Go)
Go製CLIツールのバイナリを毎回手でビルドしてリリースページにアップロードしていたのが煩雑だった。タグ push時にビルドし、アセットとして添付するワークフローを組んだ。
name: Go Release
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.22'
- run: go build -o mytool-${{ github.ref_name }} ./cmd/mytool
- uses: softprops/action-gh-release@v2
with:
files: mytool-${{ github.ref_name }}.*
tag_name: ${{ github.ref_name }}
タグを打つだけでバイナリがリリースに添付され、手動アップロードの手間がゼロになった。ユーザーにすぐに最新バージョンを提供できるようになった。
ドキュメントサイトをNetlifyに自動デプロイ(静的サイト)
Markdownで書いたドキュメントを毎回ローカルでnpm run buildし、Netlifyに手動でドラッグしていたのが面倒だった。mainブランチ更新時にビルドし、Netlifyにデプロイするワークフローを作った。
name: Deploy Docs
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
- run: npm run build
- uses: nwtgck/actions-netlify@v2
with:
publish-dir: ./public
production-branch: main
github-token: ${{ secrets.GITHUB_TOKEN }}
netlify-auth-token: ${{ secrets.NETLIFY_AUTH_TOKEN }}
netlify-site-id: ${{ secrets.NETLIFY_SITE_ID }}
プッシュ後に自動でサイトが更新され、ドキュメントの修正がすぐに反映されるようになった。手動デプロイのミスもなくなり、レビューが楽になった。
コードフォーマットをPR時に自動適用(Prettier)
コードスタイルが揃わなくてレビュー時に指摘されることが多かった。PR作成時にPrettierを走らせ、フォーマット違いがあれば自動でコミットするワークフローを入れた。
name: Format Code
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
- run: npx prettier --write "**/*.{js,ts,jsx,tsx,css,md}"
- uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "chore: format code"
branch: format/${{ github.head_ref }}
title: "自動フォーマット"
labels: formatting
フォーマット違いがあれば別PRが立ち上がり、レビュー側はスタイル指摘を気にせずロジックに集中できるようになった。コミットログもきれいになった。
セキュリティスキャンを夜間に実行(CodeQL)
脆弱性を見逃さないようにしたかったが、手動でスキャンを走らせるのを忘れがちだった。毎晩02:00にCodeQLを実行し、アラートを出すワークフローを設定した。
name: CodeQL Analysis
on:
schedule:
- cron: '0 2 * * *'
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
analyze:
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
steps:
- uses: actions/checkout@v4
- uses: github/codeql-action/init@v3
with:
languages: [javascript, typescript]
- uses: github/codeql-action/analyze@v3
夜間にスキャン結果がSecurityタブに表示され、重大な脆弱性があればメール通知も来るようになった。事前に対応できる余裕ができ、リリース前の不安が減った。
リリースノートを自動生成(Changelog Generator)
リリースごとに手で changelog を書いていたが、漏れや表記ブレがあった。コミットメッセージから従来の従来の Conventional Commits 形式を解析し、リリースノートを作るワークフローを入れた。
name: Generate Changelog
on:
push:
tags:
- 'v*'
jobs:
changelog:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm i -g conventional-changelog-cli
- run: conventional-changelog -p angular -i CHANGELOG.md -s -r 0
- uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
body_path: CHANGELOG.md
タグを打つだけで changelog が更新され、リリースに自動で添付されるようになった。リリース作業が劇的に楽になり、変更漏れもほぼなくなった。
Docker イメージをレジストリに自動プッシュ(Docker Buildx)
ローカルで docker build し、手で Docker Hub に push していたのが面倒だった。マルチプラットフォームビルドとプッシュを一つのワークフローにまとめた。
name: Docker Build & Push
on:
push:
branches: [ main ]
jobs:
buildx:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- uses: docker/build-push-action@v5
with:
context: .
push: true
tags: user/myapp:latest, user/myapp:${{ github.sha }}
platforms: linux/amd64,linux/arm64
プッシュ時に最新イメージが自動でレジストリに上がり、開発環境やステージングへのデプロイが docker pull だけで済むようになった。イメージ管理の手間が大幅に減った。
スクレイピング結果をSlackに通告(Python)
定期的に外部サイトのデータを取得しており、変化があったときだけ知りたかったが、手でスクリプトを走らせていた。cronで毎日実行し、差分があればSlackに投稿するワークフローを作った。
name: Notify Scrape
on:
schedule:
- cron: '0 7 * * *' # 毎朝07:00 UTC
jobs:
scrape:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: pip install -r requirements.txt
- run: |
python scrape.py > current.json
if [ -f previous.json ]; then
diff -u previous.json current.json > diff.txt || true
fi
cp current.json previous.json
- if: ${{ always() && files.exists('diff.txt') }}
uses: slackapi/slack-github-action@v1.23.0
with:
payload: |
{
"text": "スクレイピング結果に変更がありました。\n\`\`\`${{ github.event.head_commit.message }}\`\`\`",
"channel": "#scrape-notify"
}
変更があるときだけSlackに通知が来るようになり、見逃しがなくなった。手動で確認する手間が省け、他の作業に集中できるようになった。
ブランチ保護ルールをCIで自動適用(GitHub API)
保護ルールの設定を手で行うと、漏れやミスがあり、ブランチが誤って force push されることがあった。リポジトリ作成時に必要な保護ルールをAPIで設定するワークフローを組んだ。
name: Set Branch Protection
on:
workflow_dispatch:
jobs:
protect:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/github-script@v7
with:
script: |
github.rest.repos.updateBranchProtection({
owner: context.repo.owner,
repo: context.repo.repo,
branch: 'main',
required_status_checks: { strict: true, contexts: ['Node CI'] },
enforce_admins: true,
required_pull_request_reviews: { required_approving_review_count: 1 },
restrictions: null
})
ワークフローを手動で実行するだけで、mainブランチに必要なチェックとレビューが自動で課されるようになった。設定ミスがなくなり、ブランチの安全性が向上した。
まとめ
これらのワークフローを導入してから、手作業の繰り返しが劇的に減り、エラーの早期発見とリリースのスピードが両立できるようになった。まずは自分が最も面倒だと感じている作業の一つを自動化してみてほしい。そうすることで、開発の楽しさを取り戻せるはずだ。