パイプラインの基本
パイプラインの仕組み
Pipeline最上位コンテナ;コミット/トリガーごとに1つ
Stage並列実行されるジョブのグループ
Jobステージ内の単一タスク(スクリプト)
Runnerジョブを実行するエージェント
パイプラインのトリガー
ブランチへのプッシュ自動(デフォルト)
マージリクエストworkflow:rules または only: merge_requests 経由
スケジュールプロジェクト設定の CI/CD → Schedules
APIPOST /projects/:id/trigger/pipeline
手動CI/CD メニューの Run Pipeline ボタン
.gitlab-ci.yml
最小構成
stages: [build, test, deploy] build-job: stage: build script: echo "Compiling..."
グローバルキーワード
stagesステージの順序を定義
defaultすべてのジョブのデフォルト値
variablesグローバルな CI/CD 変数
workflowパイプライン作成のタイミングを制御
include外部 YAML ファイルをインポート
テンプレートのインクルード
include: - template: Auto-DevOps.gitlab-ci.yml - local: .ci/lint.yml - project: 'group/shared-ci' file: '/templates/deploy.yml'
ジョブ
ジョブの定義
test-unit: stage: test image: node:20 script: - npm ci - npm test
ジョブキーワード
script実行するシェルコマンド(必須)
before_scriptメインスクリプト前のコマンド
after_script後のコマンド(失敗時でも実行)
imageジョブの Docker イメージ
rulesジョブ含有の条件
needsDAG 依存関係(ステージ順序をスキップ)
allow_failureジョブが失敗してもパイプラインを継続
retry自動リトライ回数(0〜2)
timeout最大ジョブ実行時間
Rules
deploy: rules: - if: '$CI_COMMIT_BRANCH == "main"' when: manual - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: never - when: on_success
ステージ
ステージの順序
stages: - lint - build - test - deploy
デフォルトステージ
.pre常に最初に実行
buildデフォルトステージ 1
testデフォルトステージ 2
deployデフォルトステージ 3
.post常に最後に実行
needs を使った DAG
test-api: stage: test needs: ["build-api"] # ステージ全体を待たずに実行 test-web: stage: test needs: ["build-web"] # build-web が完了次第実行
変数
変数の定義
variables: NODE_ENV: "production" DB_HOST: "postgres" job: variables: NODE_ENV: "test" # ジョブレベルの上書き
定義済み変数
CI_COMMIT_SHA完全なコミットハッシュ
CI_COMMIT_BRANCHブランチ名
CI_COMMIT_TAGタグ名(タグパイプラインの場合)
CI_PIPELINE_ID一意なパイプライン ID
CI_PROJECT_DIRリポジトリのチェックアウトパス
CI_MERGE_REQUEST_IIDMR 番号(MR パイプラインのみ)
CI_REGISTRY_IMAGEコンテナレジストリイメージパス
Protected と Masked
Protected保護されたブランチ/タグのみで利用可能
Maskedジョブログで非表示
File一時ファイルに書き込まれ、パスを変数に格納
アーティファクト
アーティファクトの保存
build: script: npm run build artifacts: paths: [dist/] expire_in: 1 week
アーティファクトの種類
paths保存するファイル/ディレクトリ
excludeスキップするパターン
expire_in一定期間後に自動削除
reports:junitMR テストサマリー用 JUnit XML
reports:coverage_reportCobertura カバレッジの可視化
JUnit レポート
test: script: pytest --junitxml=report.xml artifacts: reports: junit: report.xml
キャッシュ
依存関係のキャッシュ
test: cache: key: ${CI_COMMIT_REF_SLUG} paths: [node_modules/] script: npm ci && npm test
キャッシュ vs アーティファクト
Cacheジョブを高速化;保証なし;同一キーを再利用
Artifactsジョブ/ステージ間でファイルを渡す;保証あり
キャッシュポリシー
pull-pushダウンロード + アップロード(デフォルト)
pullダウンロードのみ(コンシューマーに高速)
pushアップロードのみ(プロデューサー用)
環境
環境の定義
deploy-staging: stage: deploy environment: name: staging url: https://staging.example.com script: ./deploy.sh staging
環境の機能
name環境名(UI に表示)
urlデプロイされたアプリへのリンク
on_stop環境停止時に実行するジョブ
auto_stop_in一定期間後に自動停止
action: stopジョブを停止アクションとしてマーク
レビューアプリ
review: environment: name: review/$CI_COMMIT_REF_SLUG url: https://$CI_COMMIT_REF_SLUG.example.com on_stop: stop-review auto_stop_in: 1 week
Docker
イメージのビルドとプッシュ
build-image: image: docker:24 services: [docker:24-dind] script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
サービス(サイドカーコンテナ)
test: image: python:3.12 services: - postgres:16 - redis:7 variables: POSTGRES_DB: testdb POSTGRES_PASSWORD: secret
Docker-in-Docker
docker:24-dindDinD サービスイメージ
DOCKER_TLS_CERTDIR'/certs' または '' に設定して TLS を設定
DOCKER_HOSTtcp://docker:2376(TLS)または :2375
よくあるパターン
モノレポ(changes)
test-api: rules: - changes: [api/**/*] test-web: rules: - changes: [web/**/*]
手動デプロイゲート
deploy-prod: stage: deploy when: manual rules: - if: '$CI_COMMIT_BRANCH == "main"'
並列マトリクス
test: parallel: matrix: - PYTHON: ["3.10", "3.11", "3.12"] DB: ["postgres", "sqlite"] script: tox -e py${PYTHON}-${DB}