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
付近でエラーになっているようです。
- credentials.json
{ "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コマンドが使えるようになりました。