Jenkins

最終更新: 2023-09-13 18:46:33 +0800 +0800
tags: Ci-Cd | Jenkins
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

Jenkins はジョブと Pipeline としてデリバリー作業を調整します。ビルドロジック、アプリケーションコード、ツールのバージョンは 同じレビュープロセスで変更すべきであるため、Pipeline はバージョン管理された Jenkinsfile に保存します。

コントローラー、エージェント、ワークスペース #

コントローラーは設定とビルド記録を保存し、スケジューリング判断を評価し、ユーザーインターフェースを提供し、エージェントを調整します。 ビルドをコントローラー上で実行してはいけません。エージェントは 1 つ以上の executor を提供し、 各 executor は一度に 1 つの Pipeline タスクを占有できます。ラベルは linux、arm64、docker などの能力を表し、Pipeline の agent 選択はワークスペースの割り当て先を制約します。

ワークスペースは変更可能なチェックアウトとビルド状態であり、アーティファクトリポジトリではありません。 並行ビルドには異なるワークスペースパスが割り当てられることがあり、エフェメラルなエージェントはステージ後に消える可能性があります。 出力は archiveArtifacts で公開し、小さなファイルは stash と unstash でステージ間転送し、 リリースアーティファクトは専用リポジトリへアップロードします。前回のビルドが残したファイルに依存してはいけません。

エージェントには、ラベルが要求するツール、ネットワークパス、資格情報だけを持たせます。 エフェメラルなエージェントはビルド間の汚染を減らしますが、再現可能なビルドには固定されたコンテナイメージ、 ツールチェーン、プラグイン、依存関係入力が依然として必要です。

Declarative Pipeline と Scripted Pipeline #

Declarative Pipeline は pipeline、agent、stages、steps、environment、options、post の周囲に 検証済みの構造を提供します。Scripted Pipeline は node やその他の Pipeline ステップ内で Groovy の制御フローを使います。 Declarative の script { ... } には命令的なセクションを含められますが、スクリプト領域が大きいと宣言的検証とステージ意味論が失われます。 再利用可能なポリシーはリポジトリ間で Groovy をコピーせず、バージョン管理された Shared Library に置きます。

groovy
pipeline {
  agent { label 'linux && container' }
  options {
    timeout(time: 20, unit: 'MINUTES')
    disableConcurrentBuilds()
  }
  stages {
    stage('Test') {
      steps {
        retry(2) {
          sh './mvnw --batch-mode verify'
        }
      }
      post {
        always { junit 'target/surefire-reports/*.xml' }
      }
    }
    stage('Package') {
      steps {
        sh './mvnw --batch-mode package -DskipTests'
        archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
      }
    }
  }
  post {
    always { deleteDir() }
  }
}

Pipeline ステップは実行状態を永続化するため、耐久タスクはコントローラー再起動後も継続できますが、 外部コマンドは再起動に安全でなければなりません。停止した処理には timeout で上限を設け、 retry はべき等だと分かっている操作にだけ使います。デプロイの再試行は副作用を重複させる可能性があります。 ブランチが同じワークスペースや外部リソースを変更しない場合、parallel はレイテンシーを削減します。 分離が必要なら別のワークスペースまたはエージェントを使います。

資格情報と最小権限 #

シークレットは Jenkins credentials に保存し、可能な限り小さいスコープでバインドします。

groovy
withCredentials([file(credentialsId: 'registry-token-file',
                      variable: 'REGISTRY_TOKEN_FILE')]) {
  sh 'registry-client --token-file "$REGISTRY_TOKEN_FILE"'
}

マスキングはログへの偶発的な開示を減らしますが、同じスコープで動く信頼できないビルドコードからシークレットを保護できません。 文字列シークレットの Groovy 補間は、マスキング前に値がプロセス引数や Jenkins 生成スクリプトへ入る可能性があるため避けます。 ファイル資格情報は一時的な保護ファイルを提供しますが、同じビルドコンテキストの信頼できないコードはそれを読めます。 フォルダーごとに credential ID を制限し、信頼できない pull request をデプロイジョブから分離し、 エージェントには 1 つの環境向けの短命資格情報を与えます。

Pipeline の運用 #

multibranch ジョブまたは信頼できる webhook を使い、実行を正確なコミットに関連付けます。 保持ポリシーに従ってテストレポートと不変アーティファクトを保存します。ステージが失敗してもクリーンアップと通知が行われるよう post アクションを設定します。 認証と認可でコントローラーを保護し、プラグイン更新をコントローラーコードとしてレビューし、 JENKINS_HOME をバックアップし、ビルドエージェントをコントローラーの信頼境界の外に置きます。

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)