当前位置: 首页 > 知识库问答 >
问题:

CircleCi-使用cloud run部署到GKE

朱明知
2023-03-14

我正在尝试使用circleci将一个示例应用程序部署到使用google cloudrun的gke。我在google cloud中创建了一个集群,并希望在容器中构建和部署一个映像。如果我手动操作,效果会很好。但我希望建立一个自动化的CI/CD管道,并因此使用CircleCI来实现。

现在跳过测试和代码覆盖部分,我想为gke部署构建一个管道

这是Circleci的config.yaml文件。我试图使用已获得认证的球体,因为从头开始创建一个需要更长的时间

version: 2.1
orbs:
  gcp-gcr: circleci/gcp-gcr@0.6.1

  cloudrun: circleci/gcp-cloud-run@1.0.2
executors:
  node-executor:
    docker:
      - image: node:12.8.1-stretch
  gcloud-executor:
    docker:
      - image: google/cloud-sdk
  machine-executor:
    machine: true
jobs:
  build:
    description: initial build
    executor: machine-executor
    steps:
      - checkout


  build_push_image_cloud_run_mangaged:
    executor: node-executor
    steps:
      - checkout
      - setup_remote_docker:
          docker_layer_caching: false

      - run:
          name: Prepare env vars
          command: |
            echo 'export PATH=~$PATH:~/.local/bin' >> $BASH_ENV
            echo 'export GOOGLE_PROJECT_ID=$GCLOUD_PROJECT' >> $BASH_ENV
            echo 'export GOOGLE_COMPUTE_ZONE=us-east1-b' >> BASH_ENV
            echo ${GCP_PROJECT_KEY} > ${HOME}/gcloud-service-key.json
            echo 'export GOOGLE_CLOUD_KEYS=$(cat $HOME/gcloud-service-key.json)' >> $BASH_ENV
            echo 'export TAG=${CIRCLE_SHA1}' >> $BASH_ENV
            echo 'export IMAGE_NAME=$CIRCLE_PROJECT_REPONAME' >> $BASH_ENV && source $BASH_ENV


      - gcp-gcr/gcr-auth:
          gcloud-service-key: GOOGLE_CLOUD_KEYS # this is throwing error
          google-project-id: GOOGLE_PROJECT_ID
          google-compute-zone: GOOGLE_COMPUTE_ZONE
      - gcp-gcr/build-image:
          dockerfile: Dockerfile
          google-project-id: GOOGLE_PROJECT_ID
          image: $IMAGE_NAME
          registry-url: "gcr.io"
          tag: $CIRCLE_SHA1
      - gcp-gcr/push-image:
          google-project-id: GOOGLE_PROJECT_ID
          image: $IMAGE_NAME
          registry-url: "gcr.io"
          tag: $CIRCLE_SHA1
      - cloudrun/init:
          gcloud-service-key: GCLOUD_SERVICE_KEY
          google-project-id: GOOGLE_PROJECT_ID
          google-compute-zone: GOOGLE_COMPUTE_ZONE
      - cloudrun/deploy:
          cluster: "new-cluster"
          cluster-location: "us-east1-b"
          platform: "gke"
          image: "gcr.io/$GOOGLE_PROJECT_ID/$IMAGE_NAME"
          service-name: "orb-gcp-cloud-run"

workflows:
  build_gcloud_deploy:
    jobs:
      - build

      - build_push_image_cloud_run_mangaged:
          requires:
            - build

我用GCLOUD_SERVICE_键在项目设置中设置了环境变量,

#!/bin/bash -eo pipefail
# Store service account
echo $GOOGLE_CLOUD_KEYS > ${HOME}/gcloud-service-key.json
# Initialize gcloud CLI
gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json
gcloud --quiet config set project $GOOGLE_PROJECT_ID
gcloud --quiet config set compute/zone $GOOGLE_COMPUTE_ZONE
ERROR: (gcloud.auth.activate-service-account) Could not read json file /root/gcloud-service-key.json: No JSON object could be decoded
Exited with code exit status 1
CircleCI received exit code 1

我尝试使用GOOGLE_CLOUD_KEYSenv var,我设置在gcloud-service-key.json变量中的Circleci步骤,但也会导致相同的错误。我还试图指定一个env变量,它具有json文件的实际值(未解码),但也会导致相同的错误。如你所见,我使用orb: gcp-gcr: Circleci/gcp-gcr@0.6.1。你能告诉我是什么导致了错误以及如何纠正它吗?

编辑:

正如艾哈迈特正确指出的,这是一个不包含任何数据的文件的问题。我做了一些更改,为该项目创建了一个env变量作为GCLOUD_SERVICE_KEY,并直接访问它,而无需编码(这不是推荐的方法,因为最好先对其进行编码,然后存储密钥)。

共有1个答案

漆雕彦
2023-03-14

正如@AhmetB Google指出的,问题在于服务密钥没有正确加载到tne env VAR中。所以我做了这样的改变。建议将其编码并添加到env变量中。因此,在项目设置中,我有一个名为-GCLOUD_SERVICE_key的密钥,这是我的circleci配置

