无人机ci部署到Google计算引擎

时间:2019-07-06 17:50:59

标签: docker google-compute-engine gcloud drone

im试图使用Drone ci在Google Cloud Compute Engine上自动部署我的应用程序。我尝试了很多方法,但是我什么都不能部署。

我的测试和发布阶段运行良好,我可以将自己的代码自动推送到我的Google容器注册表中,使用无人机构建图像并将其推送。

我对我的计算引擎实例进行身份验证,我在尝试将计算机连接到Google容器注册表时遇到了麻烦,但是我无法运行生成的映像。这是我缺少的最后一步,我做不到。

这是我的.drone-ci.yml文件,其中包含以下步骤:

kind: pipeline
name: my-app

steps:
  - name: test
    image: node:11-alpine
    commands:
      - npm install
      - npm run test

  - name: publish
    image: plugins/gcr
    settings:
      repo: project-id/my-app
      dockerfile: Dockerfile
      tags: latest
      json_key:
        from_secret: google_credentials

  - name: deploy
    image: google/cloud-sdk:alpine
    environment:
      google_credentials:
        from_secret: google_credentials
    commands:
      - echo $google_credentials > /tmp/$CI_PIPELINE_ID.json
      - gcloud auth activate-service-account --key-file /tmp/$CI_PIPELINE_ID.json
      - gcloud compute ssh my-instance --zone my-zone --command "cat $google_credentials | sudo docker login -u _json_key --password-stdin https://gcr.io"
      - gcloud compute ssh my-instance --zone us-east1-b --command "sudo docker run -d -p 80:3000 --restart always --env-file ./env.list gcr.io/project-id/my-app:latest"

它抛出此错误(是最后一个错误):

cat: '{': No such file or directory
bash: line 1: type:: command not found
bash: line 2: project_id:: command not found
bash: line 3: private_key_id:: command not found
bash: line 4: private_key:: command not found
bash: line 5: client_email:: command not found
bash: line 6: client_id:: command not found
bash: line 7: auth_uri:: command not found
bash: line 8: token_uri:: command not found
bash: line 9: auth_provider_x509_cert_url:: command not found
bash: line 10: client_x509_cert_url:: command not found
bash: -c: line 11: syntax error near unexpected token `}'
bash: -c: line 11: `} | sudo docker login -u _json_key --password-stdin 
https://gcr.io'

我以其他方式尝试过,但我从未成功向Google容器注册表进行身份验证。 我该如何从实例验证Docker守护进程?

1 个答案:

答案 0 :(得分:0)

错误的命令是:

cat $google_credentials | sudo docker login -u _json_key --password-stdin https://gcr.io

您的变量$google_credentials保存JSON密钥的内容:它不保存文件的路径,因此cat $google_credentials没有意义。由于文件/tmp/$CI_PIPELINE_ID.json包含您的JSON密钥,因此您应该编写:

cat /tmp/$CI_PIPELINE_ID.json | \
    sudo docker login -u _json_key --password-stdin https://gcr.io

或者(未经测试,请谨慎使用):

echo $google_credentials | \
    sudo docker login -u _json_key --password-stdin https://gcr.io

第三个解决方案(我确信这是可行的,因为我已经使用它进行身份验证了):

docker login -u _json_key -p "$(cat /tmp/$CI_PIPELINE_ID.json)" https://gcr.io