GAE に合わせて全て Docker コンテナ内で動作すべきところだが
サンプルであるため簡易的にローカルに go 環境があるものとして
$ swagger generate server -A demo-apis -P models.Principal -t api
$ pushd api
$ dep init
$ popd
$ go run api/cmd/demo-apis-server/main.go --host 0.0.0.0 --port 8080
http://localhost:8080/version にアクセスすると値が返ってきます。
別のターミナルから以下のテストを流します。
(動作が確認できたら Ctrl + C で API サービスを停止しましょう)
$ newman run --environment test/postman_env_local.json test/postman_collection.json
以下を全て CI で実行する
$ export PROJECT_ID=
$ gcloud config set project $PROJECT_ID
実際にはバージョンは git のコミットハッシュ、ブランチ名やタグなどを利用
$ version=$( date +%Y%m%d%H%M ) && echo ${version}
$ docker build -t asia.gcr.io/${PROJECT_ID}/apis-on-gae:${version} .
テストが通ったら
$ # do tests
コンテナレジストリに push
$ token=$( gcloud auth application-default print-access-token )
$ docker login -u oauth2accesstoken -p "${token}" https://gcr.io
$ docker push asia.gcr.io/${PROJECT_ID}/apis-on-gae:${version}
swagger.yaml のバージョンなどを更新して
$ sed -i -e "s/^ version: \'.*\'/ version: \'${version}\'/" swagger.yaml
$ sed -i -e "s/^host: your-project-id/host: ${PROJECT_ID}/" swagger.yaml
デプロイ
$ gcloud service-management deploy swagger.yaml --quiet
app.yaml の Cloud Endpoints バージョンなどを更新
$ config_id=$( gcloud service-management configs list \
--service ${PROJECT_ID}.appspot.com \
--format=json \
| jq "map(select(.name | index(\"${PROJECT_ID}.appspot.com\")).id)" \
| jq -r "sort | .[-1]" \
) && echo ${config_id}
$ sed -i -e "s/^ config_id: \'.*\'/ config_id: \'${config_id}\'/" app.yaml
$ sed -i -e "s/^ name: \'your-project-id/ name: \'${PROJECT_ID}/" app.yaml
デプロイ
$ gcloud app deploy app.yaml --no-promote --no-stop-previous-version \
--image-url asia.gcr.io/${PROJECT_ID}/apis-on-gae:${version} \
--version ${version} --quiet
https://${version}-dot-${PROJECT_ID}.appspot.com/ に対して e2s テストを実行
$ sed -i -e "s/\"value\":.*/\"value\": \"${version}-dot-${PROJECT_ID}.appspot.com\",/" \
test/postman_env_gae.json
$ newman run --environment test/postman_env_gae.json test/postman_collection.json
$ gcloud app services set-traffic default --splits ${version}=1 --quiet
$ gcloud app logs tail --service=default --version=${version}
$ open "https://console.cloud.google.com/endpoints/api/${PROJECT_ID}.appspot.com/overview"