Dockerイメージの用意
GitHubで以下のDockerfileを上げて、Docker Hubと連携するなどしてコンテナをダウンロードできる状態にしてください。
Dockerfile
FROM golang:1.9.0
ENV _HOME=/root
RUN apt-get update
RUN apt-get install -y unzip
RUN curl https://glide.sh/get | sh
RUN mkdir $_HOME/download
RUN curl -o $_HOME/download/go_appengine_sdk_1.9.58.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.58.zip
RUN unzip -q -d $_HOME $_HOME/download/go_appengine_sdk_1.9.58.zip
ENV PATH=$_HOME/go_appengine:$PATH
RUN curl -sSL https://sdk.cloud.google.com | bash -s -- --disable-prompts
ENV PATH=$_HOME/google-cloud-sdk/bin:$PATH
サービス アカウント キーの取得
- 場所
-
ツールとサービス
→APIとサービス
→認証情報
→認証情報を作成
→ `サービス アカウント キー
-
- 役割
-
App Engine
→App Engine デプロイ担当者
-
- キーのタイプ
- JSON
gcloudコマンドで上記で取得したJSONキーファイルを使って認証し、そこから取得できるアクセストークンを使ってgo_appengine_sdkでビルドします。
プロジェクトルートにservice_account_keys
フォルダを作成しそこに適宜名前をつけて保存してください。
※公開リポジトリでは必ず下記の作業を行なってください。
CircleCI設定ファイル作成
プロジェクトルートに.circleci
フォルダを作成し、その中にconfig.yml
を作成します。
-
docker_hub_namespace
/docker_hub_repository_name
はDocker Hubで作成したリポジトリ情報を入れてください- Docker Hubでプライベートなリポジトリの場合は、
auth
でusername
、password
を設定することでDockerイメージを取得できます(※GitHubの公開リポジトリには絶対上げない)
- Docker Hubでプライベートなリポジトリの場合は、
-
project_name
には、チェックアウトするソースのプロジェクト名を指定してください -
appcfg.py
コマンドの最後の引数には、app.yaml
があるディレクトリを指定してください
.circleci/config.yml
version: 2
jobs:
build:
docker:
- image: docker_hub_namespace/docker_hub_repository_name
auth: # Case Private Repository
username: username
password: password
working_directory: /go/src/project_name
steps:
- checkout
- run: glide i
- deploy:
command: |
if [ "${CIRCLE_BRANCH}" == "develop" ]; then
gcloud auth activate-service-account --key-file ./service_account_keys/develop.json
appcfg.py update --oauth2_access_token $(gcloud auth print-access-token) app
elif [ "${CIRCLE_BRANCH}" == "master" ]; then
gcloud auth activate-service-account --key-file ./service_account_keys/master.json
appcfg.py update --oauth2_access_token $(gcloud auth print-access-token) app
fi
参考: プロジェクトツリー
project_name
├─.circleci
│ └─config.yml
├─app
│ ├─app.yaml
│ └─index.go
├─server
│ ├─index.go
│ ├─foo.go
│ └─bar.go
├─glide.lock
└─glide.yaml