ビルドおよびデプロイサービスは、オープンソースのCI(継続的インテグレーション)ツールである Jenkins を基盤として提供されます。
※ CI(継続的インテグレーション): 品質管理(Quality Control、エンティティの生産に関わるすべての品質要因を確認するプロセス)を適用するプロセスを実行します。
小さな単位の作業を頻繁に適用し、最終段階で品質管理を行う従来の方法を置き換えることで、ソフトウェアの品質向上とデプロイにかかる時間の短縮に重点を置くことができます。
サービスを利用するには、ZCPコンソールのサイドメニューから DevOps > ビルドおよびデプロイ をクリックします。
Jenkins のアカウントは ZCPコンソールのユーザーと統合されており、権限のある Namespace と同じ名前のフォルダーに対して権限が付与されます。
主な機能は以下の通りです。
ソースコードのチェックアウト(Subversion、Git、Perforce、Mercurial、CVS など)
- ビルド、テスト(Ant、Maven、MSBuild、シェルスクリプトなど)
- 結果の記録(バイナリ、テスト結果、コードカバレッジ、静的解析)
- 通知機能(メール、IM、RSS、IDE など)
Jenkins には様々な特徴があります。
- 多様なOSのサポート
- 簡単かつ迅速なインストール(WARファイルとしてWASにデプロイ、Javaコマンドでデーモンとして実行)
- 分散環境のサポート(Jenkins AgentをインストールしてJenkins Masterの負荷を軽減)
- プラグインによる機能拡張が可能
- 定期的なビルドの自動化
- ビルドした成果物の自動デプロイ
Jenkinsフォルダーでのクレデンシャル管理
Jenkins でビルドおよびデプロイを実行するには、基本的に2つのクレデンシャル情報が必要です。ソースをチェックアウトするための Gitリポジトリの接続アカウント情報、Docker イメージをプッシュするための レジストリ接続アカウント情報 です。
Jenkins では、アカウントの再利用や管理を容易にするために、クレデンシャル機能を提供しています。
クレデンシャルの作成
フォルダーの左側のメニューで Credentials をクリックします。
フォルダースコープ(デフォルト)の global リンクをクリックします。
左側の Add Credentials メニューをクリックします。
Username with password を選択し、ユーザー名、パスワード、ID を入力して OK ボタンをクリックします。
このとき、ID は ZCP のパイプラインで使用される予約語を使用するようにします。
- Git クレデンシャル ID : GIT_CREDENTIALS
- Docker クレデンシャル ID : HARBOR_CREDENTIALS
説明を入力すると、クレデンシャルの一覧で識別しやすくなります。
以下は2つのクレデンシャルを作成した例です。
このようにフォルダー内で作成したクレデンシャルは、そのフォルダー内のパイプラインでのみ使用できます。
パイプライン管理
Jenkins パイプラインは、アプリケーションのビルドおよびデプロイ作業の流れを定義します。
基本的な流れは ソースコードのチェックアウト - アプリケーションのビルド - Docker ビルド & プッシュ - Kubernetes デプロイ という順序です。
ZCP では、パイプラインを Jenkinsfile というファイルに Groovy で定義し、ソースコードに含めてバージョン管理を行います。
パイプラインの作成
フォルダーの左側のメニューで New Item をクリックします。
- Item name に Job 名 (Application 名) を入力します。
- Pipeline を選択します。
- OK ボタンをクリックします。
Pipeline タブで以下のように設定します。
- Definition を Pipeline script from SCM に選択します。
- SCM の種類を GIT に選択します。
- Repositories の Repository URL に GIT Clone URL を入力します。
- Credentials に先ほど作成した Git Credentials を選択します。
- Branches to build にデプロイするソースコードの Git ブランチを入力します。
- Repository browser に gogs を選択します。ZCP で提供される Git 以外の Git を使用する場合は、該当する Git サービスを選択します。
- Script Path に Jenkinsfile を入力します。
- OK ボタンをクリックします。
以下の Pipeline コードをコピーし、アプリケーションソースのルートに Jenkinsfile として保存します。
サンプルとして提供される Pipeline は Maven プロジェクトをビルド/デプロイする例です。
この Pipeline を正常に実行するには、以下のファイルを事前に準備する必要があります。
ビルドおよびデプロイ関連ファイル
- Dockerfile : Docker build に使用されます。アプリケーションの種類によって異なるため、このページ を参考に作成してください。作成した Dockerfile はアプリケーションのルートに "Dockerfile" というファイル名で保存します。
- deploy.yaml : Kubernetes にアプリケーションをデプロイするために使用します。このページ を参考に作成してください。deploy.yaml ファイルはアプリケーションルートの下に "k8s" というフォルダを作成し、その中に保存します。
- service.yaml : Kubernetes にデプロイしたアプリケーションを外部に公開するために使用します。このページ を参考に作成してください。作成した service.yaml ファイルはアプリケーションルートの "k8s" フォルダ内に保存します。
@Library('retort-lib') _ def label = "jenkins-${UUID.randomUUID().toString()}"; def ZCP_USERID='zcpsample'; def DOCKER_IMAGE='zcpsample/sam-springboot'; def K8S_NAMESPACE='default'; timestamps { podTemplate(label:label, serviceAccount: "zcp-system-sa-${ZCP_USERID}", containers: [ containerTemplate(name: 'maven', image: 'maven:3.5.2-jdk-8-alpine', ttyEnabled: true, command: 'cat'), containerTemplate(name: 'docker', image: 'docker:17-dind', ttyEnabled: true, command: 'dockerd-entrypoint.sh', privileged: true), containerTemplate(name: 'kubectl', image: 'lachlanevenson/k8s-kubectl:v1.13.6', ttyEnabled: true, command: 'cat') ], volumes: [ persistentVolumeClaim(mountPath: '/root/.m2', claimName: 'zcp-jenkins-mvn-repo') ]) { node(label) { stage('SOURCE CHECKOUT') { def repo = checkout scm; } stage('BUILD') { container('maven') { mavenBuild goal: 'clean package', systemProperties:['maven.repo.local':"/root/.m2/${JOB_NAME}"]; } } stage('BUILD DOCKER IMAGE') { container('docker') { dockerCmd.build tag: "${HARBOR_REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER}"; dockerCmd.push registry: HARBOR_REGISTRY, imageName: DOCKER_IMAGE, imageVersion: BUILD_NUMBER, credentialsId: "HARBOR_CREDENTIALS"; } } stage('DEPLOY') { container('kubectl') { kubeCmd.apply file: 'k8s/service.yaml', namespace: K8S_NAMESPACE; yaml.update file: 'k8s/deploy.yaml', update: ['.spec.template.spec.containers[0].image': "${HARBOR_REGISTRY}/${DOCKER_IMAGE}:${BUILD_NUMBER}"]; kubeCmd.apply file: 'k8s/deploy.yaml', wait: 300, recoverOnFail: false, namespace: K8S_NAMESPACE; } } } } }
作成した Jenkinsfile の以下の内容を修正し、保存します。
修正する箇所
- 4 行目 ZCP_USERID : デプロイ担当者の ZCP Console ID を入力します。
- 5 行目 DOCKER_IMAGE : 作成する Docker イメージ名を入力します。
Pipeline で Docker イメージを push する際に使用する Docker Registry は、デフォルトで ZCP Add-on サービスとして提供される HARBOR に設定されています。このアドレスは HARBOR_REGISTRY というキーで使用でき、Jenkins の Global Properties に保存されているため、Cluster-admin のみが変更できます。
Pipeline 実行
作成した Pipeline 画面の左側メニューから Build Now をクリックします。
Pipeline の実行は Namespace の admin および cicd-manager 権限を持つユーザーのみ可能です。
現在の画面で実行中の状態を確認できます。
左側の Build History で現在実行中のビルドの Console Output をクリックすると、Pipeline の実行ログを確認できます。
オンライン相談
問い合わせ