前回(No.7:ブランチ戦略の比較 Git Flow、GitHub Flow、GitLab Flow)では、チーム開発の交通ルールであるブランチ戦略について解説しました。
第8回となる今回は、そのルールを守りつつ、日々の繰り返し作業を機械に任せる 「GitHub Actions(CI/CD)」 について解説します。
「テストの実行忘れ」や「複雑なデプロイ手順」といった悩みは、仕組みで解決できます。自動化を取り入れて、より快適な開発環境を作りましょう。
GitHub入門シリーズ 全10回本記事は「GitHub入門」全10回のNo.8です。
- No.1:Git/GitHubの基本概念とGitHub導入による投資対効果(ROI)
- No.2:リポジトリとREADMEから始める
- No.3:変更を確定!コミット実行とコミットメッセージの書き方
- No.4:VS CodeでGitを使いこなす マージ・コンフリクト・便利機能
- No.5:Issue(イシュー)でタスク管理
- No.6:Pull Request(PR)とコードレビュー
- No.7:ブランチ戦略の比較 Git Flow、GitHub Flow、GitLab Flow
- No.8:GitHub Actions CI/CDで自動化
- No.9:Code Scanning・Dependabot セキュリティの自動化
- No.10:なぜGitHubが高パフォーマンスチームを作るのか
##今回のゴール
- CI/CDの基本概念(なぜ自動化するのか)を理解する
- GitHub Actionsで「テスト自動化」のワークフローを作成する
- マーケットプレイスを活用して簡単に設定を行う
- 自動化による工数削減と品質向上のメリットを知る
1. CI/CDとは?(人間がやるべき仕事、機械に任せる仕事)
CI/CD とは、ソフトウェアを安全かつ高速に届けるための自動化の仕組みです。
-
CI(Continuous Integration / 継続的インテグレーション):
- 役割: コードが提出されたら、自動でテストやLint(構文チェック)を行う
-
CD(Continuous Delivery / 継続的デリバリー):
- 役割: テストに通ったコードを、自動でサーバーへ反映(デプロイ)する
人間は「コードを書く」ことに集中し、チェックや運搬などの定型作業は機械に任せる。これがCI/CDの思想です。
自動化がもたらす変化
最初は設定に少し手間がかかりますが、一度導入してしまえば、開発チームにとって心強い味方になります。
-
クリエイティブな時間の創出:
第1回の記事(自動化による時短効果)でも紹介した通り、手動作業を自動化することで作業時間は 50〜80%削減 されると言われています(出典:State of DevOps Report)。
例えば、1回30分のデプロイ作業を年100回行うと、年間で約50時間になります。自動化によってこの時間をほぼゼロにできれば、その分を新機能の開発やスキルアップなど、より価値のある活動に充てることができるようになります。 -
プレッシャーからの解放と属人化の解消:
「手順書通りに正確に操作しなきゃ…」という緊張感や、「このデプロイ作業は詳しいAさんしかできない」といった属人化は、チームにとって大きなリスクです。
決まった手順を機械に任せることで、人為的なミスをゼロにし、誰でも安全にリリースできる体制が整います。結果として、担当者の精神的な負担も大きく軽減されます。
2. GitHub Actionsの仕組み
GitHub Actionsは、GitHubに標準搭載されているCI/CDツールです。
リポジトリの中に.github/workflows/というフォルダを作り、その中にYAMLファイルを置くだけで動きます。
基本構造
- Event(いつ): プッシュされた時? PRが作られた時?
- Job(何を): Linux環境を立ち上げて、テストを実行する
-
Steps(手順): 具体的なコマンド(
npm installなど)
3. 実践:テストを自動化してみよう
では、「PRを作成したら自動でテストを実行する」ワークフローを作ってみましょう。
1. サンプルコードの準備
まず、自動テストの対象となるプログラムが必要です。練習用に「足し算プログラム」と「テストコード」を作成し、リポジトリにコミットしてください。
① package.json (設定ファイル) npm test でテストが動くように設定します。
{
"name": "my-first-project",
"version": "1.0.0",
"scripts": {
"test": "jest"
},
"devDependencies": {
"jest": "^29.7.0"
}
}
② sum.js (テスト対象のコード)
function sum(a, b) {
return a + b;
}
module.exports = sum;
③ sum.test.js (テストコード)
const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
これら3つのファイルを main ブランチにコミットしておきます。
2. ワークフローファイルの作成
リポジトリの「Actions」タブをクリックし、「New workflow」を選択します。
「Node.js」や「Python」など、言語に合わせたテンプレートが表示されますが、今回は「set up a workflow yourself」を選んで、一から書いてみます。
3. YAMLの記述
以下のコードをコピーして貼り付け、test.yml という名前で保存(コミット)してください。
name: Run Tests
# いつ実行するか:mainへのPush時と、PR作成時
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
# どのOSで動かすか(通常はubuntu-latestでOK)
runs-on: ubuntu-latest
steps:
# 1. リポジトリのコードをチェックアウト(持ってくる)
- uses: actions/checkout@v4
# 2. Node.jsのセットアップ
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
# 3. 依存ライブラリのインストール
- name: Install dependencies
run: npm install
# 4. テストの実行
- name: Run test
run: npm test
4. 動作確認
わざとテストが失敗するようにコードを修正(例:sum.js を return a + b + 1; に変更)し、PRを出してみてください。
PRの画面下部に「All checks have failed」と赤く表示され、詳細を見るとどのテストが落ちたか分かります。
ここで、前回(No.7)紹介した 「ブランチ保護ルール」 が活きてきます。
「Require status checks to pass」を有効にしておけば、テストが失敗しているPRはマージボタンが押せなくなります。
これにより、「うっかりバグのあるコードをマージしてしまった」という事故をシステム的に防ぐことができるのです。
5. マーケットプレイスの活用
YAMLファイルに出てきた uses: actions/checkout@v4 とは何でしょうか?
これは、世界中の開発者が作ってくれた「便利な機能のパッケージ」です。
GitHub Marketplaceには、数千種類のActionsが公開されています。
- AWS / Azure / Google Cloudへのデプロイ
- Slackへの通知
- Dockerイメージのビルド
これらを組み合わせることで、複雑な処理もパズルのように組み立てられます。
「やりたいこと + GitHub Actions」で検索すれば、たいていのソリューションが見つかります。
6. デプロイの自動化(CD)とシークレット管理
テスト(CI)ができたら、次はデプロイ(CD)です。
デプロイの設定は、テストとは別のファイル(例:deploy.yml)に分けると管理しやすくなります。
トリガーで制御する
デプロイは「PRの作成時」には実行したくありません。「mainブランチにマージされた(Pushされた)時」だけ 実行したいですよね。
その場合、on の書き方を以下のように指定するだけで制御できます。
name: Deploy to Production
# トリガー:mainブランチへのPush時のみ実行
on:
push:
branches: [ "main" ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy
run: ./deploy.sh
env:
# 秘密鍵などはコードに直接書かず、Secretsから読み込む
API_KEY: ${{ secrets.PROD_API_KEY }}
これで、PR作成時にはこのワークフローは無視され、マージされた時だけデプロイが走るようになります。
【重要】パスワードや鍵の管理(Secrets)
上記のコードにある ${{ secrets.PROD_API_KEY }} とは何でしょうか?
APIキーやパスワードをコード(YAMLファイル)に直接書くと、誰でも見ることができてしまい危険です。
GitHubには、これらを安全に保管する「Secrets(シークレット)」という機能があります。
- リポジトリの Settings を開く
- 左メニューの Secrets and variables > Actions をクリック
- New repository secret ボタンをクリック
- Nameに
PROD_API_KEY、Secretに実際のキーを入力して保存
こうして保存した情報は暗号化され、GitHub Actionsの実行中だけ安全に取り出すことができます。
まとめ
今回は、GitHub Actionsを使った自動化について解説しました。
- CI/CD: テストとデプロイを自動化し、人間は開発に集中する
-
YAML設定:
.github/workflowsに置くだけで動き出す - 品質保証: ブランチ保護ルールと組み合わせ、バグの混入を物理的に防ぐ
- Secrets: パスワードなどの機密情報は、専用の管理機能を使って安全に扱う
自動化によって開発のスピードと品質は担保されました。
しかし、コードの中に「脆弱性のあるライブラリ」が含まれていたらどうなるでしょうか?
次回は、GitHubが提供する強力なセキュリティ機能「Dependabot」と「Code Scanning」について解説します。




