Concourse CIでPivotal Web Serviceに自動デプロイする

Dev/CI/ConcourseCI
Pivotal Application Service
Cloud Foundry
Concourse CI

更新日時 : 2022/05/29 15:51
投稿日時 : 2020/03/22 05:54

Blog APIのデプロイを手動からConcourse CI(Ver.5.0)で自動デプロイできるようにしたので、メモしておく。
できるようにしたのは下記の通りである。

  1. GitHubのmasterブランチにコードがpushされたら、テストを実行する
  2. テスト成功後、Pivotal Web Service(Cloud Foundry)にデプロイする

単体テストの実行

単体テストを実行するためには、

  1. GitHubのリポジトリからソースコードを取得する
  • こちらはgitリソースをgetするだけなので、説明は割愛。最終的な設定ファイルを確認すれば良い。
  1. 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}などで記載している

cf-pipeline

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

参考リンク