---
title: "GitLab CI/CDとは：.gitlab-ci.ymlの書き方とrules・needs・変数の設定例【2026年11月】"
url: "https://www.issoh.co.jp/tech/details/19661/"
published: 2026-11-12
updated: 2026-11-12
categories: ["開発"]
publisher: "株式会社一創"
---

# GitLab CI/CDとは：.gitlab-ci.ymlの書き方とrules・needs・変数の設定例【2026年11月】

GitLab CI/CDとは、リポジトリ直下に置いた`.gitlab-ci.yml`にステージとジョブを書き、コミットやマージリクエストをきっかけにビルド・テスト・デプロイを自動で実行するGitLab標準の仕組みです。本記事では、パイプラインとRunnerの関係を押さえたうえで、build・test・deployの3ステージを組む設定例、rulesとworkflowでの実行条件、needsでの並列化、cacheとartifactsの使い分け、マスク変数、CI/CDコンポーネントの取り込み方までを、公式ドキュメントの該当箇所へのリンクつきで解説します。仕様と料金は2026年11月12日時点の公式情報です。

## まとめ：GitLab CI/CDは.gitlab-ci.yml1枚でパイプラインを定義する仕組み

GitLab CI/CDは、GitLabに標準で入っているCI/CD機能です。別のサービスと連携しなくても、`.gitlab-ci.yml`をpushした時点でパイプラインが作られ、GitLab Runnerがジョブを実行します。

書き方で押さえるべき設定は、次の4つです。共通設定は`default`にまとめ、実行条件は`only`・`except`ではなく`rules`で書きます。ブランチとマージリクエストで同じパイプラインが2本走らないよう`workflow:rules`を入れ、待ち時間が気になったら`needs`でステージ待ちを飛ばします。

GitLab.comのFreeプランで使えるのは月400分までです。GitLabでコードを管理しているなら第一候補にしてよく、GitHub中心の組織で分数の上限に毎月当たる場合は別の選択肢と比べます。

## GitLab CI/CDとは：パイプライン・ステージ・ジョブ・Runnerの関係

### パイプラインはstagesで順番を、jobsで作業内容を決める構造

