JS7®JobSchedulerは独SOS社(Software- und Organisations-Service GmbH)によって開発されている、ジョブ管理システムです。
OSSジョブ管理ツールの定番JobSchedulerをリニューアルし、従来より耐障害性、大規模環境対応を強化し、ミッションクリティカルな要求に対応しています。
詳細な情報については、以下をご覧下さい。
- ナレッジベース(英語) https://kb.sos-berlin.com/display/PKB/JS7
- 日本語紹介資料 https://www.ossl.co.jp/
- フォーラム https://groups.google.com/forum/?hl=ja#!forum/jobscheduler-ja
- Facebook https://www.facebook.com/Jobscheduler-Japan-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97-594469610565511/timeline/
- 日本JobSchedulerユーザーグループ https://sites.google.com/site/jobschedulerja/
- JIRA(英語) https://change.sos-berlin.com/secure/Dashboard.jspa
- User Forum(英語) http://sourceforge.net/projects/jobscheduler/forums/forum/486122
- SOS社ホームページ http://www.sos-berlin.com
本書では、前回記載した内容をREST APIを使用しての開発環境のJS7で作成したジョブ定義をGitHubにコミットして、本番環境のJS7にロールアウトする方法を記載します。
参考)
前回の記事のGit連携機能の基本と、JOCのWebUIからGit連携を使用する際は以下の記事をご参照ください。
参考)
REST APIの詳細は以下をご参照ください
参考)
また、サンプルとして、REST APIを使用した、ロールアウト自動化の手順を本書の 5.ロールアウトの自動化(サンプル) より記載します。
1.前提条件
前提条件は前回記事の「1.前提条件」をご参照ください。
※GitHubの基本設定(前回記事の5.GitHub リポジトリの作成/接続手順)まで完了し、ロールアウトするジョブ定義は作成済みであること
参考)
2.JS7インストール環境
インストール環境については、前回記事の「3.JS7インストール環境」をご参照ください、JS7のみ本書ではv.2.3.1を使用しておりますが、前回記事のv.2.3.0でも動作します。
●Jobschedulerサーバ(開発環境/本番環境ともに共通)
・JS7 2.3.1
参考)
3.開発環境のジョブ定義ファイルをGitHubへのコミット
開発環境のJobSchedulerサーバより、REST APIを使用してGitHubへの登録を行います。
※本手順は開発環境のJobSchedulerサーバより実行します。
本手順は、前回記事の「6.開発環境で作成した新規ジョブ定義ファイルをGitHubへのコミット」の作業となります。
参考)
(1)JOCへのログイン
REST APIを使用してJOCへのログインを行います。
JOCでは認証の際にヘッダにBase64にエンコードした文字列を渡す必要があります。
例)
ユーザ名:root
ユーザパスワード:root
上記の場合は、「root:root」Base64にエンコードした文字列の「cm9vdDpyb290」をヘッダに渡して認証を行います。
参考)
## <ユーザ名>:<ユーザパスワード>をBase64にエンコード
$ echo -n root:root | base64
cm9vdDpyb290
## JOCへのログイン
$ curl -k -s -S -X POST -i -m 15 -H "Authorization: Basic cm9vdDpyb290" -H "Accept: application/json" -H "Content-Type: application/json" http://localhost:4446/joc/api/authentication/login
※以下は見やすいように加工しております。
{
"account": "root",
"enableTouch": true,
"identityService": "JOC:JOC",
"message": "",
"role": "all",
"sessionTimeout": 1800000,
"accessToken": "d73oaC2w-DOwP-9I2o-RTSd2u4akJoXtVtG",
(中略)
"isPermitted": false
}
上記の"accessToken": "d73oaC2w-DOwP-9I2o-RTSd2u4akJoXtVtG"がこれ以降の処理に必要なトークンになり、APIを実行するたびに必要となるため、変数を設定します。
$ AUTH=d73oaC2w-DOwP-9I2o-RTSd2u4akJoXtVtG
$ echo $AUTH
d73oaC2w-DOwP-9I2o-RTSd2u4akJoXtVtG
(2)ローカルGitリポジトリの設定
JobSchedulerサーバより、ローカルのGitリポジトリの設定を行います。
Gitリポジトリの最上位ディレクトリは前回と同じ「/Accounting」とします。
※クローンで指定したフォルダは、存在しない場合は自動で作成されます。
$ curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" http://localhost:4446/joc/api/inventory/repository/git/clone -d '
{
"remoteUri": "git@github.com:Yoshitami-Y/js7.git", ## GitHubで作成したリポジトリのURLを指定
"folder": "/Accounting", ## ローカルGitリポジトリの最上位ディレクトリ「/Accounting」を指定
"category": "ROLLOUT"
}' -w %{http_code}
APIの実行の結果、以下のようにレスポンスが返ってき、ステータスコードが200で終了していることを確認します。
{
"command": "git clone git@github.com:Yoshitami-Y/js7.git",
"exitCode": 0,
"stdErr": "",
"stdOut": "Cloning into 'Accounting'...\n"
}
200
(3)ジョブ定義ファイルをローカルのGitリポジトリへ登録
JobSchedulerサーバより、ローカルのGitリポジトリに登録するジョブ定義ファイルを指定し、
ローカルのGitリポジトリ上にジョブ定義を作成します。
※本手順ではジョブ定義の「Accounting/HelloWorld/job/HelloWorldRunningLog」は作成済みとします。
$ curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" http://localhost:4446/joc/api/inventory/repository/store -d '
{
"controllerId": "controller", ## controllerIdを指定
"rollout": {
"draftConfigurations": [
{
"configuration": {
"path": "/Accounting/HelloWorld/job/HelloWorldRunningLog", ##ワークフローのパスを指定
"objectType": "WORKFLOW"
}
}
]
}
}' -w %{http_code}
APIの実行の結果、以下のようにレスポンスが返ってき、ステータスコードが200で終了していることを確認します。
{
"deliveryDate": "2022-06-01T11:51:27.713Z",
"ok": true,
"surveyDate": "2022-06-01T11:51:27.713Z"
}
200
(4)GitHubのリポジトリにコミット
JobSchedulerサーバより、ローカルリポジトリに登録した「/Accounting/HelloWorld/job/HelloWorldRunningLog」をGitHubのリポジトリにコミットします。
前回記載した、JOCのWebUIでの操作、JobSchedulerメニューからリポジトリ > ロールアウト > Git > プッシュ を行った場合は、「git add」、「git commit」、「git push」を同時に行われますが、APIを使用した場合は、それぞれ実行する必要があります。
まず、APIを使用し、「git add」を行います。
curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" http://localhost:4446/joc/api/inventory/repository/git/add -d '
{
"folder": "/Accounting", ## ローカルGitリポジトリの最上位ディレクトリ「/Accounting」を指定
"category": "ROLLOUT"
}' -w %{http_code}
APIの実行の結果、以下のようにレスポンスが返ってき、ステータスコードが200で終了していることを確認します。
{
"command": "git add .",
"exitCode": 0,
"stdErr": "",
"stdOut": ""
}
200
次に、APIを使用し、「git commit」を行います。
$ curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" http://localhost:4446/joc/api/inventory/repository/git/commit -d '
{
"folder": "/Accounting", ## ローカルGitリポジトリの最上位ディレクトリ「/Accounting」を指定
"category": "ROLLOUT",
"message": "Change workflow" ## コメントを記載
}' -w %{http_code}
APIの実行の結果、以下のようにレスポンスが返ってき、ステータスコードが200で終了していることを確認します。
{
"command": "git commit -m \"comittest11\"",
"exitCode": 0,
"stdErr": "",
"stdOut": "[main c15ab38] comittest11\n 1 file changed, 1 insertion(+), 1 deletion(-)\n"
}
200
最後に、APIを使用し、「git push」を行います。
$ curl -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" http://localhost:4446/joc/api/inventory/repository/git/push -d '
{
"folder": "/Accounting", ## ローカルGitリポジトリの最上位ディレクトリ「/Accounting」を指定
"category": "ROLLOUT"
}' -w %{http_code}
APIの実行の結果、以下のようにレスポンスが返ってき、ステータスコードが200で終了していることを確認します。
{
"command": "git push",
"exitCode": 0,
"stdErr": "To git@github.com:Yoshitami-Y/js7.git\n dcd366d..c15ab38 main -> main\n",
"stdOut": ""
}
200
4.本番環境へのジョブ定義のロールアウト
上記の手順で開発環境からGitHubへコミットしたジョブ定義ファイルを本番環境へロールアウトします。
※本手順は本番環境のJobSchedulerサーバより実行します。
本手順は、前回記事の「7-2.本番環境へのロールアウトの手順(開発/本番環境用のリポジトリを分けずに使用)」の作業となります。
参考)
(1)JOCへのログイン
REST APIを使用してJOCへのログインを行います。
手順は、上記の「2.開発環境で作成した新規ジョブ定義ファイルをGitHubへのコミット(1)JOCへのログイン」と同じのため割愛します。
(2)本番環境へGitリポジトリのクローン
JobSchedulerサーバより、ローカルのGitリポジトリの設定を行います。
Gitリポジトリの最上位ディレクトリは前回と同じ「/Accounting」とします。
$ curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" http://localhost:4446/joc/api/inventory/repository/git/clone -d '
{
"remoteUri": "git@github.com:Yoshitami-Y/js7.git", ## GitHubで作成したリポジトリのURLを指定
"folder": "/Accounting", ## ローカルGitリポジトリの最上位ディレクトリ「/Accounting」を指定
"category": "ROLLOUT"
}' -w %{http_code}
APIの実行の結果、以下のようにレスポンスが返ってき、ステータスコードが200で終了していることを確認します。
{
"command": "git clone git@github.com:Yoshitami-Y/js7.git",
"exitCode": 0,
"stdErr": "",
"stdOut": "Cloning into 'Accounting'...\n"
}
(3)本番環境へのジョブ定義の登録(更新)
JobSchedulerサーバより、最新のGitHubの情報をpullします。
$ curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" http://localhost:4446/joc/api/inventory/repository/git/pull -d '
{
"folder": "/Accounting", ## ローカルGitリポジトリの最上位ディレクトリ「/Accounting」を指定
"category": "ROLLOUT"
}' -w %{http_code}
APIの実行の結果、以下のようにレスポンスが返ってき、ステータスコードが200で終了していることを確認します。
{
"command": "git pull",
"exitCode": 0,
"stdErr": "",
"stdOut": "Already up-to-date.\n"
}
200
JobSchedulerサーバより、本番環境へ登録するジョブ定義ファイルを指定し、登録(更新)します。
$ curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" http://localhost:4446/joc/api/inventory/repository/update -d '
{
"configurations": [
{
"configuration": {
"path": "/Accounting", ## ローカルGitリポジトリの最上位ディレクトリ「/Accounting」を指定
"objectType": "FOLDER", ## FOLDERを指定することにより、「path」で指定したディレクトリ以下すべて更新
"recursive": true
}
}
],
"category": "ROLLOUT"
}' -w %{http_code}
APIの実行の結果、以下のようにレスポンスが返ってき、ステータスコードが200で終了していることを確認します。
{
"deliveryDate": "2022-06-02T00:56:36.997Z",
"ok": true,
"surveyDate": "2022-06-02T00:56:36.997Z"
}
200
(4)本番環境へのジョブ定義の配置
JobSchedulerサーバより、ロールアウトしたジョブ定義を配置します。
$ curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" http://localhost:4446/joc/api/inventory/deployment/deploy -d '
{
"controllerIds": [
"controller"
],
"store": {
"draftConfigurations": [
{
"configuration": {
"path": "/Accounting",
"objectType": "FOLDER",
"recursive": true
}
}
]
}
}' -w %{http_code}
APIの実行の結果、以下のようにレスポンスが返ってき、ステータスコードが200で終了していることを確認します。
{
"deliveryDate": "2022-06-02T01:00:34.657Z",
"ok": true,
"surveyDate": "2022-06-02T01:00:34.657Z"
}
200
ジョブ定義の配置後、ワークフローの画面にてロールアウトしたジョブ定義が配置されたことを確認できます。
5.ロールアウトの自動化(サンプル)
本手順より、上記で行ったREST APIを使用して開発環境からGitHubへの登録、本番環境へのロールアウトをシェルスクリプトを作成し、自動化させます。
また、自動化のワークフローや、スクリプトはあくまでサンプルとなるため、実業務では使用しないで下さい。
概要)
- GitHubへのコミットは、開発環境で作成(更新)したワークフローで、配置済みのものをコミットする
- 開発環境で作成(更新)したワークフローで、未配置のものはコミットしない
- 開発環境のジョブは定期実行で、毎日23時に実行する
- 本番環境のジョブは手動で実行する
また、sos社のナレッジには、PowerShellを使用したスクリプトが用意されております。
参考)
6.開発環境の設定
開発環境のJobSchedulerサーバより、GitHubへコミットを行うスクリプト、ワークフローを作成します。
(1)スクリプトの作成
GitHubへコミットを行うスクリプトを作成し、オーナグループ/権限を修正します。
※本手順は開発環境のJobSchedulerサーバより実行します。
パス:/usr/local/sbin
設定ファイル:git_update.sh
オーナグループ:scheduler.scheduler
※オーナグループは、JS7インストールユーザを指定
パーミッション:755
$ cd /usr/local/sbin
$ vim git_update.sh
$ chown scheduler. git_update.sh
$ chmod +x git_update.sh
git_update.shの中身は以下になります。
※以下のスクリプトはあくまでサンプルとなるため参考程度でお願いします。
#!/bin/bash
## JOCログイン情報
JOC="http://localhost:4446"
JOCUSER=root
JOCPASS=root
BASIC=`echo -n "${JOCUSER}:${JOCPASS}" | base64`
## JS7インストールユーザ
JS7_USER=scheduler
## コントローラID
CONTROLLER_ID="controller"
## PostgreSQL情報
PSQLHOST=localhost
PGUSER=postgres
PGPASS=postgres
DBNAME=scheduler
## ローカルGitリポジトリの最上位ディレクトリ
LOCALGITDIR=/Accounting
## ロールアウトディレクトリ
ROLLOUTDIR=/opt/sos-berlin.com/js7/joc/jetty_base/resources/joc/repositories/rollout
DATE=`date "+%y%m%d%H%M%S"`
BKDIR=/var/tmp/js7tmp_${DATE}
mkdir -p ${BKDIR}
chown -R ${JS7_USER}. ${BKDIR}
## JOCへのログイン
AUTH=`curl -k -s -S -X POST -i -m 15 -H "Authorization: Basic ${BASIC}" \
-H "Accept: application/json" -H "Content-Type: application/json" \
${JOC}/joc/api/authentication/login | grep -Po '"accessToken":.*?[^\\\]"' | awk -F ':' '{print $2}' | tr -d \"`
if [ "$?" != '0' ]
then
echo "ERROR : Unable to access the JOC"
exit 1
fi
## inv_configurationsテーブルより、ジョブ定義ファイルの情報を取得
JOBIDLIST=`psql -h ${PSQLHOST} -U ${PGUSER} ${DBNAME} -t -A -F, -c "SELECT \"ID\",\"TYPE\",\"PATH\",\"NAME\",\"DEPLOYED\" FROM inv_configurations WHERE \"PATH\" LIKE '${LOCALGITDIR}/%' AND \"TYPE\" = 1;"`
## search_workflowsテーブルより、ワークフローの情報を取得
WORKFLOWLIST=`psql -h ${PSQLHOST} -U ${PGUSER} ${DBNAME} -t -A -F, -c "SELECT \"ID\",\"INV_CID\",\"DEPLOYED\" FROM search_workflows;"`
## デプロイ済みのワークフローの情報を取得
DEPWORKLIST=`psql -h ${PSQLHOST} -U ${PGUSER} ${DBNAME} -t -A -F, -c "SELECT \"SEARCH_WID\",\"INV_CID\" FROM search_workflows_dep_h;"`
for line in ${JOBIDLIST}
do
ID=`echo ${line} | cut -d ',' -f 1`
TYPE=`echo ${line} | cut -d ',' -f 2`
JOBPATH=`echo ${line} | cut -d ',' -f 3`
JOBNAME=`echo ${line} | cut -d ',' -f 4`
DEPLOYED=`echo ${line} | cut -d ',' -f 5`
## ジョブ定義のタイプが、ワークフローであり、デプロイ済みであることを確認
if [ "${TYPE}" == "1" -a "${DEPLOYED}" == '1' ]
then
for line2 in ${WORKFLOWLIST}
do
WID=`echo ${line2} | cut -d ',' -f 1`
INVCID=`echo ${line2} | cut -d ',' -f 2`
DEPLOY=`echo ${line2} | cut -d ',' -f 3`
## ワークフローがデプロイ済みのものを取得
if [ "${ID}" == "${INVCID}" -a "${DEPLOY}" == "1" ]
then
if [ -e ${ROLLOUTDIR}${JOBPATH}.workflow.json ]
then
mv ${ROLLOUTDIR}${JOBPATH}.workflow.json $BKDIR
LOCALREPO=`curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: ${AUTH}" ${JOC}/joc/api/inventory/repository/store -d '
{
"controllerId": "'"${CONTROLLER_ID}"'",
"rollout": {
"draftConfigurations": [
{
"configuration": {
"path": "'"${JOBPATH}"'",
"objectType": "WORKFLOW"
}
}
]
}
}' -o /dev/null -w %{http_code}`
if [ "${LOCALREPO}" == "200" ]
then
## 更新されたワークフローと、既存のワークフローを確認し、差分があれば更新
diff ${ROLLOUTDIR}${JOBPATH}.workflow.json $BKDIR/${JOBNAME}.workflow.json > /dev/null
if [ "${?}" == "1" ]
then
echo "Change workflow: ${JOBPATH}"
CHANG_GITLIST+="${JOBNAME} "
CHANGE_WORKFLOWLIST+="${ROLLOUTDIR}${JOBPATH}.workflow.json "
fi
else
echo "ERROR : Cannot save to local repository"
mv $BKDIR/${JOBNAME}.workflow.json ${ROLLOUTDIR}${JOBPATH}
fi
## ロールアウトディレクトリにワークフローが存在しない場合は、新規追加
else
LOCALREPO=`curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: ${AUTH}" ${JOC}/joc/api/inventory/repository/store -d '
{
"controllerId": "'"${CONTROLLER_ID}"'",
"rollout": {
"draftConfigurations": [
{
"configuration": {
"path": "'"${JOBPATH}"'",
"objectType": "WORKFLOW"
}
}
]
}
}' -o /dev/null -w %{http_code}`
if [ "${LOCALREPO}" == "200" ]
then
echo "Add workflow: ${JOBPATH}"
ADD_GITLIST+="${JOBNAME} "
ADD_WORKFLOWLIST+="${ROLLOUTDIR}${JOBPATH}.workflow.json "
else
echo "ERROR : Cannot save to local repository"
fi
fi
fi
done
fi
done
## ワークフローの更新、新規追加がある場合はGitにコミット
if [ -n "${CHANG_GITLIST}" -o "${ADD_GITLIST}" ]
then
COMMENT="$DATE "
if [ -n "${CHANG_GITLIST}" ]
then
COMMENT+="Change Workflow: ${CHANG_GITLIST} "
fi
if [ -n "${ADD_GITLIST}" ]
then
COMMENT+="Add Workflow: ${ADD_GITLIST}"
fi
echo $COMMENT
GITADD=`curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: ${AUTH}" ${JOC}/joc/api/inventory/repository/git/add -d '
{
"folder": "'"${LOCALGITDIR}"'",
"category": "ROLLOUT"
}' -o /dev/null -w %{http_code}`
if [ "${GITADD}" == "200" ]
then
GITCOMMIT=`curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: ${AUTH}" ${JOC}/joc/api/inventory/repository/git/commit -d '
{
"folder": "'"${LOCALGITDIR}"'",
"category": "ROLLOUT",
"message": "'"${COMMENT}"'"
}' -o /dev/null -w %{http_code}`
if [ "${GITCOMMIT}" == "200" ]
then
GITPUSH=`curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: ${AUTH}" ${JOC}/joc/api/inventory/repository/git/push -d '
{
"folder": "/Accounting",
"category": "ROLLOUT"
}' -o /dev/null -w %{http_code}`
if [ "${GITPUSH}" == "200" ]
then
echo "SUCCESS : Git update"
else
echo "ERROR : Git push command"
ERROR=1
fi
else
echo "ERROR : Git commit command"
ERROR=1
fi
else
echo "ERROR : Git add command"
ERROR=1
fi
else
echo No Git update
fi
## Gitの登録に失敗した場合は、ロールアウトディレクトリを元の状態に戻す
if [ "${ERROR}" == "1" ]
then
for change_list in ${CHANGE_WORKFLOWLIST}
do
WORKFLOW=`echo ${change_list}| sed -e "s/.*\///g"`
mv $BKDIR/${WORKFLOW} ${change_list}
done
for add_list in ${ADD_WORKFLOWLIST}
do
rm -f ${add_list}
done
fi
exit 0
#
(2)ワークフローの作成
開発環境のJOCのWebUIにrootアカウントでログインし、
http://<IPアドレス>:4446
ユーザ:root
パスワード:root
JobSchedulerメニューからジョブ定義 に移動し、ワークフローを作成します。
「/」を選択し、新規 > 新規フォルダー の順で移動し、「Git」を作成し、
作成したGitディレクトリ > コントローラ > ワークフロー の順で移動し、「新規ワークフロー」を選択し、オブジェクト名を入力し、登録します。
本書ではワークフローのディレクトリは、「Git」とし、ワークフローは、「GitUpdate」とします。
「GitUpdate」の必要な情報の名称、ラベル、エージェント、スクリプトを入力します。
名称:GitUpdate
ラベル:Git-update
タイトル:Git Update
エージェント:primaryAgent
※実行先のエージェントを選択
ジョブクラス:shell
スクリプト:サンプルとして以下を設定します。
#!/bin/bash
DIR=/usr/local/sbin
SHELL=git_update.sh
echo "Start Git Update Script"
sh ${DIR}/${SHELL}
if [ $? = 0 ]
then
echo "Success git update script"
else
echo "Faild git update script"
exit 1
fi
exit 0
設定後、ジョブ定義を配置します。
(2)ワークフローの定期実行設定
定期実行させるため、カレンダー/スケジュール/実行計画の作成を行う必要があります。
本手順では、カレンダー/スケジュール/実行計画の作成手順は割愛します。設定方法については以下をご参照ください。
参考)
本書では、毎日23時に実行するため、ランタイム設定で開始時刻を23:00:00に設定します。
作成した、ジョブ定義を配置し、開発環境の設定は完了となります。
7.本番環境の設定
本番環境のJobSchedulerサーバより、GitHubより、ジョブ定義のロールアウトを行うスクリプト、ワークフローを作成します。
※本作業は本番環境のJobSchedulerサーバにて実行します。
GitHubよりロールアウトを行うスクリプトを作成し、オーナグループ/権限を修正します。
パス:/usr/local/sbin
設定ファイル:rollout.sh
オーナグループ:scheduler.scheduler
※オーナグループは、JS7インストールユーザを指定
パーミッション:755
$ cd /usr/local/sbin
$ vim rollout.sh
$ chown scheduler. rollout.sh
$ chmod +x rollout.sh
rollout.shの中身は以下になります。
※以下のスクリプトはあくまでサンプルとなるため参考程度でお願いします。
#!/bin/bash
## JOCログイン情報
JOC="http://localhost:4446"
JOCUSER=root
JOCPASS=root
BASIC=`echo -n "${JOCUSER}:${JOCPASS}" | base64`
## GitHubリポジトリ情報
GITREPO=js7
## コントローラID
CONTROLLER_ID="controller"
## ローカルGitリポジトリの最上位ディレクトリ
LOCALGITDIR=/Accounting
## ロールアウトディレクトリ
ROLLOUTDIR=/opt/sos-berlin.com/js7/joc/jetty_base/resources/joc/repositories/rollout
## JOCへのログイン
AUTH=`curl -k -s -S -X POST -i -m 15 -H "Authorization: Basic ${BASIC}" \
-H "Accept: application/json" -H "Content-Type: application/json" \
${JOC}/joc/api/authentication/login | grep -Po '"accessToken":.*?[^\\\]"' | awk -F ':' '{print $2}' | tr -d \"`
if [ "$?" != '0' ]
then
echo "ERROR : Unable to access the JOC"
exit 1
fi
## ローカルGitリポジトリの確認(ローカルリポジトリがない場合はクローン)
if [ ! -e ${ROLLOUTDIR}${LOCALGITDIR}/.git ]
then
## Gitのクレデンシャル情報をJS7より取得
JS7_GITINFO=`curl -s -X POST -H "Content-Type: application/json" \
-H "X-Access-Token: $AUTH" ${JOC}/joc/api/inventory/repository/git/credentials -w %{http_code}`
STCODE=`echo ${JS7_GITINFO} | sed -e 's/.*}//g'`
JS7_GITINFO=`echo ${JS7_GITINFO} | sed -e 's/]}.*/]}/g'`
if [ "${STCODE}" == '200' ]
then
GITURL=`echo $JS7_GITINFO | jq -r '.credentials[].gitServer'`
GITUSER=`echo $JS7_GITINFO | jq -r '.credentials[].gitAccount'`
GITINFO=${GITURL}:${GITUSER}/${GITREPO}.git
## ローカルリポジトリの初期化
LOCALREPO=`curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" ${JOC}/joc/api/inventory/repository/git/clone -d '
{
"remoteUri": "'"git@${GITINFO}"'",
"folder": "'"${LOCALGITDIR}"'",
"category": "ROLLOUT"
}' -o /dev/null -w %{http_code}`
if [ "${LOCALREPO}" == '200' ]
then
echo "SUCCSESS : Git local repositorie initialization"
else
echo "ERROR : Git local repositorie initialization"
fi
else
echo "ERROR : Failed get Git credentials"
exit 1
fi
fi
## 最新のGitHubの情報をpull
PULL=`curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" ${JOC}/joc/api/inventory/repository/git/pull -d '
{
"folder": "'"${LOCALGITDIR}"'",
"category": "ROLLOUT"
}' -o /dev/null -w %{http_code}`
if [ "${PULL}" == '200' ]
then
echo "SUCCSESS : Git repositorie pull"
else
echo "ERROR : Git repositorie pull"
exit 1
fi
## ワークフローの登録/更新
LOCALUPDATE=`curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" ${JOC}/joc/api/inventory/repository/update -d '
{
"configurations": [
{
"configuration": {
"path": "'"${LOCALGITDIR}"'",
"objectType": "FOLDER",
"recursive": true
}
}
],
"category": "ROLLOUT"
}' -o /dev/null -w %{http_code}`
if [ "${LOCALUPDATE}" == '200' ]
then
echo "SUCCSESS : Git local repositorie update"
else
echo "ERROR : Git local repositorie update"
exit 1
fi
DEPLOY=`curl -s -X POST -H "Content-Type: application/json" -H "X-Access-Token: $AUTH" ${JOC}/joc/api/inventory/deployment/deploy -d '
{
"controllerIds": [
"controller"
],
"store": {
"draftConfigurations": [
{
"configuration": {
"path": "'"${LOCALGITDIR}"'",
"objectType": "FOLDER",
"recursive": true
}
}
]
}
}' -o /dev/null -w %{http_code}`
if [ "${LOCALUPDATE}" == '200' ]
then
echo "SUCCSESS : Deploy workflow"
else
echo "ERROR : Deploy workflow"
exit 1
fi
exit 0
#
(2)ワークフローの作成
本番環境のJOCのWebUIにrootアカウントでログインし、
http://<IPアドレス>:4446
ユーザ:root
パスワード:root
JobSchedulerメニューからジョブ定義 に移動し、ワークフローを作成します。
「/」を選択し、新規 > 新規フォルダー の順で移動し、「Git」を作成し、
作成したGitディレクトリ > コントローラ > ワークフロー の順で移動し、「新規ワークフロー」を選択し、オブジェクト名を入力し、登録します。
本書ではワークフローのディレクトリは、「Git」とし、ワークフローは、「Rollout」とします。
「Rollout」の必要な情報の名称、ラベル、エージェント、スクリプトを入力します。
名称:Rollout
ラベル:Rollout
タイトル:Rollout
エージェント:primaryAgent
※実行先のエージェントを選択
ジョブクラス:shell
スクリプト:サンプルとして以下を設定します。
#!/bin/bash
DIR=/usr/local/sbin
SHELL=rollout.sh
echo "Start Rollout Script"
sh ${DIR}/${SHELL}
if [ $? = 0 ]
then
echo "Success Rollout script"
else
echo "Faild Rollout script"
exit 1
fi
exit 0
設定後、ジョブ定義を配置します。
8.動作確認
(1)開発環境からのジョブ実行
開発環境のJOCのWebUIにrootアカウントでログインし、
http://<IPアドレス>:4446
ユーザ:root
パスワード:root
JobSchedulerメニューからワークフローに移動し、GitUpdateのアクションボタンを選択し、オーダを追加し、ジョブを実行します。(定期実行の設定を行っているため、毎日23:00になると自動で実行します)
実行後、ステータスが「完了」になっていることを確認し、ログを確認します。
2022-06-02 13:30:46.811+09:00 [MAIN] [OrderStarted] id=#2022-06-02#T14424672804-root, pos=0
2022-06-02 13:30:46.938+09:00 [MAIN] [OrderProcessingStarted] id=#2022-06-02#T14424672804-root, pos=0, Job=GitUpdate, Agent(url=http://localhost:4445, name=primaryAgent, time=2022-06-02 13:30:46.811+09:00)
2022-06-02 13:30:46.811+0900 [MAIN] [Start] Job=GitUpdate, Agent (url=http://localhost:4445, id=primaryAgent, name=primaryAgent)
2022-06-02 13:30:47.236+0900 [STDOUT] Start Git Update Script
2022-06-02 13:30:47.752+0900 [STDOUT] Add workflow: /Accounting/test/test ## ワークフローの新規追加があり、配置されている場合は、Gitへコミット
Change workflow: /Accounting/HelloWorld/job/HelloWorldRunningLog ## ワークフローの更新があり、配置されている場合は、Gitへコミット
220602133046 Change Workflow: HelloWorldRunningLog Add Workflow: test
2022-06-02 13:30:49.802+0900 [STDOUT] SUCCESS : Git update
Success git update script
2022-06-02 13:30:49.805+0900 [MAIN] [End] [Success] returnCode=0
2022-06-02 13:30:49.910+09:00 [SUCCESS] [OrderProcessed] id=#2022-06-02#T14424672804-root, pos=0, Job=GitUpdate, Agent(time=2022-06-02 13:30:49.805+09:00), returnCode=0
2022-06-02 13:30:50.078+09:00 [MAIN] [OrderFinished] id=#2022-06-02#T14424672804-root, pos=1
GitHubのURL、https://github.com にログインし、
GitHubのメニューから作成したリポジトリ「js7」に移動し、作成(更新)したワークフローが登録されていることを確認できます。
(1)本番環境からのジョブ実行
本番環境のJOCのWebUIにrootアカウントでログインし、
http://<IPアドレス>:4446
ユーザ:root
パスワード:root
JobSchedulerメニューからワークフローに移動し、Rolloutのアクションボタンを選択し、オーダを追加し、ジョブを実行します。
実行後、ステータスが「完了」になっていることを確認し、ログを確認します。
2022-06-02 13:38:45.430+09:00 [MAIN] [OrderStarted] id=#2022-06-02#T14472534007-root, pos=0
2022-06-02 13:38:45.558+09:00 [MAIN] [OrderProcessingStarted] id=#2022-06-02#T14472534007-root, pos=0, Job=Rollout, Agent(url=http://localhost:4445, name=primaryAgent, time=2022-06-02 13:38:45.430+09:00)
2022-06-02 13:38:45.430+0900 [MAIN] [Start] Job=Rollout, Agent (url=http://localhost:4445, id=primaryAgent, name=primaryAgent)
2022-06-02 13:38:45.844+0900 [STDOUT] Start Rollout Script
2022-06-02 13:38:47.728+0900 [STDOUT] SUCCSESS : Git repositorie pull
SUCCSESS : Git local repositorie update
SUCCSESS : Deploy workflow
Success Rollout script
2022-06-02 13:38:47.730+0900 [MAIN] [End] [Success] returnCode=0
2022-06-02 13:38:47.857+09:00 [SUCCESS] [OrderProcessed] id=#2022-06-02#T14472534007-root, pos=0, Job=Rollout, Agent(time=2022-06-02 13:38:47.730+09:00), returnCode=0
2022-06-02 13:38:48.029+09:00 [MAIN] [OrderFinished] id=#2022-06-02#T14472534007-root, pos=1
また、ロールアウトしたジョブ定義を確認し、GitHubへ登録されている最新のものに更新、配置されていることを確認します。
※ジョブ定義が配置済みであり、スクリプト等の内容が更新されていることを確認する