Jenkins Pipeline を使用して、接続モードでの Flex Gateway のワークフローを自動化できます。Jenkins Pipeline を使用すると、Flex Gateway を登録して実行し、Anypoint CLI の機能 (API インスタンスの作成やデプロイなど) を使用できます。
API Manager CLI のその他の機能を追加するには、API Manager の CLIを参照してください。
このチュートリアルには、異なるコードブロックを含む異なる手順があります。手順を進めながら、コードブロックを同じ Jenkinsfile に追加します。Jenkins Pipeline で使用される構文についての詳細は、 Jenkins Pipeline ドキュメントを参照してください。
| Anypoint CLI を使用した Flex Gateway の自動化は、API Manager API を使用した Flex Gateway の自動化と多くの類似点があります。API Manger API 要求を使用して Flex Gateway を自動化するには、Jenkins Pipeline と API Manager API を使用した Flex Gateway の自動化を参照してください。 |
始める前に
Jenkins Pipeline をデプロイする前に、次のタスクを完了します。
-
-
[App acts on its behalf (client credentials) (アプリケーションが自身のために行動する (クライアントログイン情報))] 種別を使用し、以下のスコープを含めます。
-
API Manager: [Manage API Configuration (API 設定の管理)]、[Manage Policies (ポリシーの管理)]、[View Policies (ポリシーの参照)]、[Deploy API Proxies (API プロキシのデプロイ)]
-
Runtime Manager: [Read Servers (サーバーの参照)] および [Manage Servers (サーバーの管理)]
-
Exchange: [Exchange Viewer (Exchange 閲覧者)]
-
一般: [View Organization (組織の表示)]
-
-
設定する接続アプリケーションの ID とシークレットを保存します。
-
-
作成または適用する Exchange アセット (API) のグループ ID、アセット ID、およびアセットバージョン (GAV) を収集します。
Exchange から GAV を収集する手順は、次のとおりです。
-
Exchange に移動します。
-
追加または適用するアセットを見つけます。
-
URL からグループ ID とアセット ID を収集します。
たとえば、API Manager API Exchange URL
https://anypoint.mulesoft.com/exchange/portals/anypoint-platform/f1e97bc6-315a-4490-82a7-23abe036327a.anypoint-platform/api-manager-api/minor/1.0/pages/home/ から収集された ID は次のとおりです。-
グループ ID:
f1e97bc6-315a-4490-82a7-23abe036327 -
アセット ID:
api-manager-api
-
-
[Latest Stable (最新の安定バージョン)] からアセットのバージョンを収集します。
たとえば、API Gateway HTTP 基本認証ポリシーテンプレートから収集されたバージョンは
1.3.2 です。
-
-
Anypoint Platform インスタンスから以下の情報を収集します。
-
Flex Gateway を実行する組織の組織 ID
詳細は、「組織 ID を見つける」を参照してください。
-
Flex Gateway を実行する環境の環境 ID
詳細は、「API Manager の外観」を参照してください。
-
初期設定
API インスタンスを作成して Flex Gateway にデプロイする前に、次の手順を完了する必要があります。
これらの Pipeline フェーズを実装したら、API を管理するための API Manager CLI 要求を作成して Pipeline をカスタマイズできます。
役立つ関数を定義する
まず、Jenkinsfile で pipeline ブロックの前にこれらの役立つ関数を定義します。
def parseYamlFile(String file) {
object = readYaml file: file
return object
}
def getAPIInstanceID(String file) {
return readFile(file: file).split(' ').last().replace('\n', '').trim()
}
役立つパラメーターを定義する
Jenkins Pipeline のコマンドは一部のパラメーターを再利用するため、Jenkinsfile の先頭でパラメーターを定義すると役立ちます。
含まれているパラメーター定義をテンプレートとして使用して、追加の API またはポリシーに必要なパラメーターを定義することもできます。
パラメーターを定義する手順は、次のとおりです。
-
次の情報を収集します。
-
<your-org-id>: Flex Gateway を実行する組織の組織 ID -
<your-env-id>: Flex Gateway を実行する組織の環境 ID -
<gateway-version>: 使用している Flex Gateway のバージョン (例:1.4.0) -
<connected-app-client-id>: 接続アプリケーションの ID -
<connected-app-client-secret>: 接続アプリケーションのシークレット。 -
API GAV:
-
<asset-group-id>: Exchange から取得したグループ ID -
<asset-id-from-exchange>: Exchange から取得した、作成する API のアセット ID -
<asset-version>: Exchange から取得した、作成する API のアセットバージョン
-
-
<gateway-name>: Flex ゲートウェイの名前
-
-
サンプルコンテンツを置き換えたら、パラメーター定義を Jenkinsfile に追加して、すべてのパラメーターが存在するかどうかを検証します。
stages ブロックの前の pipeline ブロックでパラメーターを定義します。parameters { string(name: 'ENV_ID', defaultValue: '<your-env-id>', description: 'Your environment id') string(name: 'ORG_ID', defaultValue: '<your-org-id>', description: 'Your organization id') string(name: 'FLEX_VERSION', defaultValue: '<gateway-version>', description: 'Flex version to run') string(name: 'CONNECTED_APP_CLIENT_ID', defaultValue: '<connected-app-client-id>', description: 'Your connected app client id') string(name: 'CONNECTED_APP_CLIENT_SECRET', defaultValue: '<connected-app-client-secret', description: 'Your connected app client secret') string(name: 'EXCHANGE_ASSET_ID', defaultValue: '<asset-id-from-exchange>', description: 'The id of the http api exchange asset') string(name: 'EXCHANGE_ASSET_VERSION', defaultValue: '<asset-version>', description: 'The version of the http api exchange asset') string(name: 'GATEWAY_NAME', defaultValue: '<gateway-name>', description: 'Unique gateway name') } -
Jenkinsfile で check parameters
stage を stages ブロックに追加します。stage('Check parameters') { steps { script { if (!params.ENV_ID || !params.ORG_ID || !params.GATEWAY_NAME || !params.FLEX_VERSION || !params.CONNECTED_APP_CLIENT_ID || !params.CONNECTED_APP_CLIENT_SECRET || !params.EXCHANGE_ASSET_ID || !params.EXCHANGE_ASSET_VERSION) { error("Not all parameters where specified") } } } }このフェーズが失敗した場合は、不足しているパラメーターを指定して Pipeline を再実行します。
Anypoint CLI 4.x のインストール
Anypoint CLI 4.x を Docker コンテナにインストールするには、Jenkinsfile で install Anypoint CLI 4.x stage を stages ブロックに追加します。
stage('Install anypoint-cli-v4') {
steps {
script {
sh """
docker run --name container-anypoint-cli-v4 -d node:16 \
sh -c " npm install -g anypoint-cli-v4 ; anypoint-cli-v4 plugins:install anypoint-cli-api-mgr-plugin; \
while :; do sleep 1; done"
"""
sh """
docker exec container-anypoint-cli-v4 \
sh -c "while ! anypoint-cli-v4 plugins 2> /dev/null | grep -q "anypoint-cli-api-mgr-plugin"; do :; done"
"""
}
}
}
登録して実行する
Jenkinsfile で登録フェーズと実行フェーズを stages ブロックに追加します。
stage('Register flex gateway') {
steps {
script {
sh """
docker run --entrypoint flexctl \
-v ${pwd()}:/registration -u 0 mulesoft/flex-gateway:${params.FLEX_VERSION} \
register \
--client-id=${params.CONNECTED_APP_CLIENT_ID} \
--client-secret=${params.CONNECTED_APP_CLIENT_SECRET} \
--environment=${params.ENV_ID} \
--connected=true \
--organization=${params.ORG_ID} \
--output-directory=/registration \
${params.GATEWAY_NAME}
"""
sh """
grep "name: registration" registration.yaml
"""
}
}
}
stage('Run flex gateway') {
steps {
script {
sh """
docker run --name flex-gw -d \
-v ${pwd()}:/usr/local/share/mulesoft/flex-gateway/conf.d \
-p 8082:8082 \
mulesoft/flex-gateway:${params.FLEX_VERSION}
"""
}
}
}
API インスタンスを作成する
Anypoint CLI 4.x をインストールしたら、API インスタンスを作成して Flex Gateway にデプロイできます。
このステップを繰り返して、複数の API インスタンスを追加できます。その他の API 設定フラグについては、api-mgr:api:manage コマンドを参照してください。
Jenkinsfile で create API instance stage を stages ブロックに追加します。
stage("Create API Instance") {
steps {
script {
sh """
docker exec container-anypoint-cli-v4 anypoint-cli-v4 api-mgr:api:manage ${params.EXCHANGE_ASSET_ID} ${params.EXCHANGE_ASSET_VERSION} \
--client_id=${params.CONNECTED_APP_CLIENT_ID} --client_secret=${params.CONNECTED_APP_CLIENT_SECRET} \
--isFlex --withProxy --deploymentType=hybrid --scheme=http --port=8082 \
--uri=https://httpbin.org:443 --path=/httpbin > api-response
"""
}
}
}
たとえば、このフェーズでは、ポート 8082 および /httpbin パスでリスンし、https://httpbin.org/443 にプロキシする API インスタンスを作成します。
|
適用基本認証ポリシーを適用する
API インスタンスを作成したら、その API インスタンスにポリシーを適用できます。
このフェーズは 基本認証: 簡易ポリシー as an example, but you can apply any Connected Mode policy. To find additional policies, see Included Policies Directory に適用されます。
ポリシーを適用する手順は次のとおりです。
-
次の情報を収集します。
-
ポリシー GAV
-
<policy-group-id>: Exchange のポリシーグループ ID (例:68ef9520-24e9-4cf2-b2f5-620025690913) -
<policy-asset-id>:Exchange のポリシーアセット ID (例:http-basic-authentication) -
<policy-asset-version>: Exchange のポリシーアセットバージョン (例:1.3.2)
-
-
"configurationData": ポリシー設定データ設定データ項目はポリシーに依存します。基本認証: 簡易ポリシーでは、
"username" および "password" パラメーターが使用されます。
-
-
サンプルコンテンツを置き換えたら、Jenkinsfile で apply basic authentication policy
stage を stages ブロックに追加します。
stage("Apply Basic Authentication Policy to API Instance") {
steps {
script {
def apiInstanceId = getAPIInstanceID('api-response')
sh """
docker exec container-anypoint-cli-v4 anypoint-cli-v4 api-mgr:policy:apply ${apiInstanceId} 'http-basic-authentication' \
--policyVersion='1.3.1' --groupId '68ef9520-24e9-4cf2-b2f5-620025690913' \
--client_id=${params.CONNECTED_APP_CLIENT_ID} --client_secret=${params.CONNECTED_APP_CLIENT_SECRET} \
-c '{"username": "user", "password": "test"}'
"""
}
}
}
たとえば、このフェーズでは、基本認証: 簡易ポリシーに関連付けられたポリシー GAV および "configurationData" が使用されます。
|
API インスタンスをデプロイする
API インスタンスを作成したら、そのインスタンスをデプロイできます。
新しいインスタンスをデプロイするには、Jenkinsfile で deploy API stage を stages ブロックに追加します。
stage("Deploy API") {
steps {
script {
sleep(time:15, unit:"SECONDS")
def registration_file = parseYamlFile('registration.yaml')
def apiInstanceId = getAPIInstanceID('api-response')
sh """
docker exec container-anypoint-cli-v4 anypoint-cli-v4 api-mgr:api:deploy ${apiInstanceId} \
--client_id=${params.CONNECTED_APP_CLIENT_ID} --client_secret=${params.CONNECTED_APP_CLIENT_SECRET} \
--target=${registration_file.spec.platformConnection.agentId[0]} --gatewayVersion=${params.FLEX_VERSION}
"""
}
}
}
API インスタンスがデプロイされていることを検証する
API インスタンスをデプロイしたら、Jenkinsfile で validate deployment stage を stages ブロックに追加して、インスタンスがデプロイされているかどうかを検証します。
stage("Validate Deployment") {
steps {
script {
sleep(time:10, unit:"SECONDS")
def unauthorized_status_code = sh(script: "curl -s -w \"%{http_code}\" -o /dev/null http://localhost:8082/httpbin/headers -v", returnStdout: true).trim().toInteger()
if (unauthorized_status_code != 401) {
error("401 status code expected but the status code obtained is ${unauthorized_status_code}")
}
def authorized_status_code = sh(script: "curl -s -w \"%{http_code}\" -o /dev/null http://localhost:8082/httpbin/headers -v -u user:test", returnStdout: true).trim().toInteger()
if (authorized_status_code != 200) {
error("200 status code expected but the status code obtained is ${unauthorized_status_code}")
}
}
}
}
Flex Gateway を停止して登録ファイルをアーカイブする
次のコードブロックを使用して、登録ファイルをアーカイブし、Flex Gateway を実行している Docker コンテナを削除します。stages ブロックの後の pipeline ブロックに post ブロックを追加します。
post {
success {
script {
// Archive the build output artifacts.
archiveArtifacts artifacts: 'registration.yaml'
}
}
always {
script {
sh(script: "docker rm -f container-anypoint-cli-v4 flex-gw")
}
}
}