CircleCi - развертывание в GKE с помощью облачного запуска

Я пытаюсь развернуть образец приложения с помощью circleci для gke с помощью google cloudrun. Я создал кластер в облаке Google и хотел создать и развернуть образ в контейнере. Он отлично работает, если я делаю это вручную. Но я хотел создать автоматизированный конвейер CI / CD и, следовательно, использовать для этого CircleCI.

Пропуская пока части тестирования и покрытия кода, я хочу создать конвейер для развертывания gke.

Вот файл config.yaml для circleci. Я пытаюсь использовать уже имеющиеся сертифицированные шары, так как создание одного с нуля занимает больше времени.

version: 2.1
orbs:
  gcp-gcr: circleci/[email protected]

  cloudrun: circleci/[email protected]
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_KEY и GCP_PROJECT_KEY, оба имеют закодированные версии json файла моей учетной записи службы. У меня также установлены значения окружения GOOGLE_PROJECT_ID и GOOGLE_COMPUTE_ZONE соответственно. Теперь, когда я запускаю сборку для проверки (настроил веб-перехватчик для успешной проверки - позже будет изменен для успешного слияния), на шаге всегда возникают ошибки: инициализировать gcloud

#!/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_KEYS, которую я установил в переменной gcloud-service-key.json в шагах circleci, но это тоже приводит к той же ошибке. Я также попытался указать переменную env, которая имеет фактическое значение файла json (не декодировано), но это тоже приводит к той же ошибке. Как видите, я использую orb: gcp-gcr: circleci/[email protected]. Не могли бы вы сообщить мне, что вызывает ошибку и как ее исправить?

РЕДАКТИРОВАТЬ:

Как правильно указал Ахмет, проблема связана с файлом, не содержащим данных. Я внес такие изменения, что создал переменную env для проекта как GCLOUD_SERVICE_KEY и получил доступ к ней напрямую, без кодирования (это не рекомендуемый подход, так как лучше всего закодировать ее, а затем сохранить ключ).


person vijayakumarpsg587    schedule 09.12.2019    source источник
comment
Кажется, что-то не так с gcloud-service-key.json файлом. Может быть, просто добавьте команду cat gcloud-service-key.json или stat gcloud-service-key.json, чтобы увидеть, является ли файл пустым или искаженным JSON.   -  person Ahmet Alp Balkan    schedule 10.12.2019
comment
@ AhmetB-Google Конечно, позволь мне это сделать   -  person vijayakumarpsg587    schedule 10.12.2019
comment
@ AhmetB-Google: Я внес изменения и на этот раз могу получить доступ к ключевому файлу. Как вы отметили, это проблема. Предоставил ответ в части РЕДАКТИРОВАТЬ.   -  person vijayakumarpsg587    schedule 10.12.2019
comment
Привет, Joey587! Пожалуйста, подумайте о том, чтобы добавить часть своего вопроса "Правка" в качестве самостоятельного ответа и отметьте ее как правильную. Так что другие могут быстро увидеть, что у этой проблемы есть решение.   -  person Juancki    schedule 12.12.2019


Ответы (1)


Как указал @ AhmetB-Google, проблема заключалась в том, что служебный ключ не загружался должным образом в env vars. Итак, я внес такие изменения. Всегда желательно закодировать и добавить его в env vars. Итак, в настройках проекта у меня есть ключ с именем -GCLOUD_SERVICE_KEY, и вот моя конфигурация circleci

version: 2.1
orbs:
  gcp-gcr: circleci/[email protected]
  cloudrun: circleci/[email protected]
  gcp-gke: circleci/[email protected]
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
person vijayakumarpsg587    schedule 13.12.2019