mcpField
G
gitlab-ci-patterns

gitlab-ci-patterns

github.com/sickn33クラウド・DevOps48.7k284 回インストール1 日前に更新
リポジトリ

gitlab-ci-patterns について

テスト、ビルド、デプロイを自動化するチーム向けに、GitLab CI/CD のパイプラインパターンを提供する技能です。段階別パイプライン、Docker、複数環境へのデプロイ、Terraform、セキュリティスキャン、キャッシュ、動的子パイプラインの例を含みます。

主な機能

  1. 01複数段階のパイプライン雛形
  2. 02Docker ビルドとプッシュの例
  3. 03複数環境へのデプロイパターン
  4. 04Terraform パイプラインの例
  5. 05セキュリティスキャンとキャッシュ
  6. 06動的子パイプライン

活用シーン

  1. 01GitLab CI/CD の段階を構成
  2. 02Docker イメージのビルドと公開
  3. 03GitLab から Kubernetes へデプロイ
  4. 04スキャンと依存関係キャッシュの追加

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill gitlab-ci-patterns

インストール後、Claude Code で/gitlab-ci-patternsを入力して読み込まれたか確認します。

詳細

GitLab CI パターン

テスト、ビルド、デプロイを自動化するための、包括的な GitLab CI/CD パイプラインのパターンです。

このスキルを使用しない場合

  • タスクが GitLab CI パターンに関係しない場合
  • このスコープ外の別のドメインやツールが必要な場合

指示

  • 目標、制約、必要な入力を明確にします。
  • 関連するベストプラクティスを適用し、結果を検証します。
  • 実行可能な手順と検証方法を提示します。

目的

適切なステージ構成、キャッシュ、デプロイ戦略を備えた効率的な GitLab CI パイプラインを作成します。

このスキルを使用する場合

  • GitLab ベースの CI/CD を自動化する場合
  • マルチステージパイプラインを実装する場合
  • GitLab Runner を設定する場合
  • GitLab から Kubernetes にデプロイする場合
  • GitOps ワークフローを実装する場合

基本的なパイプライン構造

stages:
  - build
  - test
  - deploy

variables:
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: "/certs"

build:
  stage: build
  image: node:20
  script:
    - npm ci
    - npm run build
  artifacts:
    paths:
      - dist/
    expire_in: 1 hour
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - node_modules/

test:
  stage: test
  image: node:20
  script:
    - npm ci
    - npm run lint
    - npm test
  coverage: '/Lines\s*:\s*(\d+\.\d+)%/'
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage/cobertura-coverage.xml

deploy:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - kubectl apply -f k8s/
    - kubectl rollout status deployment/my-app
  only:
    - main
  environment:
    name: production
    url: https://app.example.com

Docker のビルドとプッシュ

build-docker:
  stage: build
  image: docker:24
  services:
    - docker:24-dind
  before_script:
    - printf '%s' "$CI_REGISTRY_PASSWORD" | docker login --username "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker build -t $CI_REGISTRY_IMAGE:latest .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    - docker push $CI_REGISTRY_IMAGE:latest
  only:
    - main
    - tags

マルチ環境へのデプロイ

.deploy_template: &deploy_template
  image: bitnami/kubectl:latest
  before_script:
    - kubectl config set-cluster k8s --server="$KUBE_URL" --certificate-authority="$KUBE_CA_FILE"
    - kubectl config set-credentials admin --token="$KUBE_TOKEN"
    - kubectl config set-context default --cluster=k8s --user=admin
    - kubectl config use-context default

deploy:staging:
  <<: *deploy_template
  stage: deploy
  script:
    - kubectl apply -f k8s/ -n staging
    - kubectl rollout status deployment/my-app -n staging
  environment:
    name: staging
    url: https://staging.example.com
  only:
    - develop

deploy:production:
  <<: *deploy_template
  stage: deploy
  script:
    - kubectl apply -f k8s/ -n production
    - kubectl rollout status deployment/my-app -n production
  environment:
    name: production
    url: https://app.example.com
  when: manual
  only:
    - main

Terraform パイプライン

stages:
  - validate
  - plan
  - apply

variables:
  TF_ROOT: ${CI_PROJECT_DIR}/terraform
  TF_VERSION: "1.6.0"

before_script:
  - cd ${TF_ROOT}
  - terraform --version

validate:
  stage: validate
  image: hashicorp/terraform:${TF_VERSION}
  script:
    - terraform init -backend=false
    - terraform validate
    - terraform fmt -check

plan:
  stage: plan
  image: hashicorp/terraform:${TF_VERSION}
  script:
    - terraform init
    - terraform plan -out=tfplan
  artifacts:
    paths:
      - ${TF_ROOT}/tfplan
    expire_in: 1 day

apply:
  stage: apply
  image: hashicorp/terraform:${TF_VERSION}
  script:
    - terraform init
    - terraform apply -auto-approve tfplan
  dependencies:
    - plan
  when: manual
  only:
    - main

セキュリティスキャン

include:
  - template: Security/SAST.gitlab-ci.yml
  - template: Security/Dependency-Scanning.gitlab-ci.yml
  - template: Security/Container-Scanning.gitlab-ci.yml

trivy-scan:
  stage: test
  image: aquasec/trivy:latest
  script:
    - trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  allow_failure: false

キャッシュ戦略

# Cache node_modules
build:
  cache:
    key: ${CI_COMMIT_REF_SLUG}
    paths:
      - node_modules/
    policy: pull-push

# Global cache
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - .cache/
    - vendor/

# Separate cache per job
job1:
  cache:
    key: job1-cache
    paths:
      - build/

job2:
  cache:
    key: job2-cache
    paths:
      - dist/

動的な子パイプライン

generate-pipeline:
  stage: build
  script:
    - python generate_pipeline.py > child-pipeline.yml
  artifacts:
    paths:
      - child-pipeline.yml

trigger-child:
  stage: deploy
  trigger:
    include:
      - artifact: child-pipeline.yml
        job: generate-pipeline
    strategy: depend

テンプレートの適用範囲

この例は、インラインのひな形です。検証済みのイメージダイジェストとインストール済みのコマンドバージョン、保護されたスコープ付き kubeconfig、保護された本番環境を使用してください。KUBE_CA_FILE は、検証済みの CI ファイル変数を指している必要があります。信頼できないマージリクエストからデプロイしたり、新しい認証情報を自動的に付与したりしないでください。インラインの例では、外部テンプレートは必要ありません。

ベストプラクティス

  1. 具体的なイメージタグを使用する(node:latest ではなく node:20)
  2. 依存関係を適切にキャッシュする
  3. ビルド成果物に artifacts を使用する
  4. 本番環境に手動の承認ゲートを導入する
  5. デプロイの追跡に environments を使用する
  6. マージリクエストパイプラインを有効にする
  7. 定期的なジョブにはパイプラインスケジュールを使用する
  8. セキュリティスキャンを実装する
  9. シークレットには CI/CD 変数を使用する
  10. パイプラインのパフォーマンスを監視する

関連スキル

  • github-actions-templates - GitHub Actions 用
  • deployment-pipeline-design - アーキテクチャ用
  • secrets-management - シークレットの取り扱い用

制限事項

  • タスクが上記のスコープに明確に合致する場合に限り、このスキルを使用してください。
  • 出力を、環境固有の検証、テスト、専門家によるレビューの代わりとして扱わないでください。
  • 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を中断して確認してください。

コメント