Day-to-day the memorandum

やったことのメモ書きです。

DroneのPipelineでgcloudコマンドを使いたい

DroneのPipelineでgcloudコマンドを使いたく、認証のところでちょっとはまったのでメモ。

バージョン

Droneのバージョンは1.0.0です。

やりたかったこと

DroneのPipelineでGCPのリソースを操作するときに、認証を行う必要があります。
その認証をServiceAccountのJSONキーを使い、リソースを操作することにしました。

はまったこと

DroneのSecretにServiceAccountのJSONを登録しておき、以下のような.drone.ymlを書いていました。

  • .drone.yml
---
kind: pipeline
name: default

- name: credentials
  image: google/cloud-sdk:latest
  environment:
    CREDENTIALS_JSON:
      from_secret: credentials_json
  commands:
  - echo "$CREDENTIALS_JSON" > /tmp/credentials.json
  - gcloud auth activate-service-account account-name@project-id.iam.gserviceaccount.com --key-file /tmp/credentials.json

これで実行すると以下のようなエラーが出てしまいます。

ERROR: (gcloud.auth.activate-service-account) Could not read json file /tmp/credentials.json: Invalid control character at: line 5 column 46 (char 180)

GCPのServiceAccountのJSONキーは以下のようになっていて\n付近でエラーになっているようです。

{
  "type": "service_account",
  "project_id": "xxxxxx",
  "private_key_id": "xxxxxxxxxxxxxxxxxxx",
  "private_key": "-----BEGIN PRIVATE KEY-----\nXXXXX..."
...
}

解決策

今回はDroneのSecretにServiceAccountのJSONキーをBase64エンコードして登録することにしました。
そして使うときにデコードするようにしています。

  • .drone.yml
---
kind: pipeline
name: default

- name: credentials
  image: google/cloud-sdk:latest
  environment:
    CREDENTIALS_JSON_BASE64:
      from_secret: credentials_json_base64
  commands:
  - echo "$CREDENTIALS_JSON_BASE64" | base64 --decode > /tmp/credentials.json
  - gcloud auth activate-service-account account-name@project-id.iam.gserviceaccount.com --key-file /tmp/credentials.json

以上でgcloudコマンドが使えるようになりました。