CircleCI에서 Service Account를 사용하여 GAE/go에 배포



CircleCI의 문서에는 Google App Engine에 배포하는 방법이 작성되었지만
Google 비밀번호를 입력하게 되었기 때문에 별로 기분이 좋지 않아서
어떻게든 ServiceAccount에서 Deploy 할 수 없는지 모색했습니다.

환경



Mac os x
gae go sdk: 1.9.24

ServiceAccount 만들기



GCP Console로 이동하여 프로젝트를 열고 메뉴에서
[API Manager]->[자격 증명]에서 [자격 증명 만들기] 버튼을 눌러 Service Account를 만듭니다.
작성할 때 키를 내보내라는 메시지가 표시됩니다.
JSON에서 다운로드합니다.

키 파일 암호화 및 해독을 위한 스크립트 준비



Git에서 관리할 때 키 파일을 리포지토리에 포함하는 경우에는 일단 암호화를 해 둡시다.

Travis라고하면이 편은 명령으로 간단하게 할 수 있어 즐겼습니다만
커맨드 라인 툴은 공식적으로 지원되지 않으므로 스스로 혼잡하게 준비했습니다.

사용법은 현재 디렉토리 바로 아래에 있는 .secret 디렉토리의 파일을 암호화합니다.
# 暗号化したいファイルの作成
echo "チョココロネ" > .secret/important_confidential_documents
# 暗号化
$ SECURE_KEY=hogehoge script/encrypt
# .secret/important_confidential_documents.enc ができている
# 復号化
$ SECURE_KEY=hogehoge script/decrypt

gitignore에서 .enc 만 버전 제어에 포함되도록 설정하십시오.

CircleCI에서 SECURE_KEY라는 이름으로 적절한 길이의 임의의 문자열을 넣습니다.

프로젝트와 circle.yml 만들기



시험 정도라면 적당한 데모 앱으로 프로젝트를 만들어주세요.

그리고 circle.yml을 만듭니다.

circle.yml
machine:
  timezone:
    Asia/Tokyo
  environment:
    ACCOUNT: [email protected]
    GAE_GO_SDK_VERSION: 1.9.24

dependencies:
  pre:
    - curl -o $HOME/go_appengine_${GAE_GO_SDK_VERSION}.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-${GAE_GO_SDK_VERSION}.zip
    - unzip -q -d $HOME $HOME/go_appengine_${GAE_GO_SDK_VERSION}.zip

test:
  override:
    - $HOME/go_appengine/goapp build
    - $HOME/go_appengine/goapp test -v ./...

deployment:
  appengine:
    branch: master
    commands:
      - script/decrypt
      - gcloud auth activate-service-account $ACCOUNT --key-file ./.secret/key.json
      - gcloud preview app deploy --set-default --version=1

Demo 앱이라면 이것으로 Deploy까지 할 수 있습니다.
gcloud 명령의 AppEngine은 아직 미리보기 버전에서 의존성을 해결하지 못했습니다.
즉 외부 프레임워크나 패키지를 사용하고 있었을 경우 gcloud preview app deploy --set-default --version=1 에서는 deploy 할 수 없습니다

그래서 appcfg.py를 사용합니다.
이번에는 appcfg.py 는 서비스 계정을 그대로 로드하고 사용할 수 없으므로 서비스 계정에서 AccessToken을 가져옵니다.

gcloud에 계정이 설정되어 있으면 다음 명령으로 토큰을 얻을 수 있습니다.
$ gcloud auth print-access-token

나중에 circle.yml을 수정하겠습니다.

circle.yml
machine:
  timezone:
    Asia/Tokyo
  environment:
    GAE_GO_SDK_VERSION: 1.9.24
    PATH: $PATH:$HOME/go_appengine

dependencies:
  pre:
    - curl -o $HOME/go_appengine_${GAE_GO_SDK_VERSION}.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-${GAE_GO_SDK_VERSION}.zip
    - unzip -q -d $HOME $HOME/go_appengine_${GAE_GO_SDK_VERSION}.zip

test:
  override:
    - goapp build
    - goapp test -v ./...

deployment:
  appengine:
    branch: master
    commands:
      - script/decrypt
      - gcloud auth activate-service-account $ACCOUNT --key-file ./.secret/key.json
      - appcfg.py update --oauth2_access_token $(gcloud auth print-access-token 2> /dev/null) .

자동으로 배포할 수 있습니다.

좋은 웹페이지 즐겨찾기