ブログ

【SAP BTP/BAS】超お手軽!CFコマンドとシェルスクリプトで自動デプロイを構築

この記事をSNSでシェア!

はじめに

長期化の開発プロジェクトを進行する中で、開発環境、検証環境、ST環境、UAT環境、e.t.c.、環境が増えていくことがあると思います。

SAP BTPではcf loginコマンドで簡単にログイン環境を切り分けられるのですが、環境ごとに異なるブランチをデプロイするように運用していて、対応するブランチと環境を間違えてビルド〜デプロイを実行してしまった場合に、取り返しのつかないことになってしまう恐れがあります。

ビルド、デプロイ時の人為的ミス(e.g.寝ぼけてブランチ/デプロイ環境間違えてた…)が怖くて毎回プレッシャーがかかる、休んだ日に別メンバーに対応してもらいたいけど、数ある手順を正確に共有できているか不安、などの問題をシェルスクリプトで解消していこうと思います。

今回は、チェクアウトしているローカルブランチ名からcfコマンドでログインする環境を切り分けて、BTP環境へのビルド〜デプロイを一括で実行してくれるシェルスクリプトを構築してみました。

事前準備

Business Application Studio(BAS)が利用可能であること

シェルスクリプトなので、ローカルからcfコマンドなど、必要なコマンドが使えたらどこからでも実行できますが、BASを前提に解説をします。

BASはコマンドがあらかじめインストールされていて便利ですね。ローカルだと、cf, mbt, jqなどをインストールしていく必要があります。

GitブランチをBASに作成

詳しくはBASの公式ドキュメントなどをご参照いただければと思いますが、「Full Stack Cloud Application」を選択して、「Create Dev Space」をクリックします。

Spaceの作成が完了したら、~/projects配下にgit cloneしておきます。

DefaultEnv CF CLI Pluginのインストール

不要な方もいるかもしれませんが、デプロイ後にdefault-env.jsonを取得して、VSCodeでローカル実行するための.envファイルを生成したいため、DefaultEnvのプラグインをゲットしておきます(後述しますが、これもデプロイ用のスクリプトに組み込んでしまってもよいかと思います)。

$ cf install-plugin DefaultEnv
シェルスクリプト用、envファイル待避用のディレクトリを作成

mkdirで~/projectsに以下のディレクトリを作成していきます。

deploy:デプロイ関連の親フォルダとして作成

deploy/envFolder:デプロイ後に出力するenvファイル等の退避用に作成

deploy/shell:実行するシェルスクリプトを配置

処理内容解説

環境はこれで準備できました。

以下が今回利用するシェルスクリプトです。

#!/bin/bash

# < VARIABLES >------ 
REPOSITORY_PATH=${HOME}/projects/hoge
USER_NAME='hogehoge_name'
PASSWORD='hogehoge_pass'
ORGANIZATION_1='hoge_org1'
ORGANIZATION_2='hoge_org2'
SPACE_1='hoge_space1'
SPACE_2='hoge_space2'
BRANCH_NAME_1='hoge_branch1'
BRANCH_NAME_2='hoge_branch2'

function exit_trap () {
    if [ $? != 0 ]; then
        echo "Command [$BASH_COMMAND] is failed"
        exit 1
    fi
}
trap exit_trap ERR

# < GET BRANCH NAME >------ 
cd ${REPOSITORY_PATH}
BRANCH_NAME=`git rev-parse --abbrev-ref HEAD`

# < CF LOGIN >------ 
if [ ${BRANCH_NAME} = ${BRANCH_NAME_1} ]; then
    cf login -a https://api.cf.jp10.hana.ondemand.com -u ${USER_NAME} -p ${PASSWORD} -o ${ORGANIZATION_1} -s ${SPACE_1}
    ENVIRONMENT_NAME='【1つ目の環境】'
elif [ ${BRANCH_NAME} = ${BRANCH_NAME_2} ]; then
    cf login -a https://api.cf.jp10.hana.ondemand.com -u ${USER_NAME} -p ${PASSWORD} -o ${ORGANIZATION_2} -s ${SPACE_2}
    ENVIRONMENT_NAME='【2つ目の環境】'
else
    echo "デプロイ対象ブランチではありません。処理を終了します。"
    exit 0
fi

# < BUILD & DEPLOY >----
echo ${ENVIRONMENT_NAME}"BTP開発環境へのデプロイを開始します。"

mbt build
echo ${ENVIRONMENT_NAME}"ビルドが完了しました。"

cf deploy ${REPOSITORY_PATH}/mta_archives/プロジェクト名_0.0.1.mtar

echo ${ENVIRONMENT_NAME}"デプロイが完了しました。コンテンツプロバイダを更新してください。"

# < GET & EXPORT ENV FILE >----
cd ${HOME}/projects/deploy/envFolder

cf default-envJAVA_PROJECT_NAME
/bin/echo -n "VCAP_SERVICES=" > .env
cat default-env.json | jq -c '.VCAP_SERVICES' >> .env

exit 0
ログインについて(L.22~36)

gitコマンドで現在チェックアウトしているブランチ名を取得して、デプロイ対象の切り分けをします。

例示しているスクリプトではデプロイ対象としていないブランチ、例えばfeatureブランチやその他、指定してないブランチ名だとエラーとして処理するようにしています。

ビルド~デプロイについて(L.38~46)

mbt buildを実行すると、${REPOSITORY_PATH}/mta_archives/【プロジェクト名】_0.0.1.mtarにデプロイ用のパッケージがエクスポートされます。

cf deployでデプロイ資材を指定し、そのままデプロイできてしまいます。

envファイルの出力について(L.48~53)

ここからは必要な方とそうでない方がいらっしゃるかと思いますが、デプロイ後に更新されたenvファイルを取得して指定のフォルダに格納しておきます。

BASは立ち上げると初期セッティングされているコマンド以外はリフレッシュされるようですのでcf install-plugin DefaultEnvは毎回実行する必要があります。

そのため、こちらの処理はシェルスクリプトの任意の箇所に組み込んでしまってもよいかと思います。

おわりに

今回はcfコマンドとシェルスクリプトを使ってデプロイを自動化する方法を解説しました。

この手の処理はあまり太らせすぎたり、引数を増やしすぎたりすると却って煩雑になってしまい本末転倒ですが、デプロイブランチを間違える、といったような人為的ミスを防ぐためにバランス良くプログラムにお任せしていきたいですね。

デプロイ結果をメールやSlackに送信したり、Slackのワークフローと組み合わせて承認のプロセスを可視化したり、いろいろカスタマイズしてご利用いただけるかと思います。

投稿者プロフィール

荒木 英伊知
荒木 英伊知ビジネスソリューション事業部 開発1
2019年入社。SAP BTPでのSide-By-Side開発に携わっています。猫を2匹飼っています(写真はたまに行く飲み屋の猫です)。
この記事をSNSでシェア!