version: 2.1
orbs:
  gcp-gcr: circleci/gcp-gcr@0.6.1
  cloudrun: circleci/gcp-cloud-run@1.0.1
  gcp-gke: circleci/gcp-gke@0.2.0
executors:

  gcloud-executor:
    docker:
      - image: google/cloud-sdk
  machine-executor:
    machine: true
jobs:
  build:
    description: initial build -  Can make use of test coverage and tests
    executor: machine-executor
    steps:
      - checkout
      - run:
          name: Test the source
          command: |
            echo "test"
      - run:
          name: Coverage report
          command: |
            echo "npm coverage"

  build_push_image_gcr:
    description: Build docker image and push to gcr registry
    executor: machine-executor
    steps:
      - checkout
      - run:
          name: Prepare env vars
          command: |
            echo $GCLOUD_SERVICE_KEY > base64 --decode --ignore-garbage > ${HOME}/gcloud-service-key.json
            echo $GCP_PROJECT_KEY > ./gcloud-service-key.json
            cat ./gcloud-service-key.json
            cat ${HOME}/gcloud-service-key.json
            export $GCP_SERVICE_KEY=cat(${HOME}/gcloud-service-key.json)
            pwd


      - gcp-gcr/gcr-auth:
          gcloud-service-key: GCLOUD_SERVICE_KEY
          google-project-id: GOOGLE_PROJECT_ID
          google-compute-zone: GOOGLE_COMPUTE_ZONE

      - gcp-gcr/build-image:
          dockerfile: Dockerfile
          google-project-id: GOOGLE_PROJECT_ID
          image: $IMAGE_NAME
          registry-url: "gcr.io"
          tag: $CIRCLE_SHA1
      - gcp-gcr/push-image:
          google-project-id: GOOGLE_PROJECT_ID
          image: $IMAGE_NAME
          registry-url: "gcr.io"
          tag: $CIRCLE_SHA1

  gcp_cloudrun_deploy:
    description: Deploy using cloud run
    executor: machine-executor
    steps:
      - cloudrun/init
      - cloudrun/deploy:
          cluster: 'new-cluster'
          cluster-location: us-east1-b
          platform: 'gke'
          image: 'gcr.io/$GOOGLE_PROJECT_ID/$IMAGE_NAME:$CIRCLE_SHA1'
          service-name: 'feedback-ui-service'


workflows:
  build_gcloud_deploy:
    jobs:
      - build

      - build_push_image_gcr:
          requires:
            - build
      - gcp_cloudrun_deploy:
          requires:
            - build_push_image_gcr
 类似资料:
  • 问题内容: 我们在项目中使用Jenkins在开发环境上进行构建和部署。我已经在jenkins中使用maven成功创建了一个战争文件,现在我必须创建另一个作业才能将该战争文件部署到weblogic服务器中。 但是,我不知道在jenkins中配置此作业所需的步骤。仅仅调用一个maven deploy命令就可以了吗?有人可以告诉我使用jenkins将war文件部署到weblogic 10.3.5中需要采

  • 我的ant-script和Tomcat有问题。我想创建一个ant-scipt,它使用Jenkins在我的tomcat-server上构建、编译和部署我的GWT应用程序。为此,我使用来自catalina(catalina-ant.jar)的undeploy and deploy任务。但是我得到了这个错误: 构建失败d:\jenkins\jobs\homepageTomcat\workspace\BU

  • Fabric 是一个 Python 下类似于 Makefiles 的工具,但是能够在远程服务器上 执行命令。如果您有一个良好配置过的 Python 软件包 (大型应用) 且 对“配置”概念的理解良好,那么在外部服务器上部署 Flask 应用将会非常容易。 开始之前,请先检查如下列表中的事项是否都已经满足了: 在本地已经安装了 Fabric 1.0 。即这个教程完成时, Fabric 的最新版本。

  • Nuxt.js 允许你将静态化后的站点部署至任何静态站点托管服务中,例如 surge.sh。 部署至 surge.sh,需先安装 surge: npm install -g surge 然后, 我们需要告诉 Nuxt.js 生成应用的静态站点目录: npm run generate 上述的命令会生成一个 dist 目录,该目录包含了待部署的所有资源文件。 最后,我们可以通过下面的命令将站点布置至

  • 我有一个关于Flyway和管理多个模式的问题。我有多个模式(schema1、schema2、schema3),它们具有不同的部署计划和不同的文件夹位置(sql/schema1、sql/schema 2、sql/sschema3、sql/schma3)以及不同的代码。 我想在代码部署之前通过 Flyway 创建架构,但我如何在单个配置文件中进行设置?我阅读了 Flyway 文档(https://fl

  • 我试图将工件部署到nexus。当我尝试使用本地机器时,它工作正常。但是当我尝试在另一台机器中使用nexus时,它会抛出错误。 我已经配置了