[GitLab CI/CDの入門ドキュメント](https://docs.gitlab.com/ci/)は、パイプラインを「ステージとジョブでできている」と説明しています。ステージは実行の順番、ジョブは各ステージで行う作業です。典型的なステージはbuild・test・deployの3つで、同じステージのジョブは並列に、ステージ同士は前から順に実行されます。

1つのジョブが失敗すると、既定では後ろのステージへ進みません。テストが落ちたコミットがデプロイされないのは、この順番の仕組みによるものです。CI/CDという考え方そのもの、継続的インテグレーションとデリバリーの違いは[CI/CDの仕組みとパイプライン構成](https://www.issoh.co.jp/column/details/13002/)で整理しています。

### .gitlab-ci.ymlをpushするとRunnerがジョブを受け取り実行する流れ

パイプラインが作られるきっかけは、ブランチへのpush、マージリクエストの作成・更新、スケジュール、画面からの手動実行などです。GitLab本体は作ったジョブを待ち行列に入れるだけで、実際にコマンドを動かすのはGitLab Runnerという別のアプリケーションです。

GitLab.comではLinux・Windows・macOS向けのRunnerをGitLabが用意しているので、`.gitlab-ci.yml`を置くだけで動きます。社内ネットワークのDBへ届かせたい、GPUが要るといった理由で自前のRunnerを立てる手順とexecutorの選び方は[GitLab Runnerのexecutorの選び方と登録手順](https://www.issoh.co.jp/tech/details/19633/)にまとめました。

### GitLab.comの無料枠はFree月400分、Premiumは月1万分の計算分数

GitLab.comのホステッドRunnerの利用は計算分数で数えます。[GitLabの料金ページ](https://about.gitlab.com/pricing/)に載っている月間の上限は次のとおりです。

| プラン      | 月間の計算分数 | 料金（2026年11月時点）  |
| -------- | ------- | --------------- |
| Free     | 400分    | 無料              |
| Premium  | 10,000分 | 1ユーザー月29ドル（年払い） |
| Ultimate | 50,000分 | 個別見積もり          |

追加の分数は1,000分あたり10ドルで買えます。[計算分数のドキュメント](https://docs.gitlab.com/ci/pipelines/compute%5Fminutes/)によると、Linuxのsmallは実行時間がそのまま1倍、mediumは2倍で数えられます。10分のジョブをmediumで回すと20分の消費です。Freeで1回5分のパイプラインなら、月80回で上限に届きます。

## .gitlab-ci.ymlの3ステージ例：stages・default・cacheの設定

### build・test・deployの3段階の.gitlab-ci.yml全文と行別設定

Node.jsのWebアプリを例に、ビルド、テストとLintの並列実行、mainブランチだけのデプロイを1ファイルにまとめた設定です。キーワードの意味は[CI/CD YAML構文リファレンス](https://docs.gitlab.com/ci/yaml/)で確かめられます。

```
stages:
  - build
  - test
  - deploy

default:
  image: node:22
  before_script:
    - npm ci --cache .npm --prefer-offline
  cache:
    key:
      files:
        - package-lock.json
    paths:
      - .npm/

build-job:
  stage: build
  script:
    - npm run build
  artifacts:
    paths:
      - dist/
    expire_in: 1 week

unit-test:
  stage: test
  script:
    - npm test

lint:
  stage: test
  script:
    - npm run lint

deploy-staging:
  stage: deploy
  script:
    - ./scripts/deploy.sh staging
  environment: staging
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
```

`default`に書いたイメージとnpmの準備は、全ジョブに適用される共通設定です。`unit-test`と`lint`は同じtestステージなので同時に走り、両方が成功したときだけdeployステージへ進みます。`deploy-staging`は`rules`の条件により、既定ブランチへのpushのときだけパイプラインに入ります。

### stagesを省略したときの既定5ステージとstage未指定のジョブ

`stages`を書かなかった場合、既定のステージは`.pre`・`build`・`test`・`deploy`・`.post`の5つです。`stage`を書き忘れたジョブは`test`に入ります。

ビルドジョブで`stage: build`を書き忘れると、テストと同時に走ってしまいます。成果物がまだ無い状態でテストが始まり、ファイルが見つからずに失敗する典型例です。小さな設定でも`stages`を先頭に明示し、全ジョブに`stage`を書いておくと、読む側も順番を追えます。

### グローバルのimage指定は非推奨、共通設定はdefaultにまとめる

`image`や`before_script`をファイルの最上位に直接書く古い書き方は、[非推奨キーワードの一覧](https://docs.gitlab.com/ci/yaml/deprecated%5Fkeywords/)に載っています。代わりに`default`の下に書くのがいまの形式です。最上位に書けるのは`default`・`include`・`stages`・`variables`・`workflow`の5つに絞られます。

古い記事や社内の雛形をコピーした設定には、最上位の`image`や`cache`が残っていることがあります。今は動いても、将来のメジャー版で削除される可能性がある書き方なので、新しく書くファイルでは最初から`default`に寄せてください。

## rules・workflow・needsでジョブの実行条件と順番を制御する設定例

### rulesは上から順に評価、only・exceptは非推奨のキーワード

ジョブをいつパイプラインに入れるかは`rules`で決めます。[rulesのドキュメント](https://docs.gitlab.com/ci/jobs/job%5Frules/)のとおり、ルールはパイプライン作成時に上から順に評価され、最初に一致した行で扱いが決まります。どの行にも一致しなければ、そのジョブはパイプラインに入りません。

```
e2e-test:
  stage: test
  script:
    - npm run test:e2e
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        - src/**/*

deploy-production:
  stage: deploy
  script:
    - ./scripts/deploy.sh production
  environment: production
  rules:
    - if: $CI_COMMIT_TAG
      when: manual
```

1つ目はマージリクエストで`src`配下が変わったときだけE2Eテストを走らせる設定、2つ目はタグを打ったときだけ本番デプロイを手動ボタンとして出す設定です。タグからリリースを自動作成する設定は[GitLab Releaseの作り方](https://www.issoh.co.jp/tech/details/19665/)で解説しています。`when`を省いた場合の扱いは、`on_success`が既定です。`only`と`except`は非推奨になっており、公式は`rules`への置き換えを案内しています。環境ブランチごとにデプロイ先を変える組み方は[GitLab Flowの環境ブランチの組み方](https://www.issoh.co.jp/tech/details/19637/)が参考になります。

### ブランチとMRの二重パイプラインをworkflow:rulesで止める設定

ジョブの`rules`にpushとマージリクエストの両方の条件を並べると、マージリクエストを開いたブランチへのpushで、ブランチ用とMR用のパイプラインが2本同時に作られます。計算分数が2倍消えるうえ、結果も2つ並んで紛らわしくなります。

これを防ぐのが最上位の`workflow:rules`です。[workflowキーワードのドキュメント](https://docs.gitlab.com/ci/yaml/workflow/)にある切り替えの設定をそのまま先頭に置きます。

```
workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
      when: never
    - if: $CI_COMMIT_BRANCH
```

MRがあるブランチではMR用のパイプラインだけが走り、MRが無いブランチではブランチ用のパイプラインが走ります。注意したいのは、ブランチ名を表す`CI_COMMIT_BRANCH`がMR用のパイプラインでは空になる点です。MRのジョブでブランチ名が要るときは`CI_MERGE_REQUEST_SOURCE_BRANCH_NAME`を使います。

### needsでステージ待ちを飛ばす書き方と1ジョブ50件までの上限

ステージ単位の順番だと、フロントエンドのテストはバックエンドのビルドが終わるまで待たされます。`needs`で依存するジョブを名指しすれば、そのジョブが終わった時点で次へ進めます。

```
build-frontend:
  stage: build
  script:
    - npm run build --workspace frontend

build-backend:
  stage: build
  script:
    - go build ./...

test-frontend:
  stage: test
  needs: ["build-frontend"]
  script:
    - npm test --workspace frontend

test-backend:
  stage: test
  needs: ["build-backend"]
  script:
    - go test ./...
```

`needs`に並べられるジョブはGitLab.comで最大50件です。Self-Managedでは管理者がこの上限を変えられます。依存関係はパイプラインエディタの図でも確認できるので、ジョブが10本を超えたら図で見てから`needs`を足すと、意図しない待ちを見落としません。

## cache・artifacts・CI/CD変数の使い分けと秘密情報の安全な渡し方

### 依存パッケージはcache、ステージ間の成果物はartifactsに置く理由

どちらもファイルを次のジョブへ残す仕組みですが、[キャッシュのドキュメント](https://docs.gitlab.com/ci/caching/)は役割をはっきり分けています。

| 項目          | cache                   | artifacts     |
| ----------- | ----------------------- | ------------- |
| 入れるもの       | npmやpipで取得した依存パッケージ     | ビルド結果やテストレポート |
| 保存場所        | Runnerのホスト（分散キャッシュならS3） | GitLab本体      |
| 取得の確実さ      | 無いこともある前提で使う            | 後続ジョブへ確実に渡る   |
| 画面からのダウンロード | 不可                      | 可             |

ビルドした`dist/`をcacheで渡すと、別のRunnerに割り当てられたテストジョブからは見えないことがあります。後続が必ず使うものはartifactsに置いてください。`cache:key`を書かないと全ジョブが`default`という同じキーを共有するので、前の例のように`package-lock.json`をキーにすると依存が変わったときだけ作り直されます。

### APIトークンはマスク変数と保護変数で渡す、8文字以上の条件

デプロイ用のトークンやパスワードは`.gitlab-ci.yml`に書かず、プロジェクトの「Settings」→「CI/CD」→「Variables」で登録します。登録にはMaintainer以上の権限が要ります。[CI/CD変数のドキュメント](https://docs.gitlab.com/ci/variables/)にある設定の意味は次のとおりです。

- Protect variable：保護ブランチと保護タグで動くパイプラインだけに値を渡す
- Masked：ジョブログに値が出たとき伏せ字にする。1行でスペースを含まず、8文字以上の値に限る
- Masked and hidden：伏せ字に加え、保存後は画面でも値を再表示できなくする

本番用のトークンはProtectとMaskedの両方を付けます。Protectを付けないと、誰かが作業ブランチで`echo`を書き換えたジョブを流すだけで値に触れられるからです。公式もマスクは確実な防御ではないと注記しており、ログに出さない書き方と保護ブランチの運用を組み合わせて守ります。

### 定義済み変数CI\_COMMIT\_SHORT\_SHAでコンテナイメージにタグを付ける例

GitLabは、ブランチ名やコミットのハッシュなどを自動で変数に入れてジョブへ渡します。[定義済み変数の一覧](https://docs.gitlab.com/ci/variables/predefined%5Fvariables/)から、コンテナイメージのビルドでよく使うものを組み合わせた例です。

```
docker-build:
  stage: build
  image: docker:27
  services:
    - docker:27-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  script:
    - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
    - docker build -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" .
    - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
```

`CI_COMMIT_SHORT_SHA`はコミットハッシュの先頭8文字、`CI_REGISTRY_IMAGE`はプロジェクトのコンテナレジストリのアドレスです。タグにハッシュを使うと、本番で動いているイメージがどのコミットか追えます。Docker-in-Dockerは特権コンテナを使うため、自前Runnerで動かす場合は専用のRunnerに分けてください。作ったイメージの脆弱性検査は[Dockerの脆弱性診断をCI/CDに組み込む手順](https://www.issoh.co.jp/tech/details/3795/)で扱っています。

## .gitlab-ci.ymlの検証とCI/CDコンポーネントによる設定の再利用

### パイプラインエディタのValidateで構文誤りをpush前に見つける

インデントの1文字違いでもパイプラインは作られません。[パイプラインエディタのドキュメント](https://docs.gitlab.com/ci/pipeline%5Feditor/)のとおり、左サイドバーの「Build」→「Pipeline editor」で開くと、編集中の構文が自動で検証されます。

- Validateタブの「Validate pipeline」：pushした場合にどのジョブが作られるかを試算する
- Visualizeタブ：ステージとneedsの依存を図で表示する
- Full configurationタブ：includeやextendsを展開した最終形を表示する

rulesを書き換えたときはValidateで、includeで部品を取り込んだときはFull configurationで確かめるのが確実です。エディタからのコミットはそのままパイプラインを起動するので、試すだけなら作業ブランチで開いてください。

### include:componentでCI/CDカタログの部品を版指定で取り込む

複数のプロジェクトで同じジョブを書いているなら、CI/CDコンポーネントにまとめます。[CI/CDコンポーネントのドキュメント](https://docs.gitlab.com/ci/components/)は、コンポーネントを再利用できるパイプライン設定の単位と説明しており、CI/CDカタログで公開・検索できます。

```
include:
  - component: $CI_SERVER_FQDN/my-org/security-components/secret-detection@1.0.0
    inputs:
      stage: build
```

`@`の後ろは版の指定です。`~latest`も書けますが、公式は互換性のない変更まで取り込む可能性があると注記しています。本番のパイプラインでは`1.0.0`のように版を固定し、上げるときはMRで差分を確認する運用にしてください。GitLab Pagesで静的サイトを公開するジョブの書き方は[GitLab Pagesの.gitlab-ci.ymlでの公開手順](https://www.issoh.co.jp/tech/details/19639/)にあります。

## GitLab CI/CDを採用する条件と別のCIサービスを選ぶべき場面

### GitLabでコードを管理するチームはGitLab CI/CDが第一候補

リポジトリがGitLabにあるなら、CIもGitLab CI/CDに揃えるのが素直です。MRの画面にテスト結果が並び、保護ブランチと保護変数で本番デプロイの権限まで同じ画面で管理できます。外部のCIサービスと連携するためのトークン発行やWebhookの設定は要りません。

Self-Managedで社外に出せないコードを扱う場合も、Runnerを社内に置けば閉じた環境でCIが完結します。GitLab本体の提供形態とCE・EEの違いは[GitLabの構成要素と3つの提供形態](https://www.issoh.co.jp/tech/details/19631/)で確認できます。

### GitHub中心の組織や分数の上限超過が続く場合に見送る判断基準

次に当てはまるなら、GitLab CI/CDを新たに入れる前に他の選択肢と比べてください。

- コードの大半がGitHubにあり、GitLab CI/CDのためだけにミラーを作ろうとしている
- Freeの月400分を毎月使い切り、自前Runnerを保守する人手も無い
- 既存のJenkinsやGitHub Actionsのジョブが数百本あり、書き換えの工数が見積もれていない

1つ目は見送りです。GitHubのリポジトリならGitHub Actionsのほうが設定も権限管理も1か所で済み、書き方の対応は[GitHubとGitLabの違いとActionsとの対応表](https://www.issoh.co.jp/tech/details/4219/)で比べられます。2つ目は、Premiumの1万分か自前Runnerかを、[CI/CDツール比較の無料枠と料金](https://www.issoh.co.jp/tech/details/1834/)と並べて試算してから決めます。

3つ目のように移行の範囲が大きい場合や、パイプライン設計とRunnerの保守を社内で回せない場合は、一創の[DevOps・CI/CD導入支援](https://www.issoh.co.jp/service/system/devops/)のように、移行計画と基盤の構築を外部に任せる形も検討してください。

## よくある質問

GitLab CI/CDについて調べている方から多い質問に、2026年11月時点の公式情報をもとに回答します。

### GitLab CI/CDは無料で使えますか？

使えます。GitLab.comのFreeプランでも、ホステッドRunnerを月400分まで利用できます。上限を超えると、追加の分数を1,000分あたり10ドルで買うか、自前のRunnerを登録してジョブを回すかのどちらかです。自前Runnerの利用は計算分数の計測対象ではないため、マシン代だけで動かせます。Self-Managed版のGitLabでは、Runnerを自分で用意する前提で分数の上限はありません。

### .gitlab-ci.ymlはどこに置けばよいですか？

リポジトリのルートに`.gitlab-ci.yml`という名前で置きます。ファイル名の先頭のドットを落とすとGitLabに認識されません。別の場所や名前にしたい場合は、プロジェクトの「Settings」→「CI/CD」の「General pipelines」でCI/CD設定ファイルのパスを変更できます。ファイルが長くなったら`include`で複数のファイルに分割できます。

### GitLab CI/CDとGitHub Actionsの書き方は何が違いますか？

GitLabは1つの`.gitlab-ci.yml`にステージとジョブを並べ、GitHub Actionsは`.github/workflows/`の下にワークフローを複数置きます。実行条件はGitLabが`rules`、GitHubが`on`と`if`です。ジョブ間の依存はGitLabの`needs`とGitHubの`needs`が対応し、共通部品はGitLabのCI/CDコンポーネント、GitHubの再利用可能ワークフローやアクションが受け持ちます。

### パイプラインが作られず、ジョブが1つも表示されないのはなぜですか？

多いのは`rules`と`workflow:rules`の条件にどれも一致していないケースです。どのルールにも一致しないジョブはパイプラインに入らず、全ジョブが外れるとパイプライン自体が作られません。YAMLの構文誤りでも同じ症状になります。パイプラインエディタのValidateで、そのブランチでどのジョブが作られるかを試算して確かめてください。

### ジョブが「pending」のまま実行されないのはなぜですか？

ジョブを受け取れるRunnerがいない状態です。ジョブに`tags`を書いたのに同じタグのRunnerが無い、自前Runnerが停止している、GitLab.comで計算分数を使い切った、といった原因が考えられます。プロジェクトの「Settings」→「CI/CD」→「Runners」で、使えるRunnerとそのタグを確認してください。タグの付け方とRunnerの登録手順はRunnerの記事で解説しています。

## 関連記事

- [GitLabの使い方：プロジェクト作成からIssue・MR・CI/CDまでの手順【2026年10月】](https://www.issoh.co.jp/tech/details/18874/)：プロジェクト作成からMRでパイプラインを動かすまでの画面操作をたどれます
- [GitLab Runnerとは：executorの選び方と登録手順・config.tomlの設定例【2026年11月】](https://www.issoh.co.jp/tech/details/19633/)：ジョブを動かす自前Runnerの登録とconfig.tomlの設定を確認できます
- [GitHubとGitLabの違い｜ActionsとGitLab CIの対応表・料金・セルフホスト比較](https://www.issoh.co.jp/tech/details/4219/)：GitHub ActionsからGitLab CI/CDへ書き換えるときの対応表があります
- [CI/CDとは：仕組み・パイプライン構成・GitHub Actionsの設定例と導入判断の基準を解説](https://www.issoh.co.jp/column/details/13002/)：CI/CDの考え方と導入判断から整理したいときの入口です
- [CI/CDツール比較｜主要11製品の無料枠・料金と選び方【2026年10月】](https://www.issoh.co.jp/tech/details/1834/)：GitLab CI/CD以外のサービスと無料枠を比べられます

---

出典: [GitLab CI/CDとは：.gitlab-ci.ymlの書き方とrules・needs・変数の設定例【2026年11月】](<https://www.issoh.co.jp/tech/details/19661/>)（株式会社一創）
