結論:CI/CDとは「コミットしたら、その先の作業を機械が自動でやる」しくみです。CIが自動テスト、CDが自動デプロイ。GitHub Actions なら、リポジトリの .github/workflows/ にYAMLを1枚置くだけで始まります。覚える言葉は workflow / job / step / uses の4つだけです。
Git の add → commit → push は覚えた。では、その push のあとに何が起きると嬉しいのか。この記事は「コミットしたあとを自動化する仕組み」だけに絞って説明します。Git の操作そのものは Gitの使い方入門、GitとGitHubの違いは GitとGitHubの違い にまとめてあります。
CI/CD とは何か
- CI(継続的インテグレーション)=変更をこまめに統合し、そのたびに自動でテスト・ビルドして壊れていないか確かめること。
- CD(継続的デリバリー/デプロイ)=検証を通った変更を、自動で配布・公開すること。
要するに、これまで人間が手で回していた「テストを走らせる → ビルドする → サーバーに上げる」を、機械が毎回まったく同じ手順で実行してくれる状態です。
push / プルリクエスト
↓
CI:lint → test → build ← 失敗したら赤信号。ここで止める
↓ 成功
レビュー → マージ
↓
CD:本番へ自動デプロイ
得られるものは3つです。早く気づける(壊れた変更をマージ前に検出)、手順が揃う(「私のPCでは動いた」がなくなる)、速く届く(小さな変更を何度でも安全に出せる)。考え方の全体像は CI/CD とは の回にまとまっています。用語の短い定義は CI/CD|Wiki用語集、周辺の文化としては DevOps|Wiki用語集 も参考に。
GitHub Actions の構造:覚える言葉は4つ
GitHub Actions は GitHub に標準で組み込まれた CI/CD の仕組みです。リポジトリに .github/workflows/ci.yml のようなYAMLファイルを置くと、それが「ワークフロー」として自動で動きます。
| 用語 | 意味 |
|---|---|
| workflow | 自動化のひとまとまり。YAMLファイル1つが1ワークフロー |
| job | ワークフローの中の仕事。既定では並行に走る |
| step | job の中の手順。上から順に1つずつ実行される |
| uses / run | step の中身。uses は公開部品を呼ぶ、run はシェルコマンドを実行する |
最小のワークフローはこれだけです。
name: CI # 表示名
on: [push] # いつ動かすか(push されたら)
jobs:
build: # job の名前(自由に付けられる)
runs-on: ubuntu-latest # どのOSの仮想マシンで動かすか
steps:
- uses: actions/checkout@<バージョン> # リポジトリのコードを取り出す
- run: echo "Hello, CI!" # シェルコマンドを1つ実行
uses: で呼ぶのは、GitHub 上に公開されている再利用可能な部品です(@ の後ろにバージョンを固定して指定します)。「コードを取り出す」「言語の実行環境を用意する」といった定番の作業は、自分で書かずに部品を呼ぶだけで済みます。階層と用語の詳細は GitHub Actions の構造 を参照してください。
実務のワークフローを読む:lint → test → build
現場でよく見る形は、だいたい次の順です。
- checkout:リポジトリのコードを仮想マシンに取り出す。
- セットアップ:言語の実行環境を用意する。
- 依存の取得:ライブラリをインストールする。
- lint:書式・規約のチェック。
- build:ビルドが通るか。
- test:自動テストを走らせる。
読み方の勘所は2つです。step は上から順で、どれか1つでも失敗(終了コードが0以外)した時点で job は失敗して止まること。そして on: の書き方でトリガーが決まること。pull_request を入れておけば、プルリクエストが作られた時点でチェックが走るので、壊れた変更がマージされる前に止められます。行ごとの意味は ワークフロー YAML を読む(lint → test → build) で1行ずつ解説しています。
「CIが通っていないプルリクエストはマージしない」というルールにすると、main ブランチは常に「テストが通った状態」に保たれます。これが CI/CD の一番のねらいです。プルリクエストの流れ自体が曖昧なら GitHub とプルリクエスト と チーム開発フローの全体像 を先に読んでください。
デプロイまで自動化する(CD)と secrets
テストが通ったら公開です。ここで新しく出てくるのが次の3つです。
needs::ジョブの依存関係。既定では job は並行に走りますが、needs: buildと書けば「build が成功してから deploy」の順番を作れます。ビルドが失敗すればデプロイはそもそも動きません。- environment:デプロイ先を「環境」として扱う指定。「本番へのデプロイは承認が必要」といった保護ルールを付けられます。
- secrets:APIトークンやパスワードをYAMLに直接書かないための仕組み。GitHubのリポジトリ設定に登録し、
${{ secrets.名前 }}で参照します。ログにも値は出ません。
秘密情報の扱いは、初心者がいちばんやりがちな事故(トークンをそのままコミットして公開)に直結する部分です。実例つきの解説は デプロイまで(build → deploy) にあります。デプロイという言葉自体の整理は デプロイ|Wiki用語集 を参照。
自動化には「自動で確かめられるもの」が要る
CIは魔法ではありません。CIがやってくれるのは、あなたが書いたチェックを毎回実行することだけです。テストコードが1本もないリポジトリでCIを組んでも、「ビルドが通った」以上のことは分かりません。
だから順序としては、まず自動テストを書けるようになってからCIを組むのが正解です。テストの書き方は 単体テストとは?テストコードの書き方 にまとめました。C#やJavaなら C# MVVMコース や Java MVVMコース で、赤→緑のリズムをブラウザ上で実行しながら覚えられます(無料・登録不要・環境構築なし)。
YAMLとコンテナに慣れておくと早い
CI/CD の設定ファイルはほぼすべてYAMLです。インデントで階層を表す形式なので、空白のズレがそのままエラーになるのが最初の壁になります。YAMLを手を動かして読み書きするなら、composeファイルとは ― 複数サービスを1枚で定義する がおすすめです。ブラウザ上のシミュレータでそのまま試せます。
もう1つ、CIの実行環境はたいていコンテナです。「どこでも同じ環境で動く」という発想を先に理解しておくと、runs-on や環境セットアップの意味がすんなり入ります。Dockerfileとは ― イメージの設計図 と Dockerコース をのぞいてみてください。設定をコードで管理する考え方は IaC|Wiki用語集 にもつながります。
つまずきやすいところ
- ローカルでは通るのにCIで落ちる:たいていは環境差です。依存のインストール手順が抜けている、OSが違う、環境変数がない。CIのログを上から読み、どのstepで止まったかを特定するのが先決です。
- YAMLのインデント崩れ:タブは使わず半角スペースで揃える。階層が1つズレただけで、まったく別の意味になります。
- 秘密情報の直書き:トークンをYAMLに書いてしまうと、リポジトリを見た全員に見えます。必ず secrets を使う。
- CIが遅くて誰も待たなくなる:重いテストを全部毎回走らせると形骸化します。速いチェックを先に置き、失敗を早く返す。
- 赤いまま放置する:CIが常に赤い状態は、CIが無いのと同じです。壊れたら最優先で直す文化とセットで初めて機能します。
学ぶ順序(おすすめ)
- Gitの基本操作 をブラウザ上のシミュレータで手を動かして覚える。
- git push ― リモートへ送る でリモートとのやり取りを理解する。
- チーム開発フローの全体像 でブランチとプルリクエストの流れをつかむ。
- CI/CD とは → GitHub Actions の構造 → ワークフローYAMLを読む → デプロイまで と順に読む。
- Git のまとめ ― Git から CI/CD への道 で全体を復習する。
Become-Coder の Gitコース は全29回。前半のGit操作はブラウザ上のシミュレータで実際にコマンドを打って練習でき、CI/CDを扱う終盤は読み物として設定ファイルの読み方を学ぶ構成です。日本語・無料・インストール不要です。
次に読む
- Gitコース(全29回) ― Gitの基本からCI/CDまで。
- 単体テストとは?テストコードの書き方 ― CIに走らせる「中身」を用意する。
- Docker入門 / Dockerコース ― 実行環境を揃える。
- Claude Code とは?AIにコードを書かせる使い方 ― 自動化つながりで、AIエージェントの使い方。
- インフラエンジニアのロードマップ ― CI/CDの先にある仕事。
- プルリクエスト|Wiki用語集 / GitHub|Wiki用語集