Concourse CIでPivotal Web Serviceに自動デプロイする
layers Dev/CI/ConcourseCI
label
Pivotal Application Service
label
Cloud Foundry
label
Concourse CI
date_range
更新日時 : 2022/05/29 15:51 date_range
投稿日時 : 2020/03/22 05:54Blog APIのデプロイを手動からConcourse CI(Ver.5.0)で自動デプロイできるようにしたので、メモしておく。
できるようにしたのは下記の通りである。
- GitHubのmasterブランチにコードがpushされたら、テストを実行する
- テスト成功後、Pivotal Web Service(Cloud Foundry)にデプロイする
単体テストの実行
単体テストを実行するためには、
- GitHubのリポジトリからソースコードを取得する
- こちらはgitリソースをgetするだけなので、説明は割愛。最終的な設定ファイルを確認すれば良い。
- Mavenコマンドを実行する(コンテナイメージを取得する)
が必要となる。
注意点としては、ConcourseはCI実行時に毎回一からコンテナを作成するため、依存ライブラリを毎回ダウンロードすると、時間がかかる。そのため、キャッシュ処理を書いた方が良い。
Mavenコマンド実行タスク
jobs:
- name: unit-test
plan:
- get: blog-api-repo
trigger: true
- task: mvn-test
config: &MVN_TEST_CONFIG #よく使うconfigはアンカーを定義する
platform: linux
image_resource:
type: docker-image
source:
repository: maven
inputs:
- name: blog-api-repo
caches:
- path: blog-api-repo/m2 #cache設定
run:
path: bash
args:
- -c
- |
set -e
cd blog-api-repo
rm -rf ~/.m2
ln -fs $(pwd)/m2 ~/.m2
mvn install
デプロイ
Cloud Foundry(PaaS)にデプロイする手順を示す。ここではPivotal Application Serviceを利用する。前提として、アカウントは作成済みであること。
※Pivotal Application Serviceは最近リブランドされて、VMware Tanzu Application Serviceにリネームされたとのこと.
cf-resource
公式のリソースがあるので、それを活用する。
cf-resource
注意点としては、認証情報を記載する必要があるので、設定ファイルと認証情報ファイルを分けて、認証情報ファイルをコミットしないようにする。ただし、fly get pipeline
コマンドでパイプラインファイルを取得できてしまう。VaultやCredHubのような機密情報管理サービスを使う方法もあるが、今回は個人利用のため、採用していない。
最終的な設定ファイル
ブログサービス独自の設定(環境変数)を除いた、最終的な定義ファイル。cfのmanifestファイルは言及しなかったが、念の為残しておく。
※セキュアな情報などは{username}
などで記載している
pipeline.yml
resources:
- name: blog-api-repo
type: git
source:
uri: https://github.com/vagivagi/blog-api.git
username: ((git_username))
password: ((git_password))
- name: cf
type: cf
source:
api: ((cf_api))
username: ((cf_username))
password: ((cf_password))
organization: ((cf_org))
space: ((cf_space))
skip_cert_check: true
jobs:
- name: unit-test
plan:
- get: blog-api-repo
trigger: true
- task: mvn-test
config: &MVN_TEST_CONFIG
platform: linux
image_resource:
type: docker-image
source:
repository: maven
inputs:
- name: blog-api-repo
caches:
- path: blog-api-repo/m2
run:
path: bash
args:
- -c
- |
set -e
cd blog-api-repo
rm -rf ~/.m2
ln -fs $(pwd)/m2 ~/.m2
mvn install
- name: build-and-deploy
plan:
- get: blog-api-repo
passed:
- unit-test
trigger: true
- task: mvn-package
config:
platform: linux
image_resource:
type: docker-image
source:
repository: maven
inputs:
- name: blog-api-repo
caches:
- path: blog-api-repo/m2
outputs:
- name: build
run:
path: bash
args:
- -c
- |
set -e
cd blog-api-repo
rm -rf ~/.m2
ln -fs $(pwd)/m2 ~/.m2
mvn package -DskipTests=true
mv target/blog-api.jar ../build
- put: cf
params:
manifest: blog-api-repo/manifest.yml
path: build/blog-api.jar
credentials.yml
git_username: {username}
git_password: {password}
cf_api: https://api.run.pivotal.io #Pivotal Application Service
cf_username: {cf_username}
cf_password: {cf_password}
cf_org: {org_name}
cf_space: {space_name}
setup-pipeline.sh
#!/bin/sh
fly -t lite set-pipeline -p blog -c blog-pipeline.yml -l credentials.yml
manifest.yml
applications:
- name: blog-api
path: target/blog-api.jar
memory: 256M
instances: 1
routes:
- route: {application_path}
env:
SERVER_TOMCAT_MAX_THREADS: 4
JAVA_OPTS: '-XX:ReservedCodeCacheSize=32M -Xss512k -XX:+PrintCodeCache'
JBP_CONFIG_OPEN_JDK_JRE: '[memory_calculator: {stack_threads: 24}]'
services:
- blog-db