Google Apps Script и Cloudbuild CI Войти - PullRequest
       47

Google Apps Script и Cloudbuild CI Войти

3 голосов
/ 24 сентября 2019

Так что я довольно застрял, но так близко к тому, чтобы получить проект Google Apps Script для развертывания и развертывания с помощью Clasp через Googles Cloudbuild.Таким образом, команды push и deploy поступают из Googles Clasp cli, которая требует от вас входа в систему с учетными данными Google с clasp login.Логин создаст файл в вашем домашнем каталоге с именем ~/.clasprc.json с вашими учетными данными.Это необходимо для развертывания и развертывания.В cloudbuild.yaml я создал замену под названием _CLASPRC для хранения содержимого этого файла и использовал свое собственное изображение для записи его в контейнер во время сборки.

Теперь для проблемы я получаюприведенная ниже ошибка при запуске команды push, которая, по сути, является не очень полезным способом сказать, что я не вошел в систему, или любая другая ошибка с .clasprc.json.Поскольку это единственная ошибка, которую я когда-либо получаю, независимо от того, в чем проблема, проблему немного сложно отладить.

Could not read API credentials. Are you logged in globally?

Я пытался поместить .clasprc.json в домашнюю директорию и директорию проекта, но получаю одну и ту же проблему в обоих направлениях.Я почти уверен, что файл записывается в каталог проектов, потому что, когда я пытаюсь запустить его на своем локальном компьютере без .clasp.json, он жалуется, что отсутствует, прежде чем жаловаться, что я не вошел в систему. Когда .clasp.json есть толькожалуется, что я не вошел в систему.

Этот проект - только мой личный проект, и все это с открытым исходным кодом на Github, так что здесь есть ссылка на реальный проект, если вам нужна ссылка на реальный код. Мой Lil Admin и строитель, который я использовал Мои Строители .Однако вам действительно не нужен проект, чтобы воспроизвести, следуйте инструкциям ниже на вашем местном.

  1. убедитесь, что создан проект GCP, а gcloud cli с включенным API сценариев Apps
  2. имеет clasp cli с npm install -g @google/clasp
  3. clasp login для получения .clasprc.json и авторизации с GCP
  4. clasp create --title "My Script" --type webapp и обратите внимание на идентификатор сценариев
  5. , связывающий проект сценариев приложений с вашим проектом GCP

Следующие шаги представляют собой файлы, которые приводят к проблеме.Просто добавьте их в созданный проект clasp.6. Вот точка входа для моего Clasp Builder Image:

builder/clasp_ci.sh

#!/bin/bash

# if there is a _CLASPRC var and no .clasprc.json file
if [ ! -z "${_CLASPRC}" -a ! -f "${HOME}/.clasprc.json" ]; then
echo $_CLASPRC > "$HOME/.clasprc.json"
fi

# if there is a _SCRIPT_ID and PROJECT_ID and no .clasp.json file
if [ ! -z "${_SCRIPT_ID}" -a ! -z "$PROJECT_ID" -a ! -f ".clasp.json" ]; then
cat > '.clasp.json' << EOF
{"scriptId":"$_SCRIPT_ID","projectId": "$PROJECT_ID"}
EOF
fi

# pass args to clasp
clasp "$@"
Строитель Dockerfile

builder/Dockerfile

# use Node LTS (Boron)
FROM node:8.16.1

COPY clasp_ci.sh /usr/local/bin/clasp_ci

# install Clasp CLI
RUN npm install -g @google/clasp && \
    chmod +x /usr/local/bin/clasp_ci

ENTRYPOINT ["/usr/local/bin/clasp_ci"]
теперь облако строит, чтобы подтолкнуть конструктор застежки

builder/cloudbuild.yaml

steps:
  - name: 'gcr.io/cloud-builders/docker'
    args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/clasp', '.' ]
images:
  - 'gcr.io/$PROJECT_ID/clasp'
мой cloudbuild ci для проекта сценария приложений.Если вы создаете новый проект, которому нужно следовать, вам не нужны ни шаги сборки, ни клавиша dir в шагах push и deploy.Это довольно специфично для проекта в ссылках на мой проект выше.

cloudbuild.yaml

steps:

- id: install
  name: 'gcr.io/cloud-builders/npm'
  args: ['install']

- id: build-server
  name: 'gcr.io/cloud-builders/npm'
  args: ['run','gas']
  env:
    - 'NODE_ENV=production'

- id: build-client
  name: 'gcr.io/cloud-builders/npm'
  args: ['run','prod']
  env:
    - 'NODE_ENV=production'

- id: push
  name: 'gcr.io/$PROJECT_ID/clasp'
  dir: './dist/gas'
  args: ['push','-f']

- id: deploy
  name: 'gcr.io/$PROJECT_ID/clasp'
  dir: './dist/gas'
  args: ['deploy','$TAG_NAME']

substitutions:
  _CLASPRC: 'your clasp rc file in your home dir after logging in locally'
  _SCRIPT_ID: 'your script id of the apps script project to deploy to'
Вот команда для загрузки сборщика.Обязательно замените yourproject на ваш фактический идентификатор проекта.
cd builder && gcloud builds submit --project yourproject --config=cloudbuild.yaml .
команда, чтобы наконец получить ошибку.Обязательно замените yourproject на действительный идентификатор проекта, а your_script_id - на действительный идентификатор сценария, который вы приняли к сведению на шаге 4.
gcloud builds submit --project yourproject --config=cloudbuild.yaml . \
--substitutions=_CLASPRC="$(cat $HOME/.clasprc.json)" \
--substitutions=_SCRIPT_ID="your_script_id"

Я также пытался использовать учетные данные, созданные извход в систему с OAuth, но я получил ту же ошибку.Однако это может быть полезно при решении проблемы. Документы для Clasp Run с OAuth

Надеюсь, кто-нибудь может помочь мне заставить это работать.Если это так, то это будет первая документация в Интернете для Cloudbuild CI с Apps Script и Clasp, так как я не могу найти никого, кто бы делал это где-либо.Я нашел некоторые ссылки, используя Трэвиса и Дженкинса, но то, что они делают по какой-то причине, не работает.Кто-нибудь видит что-то, чем я не являюсь?Что мне здесь не хватает?!?!

Некоторые другие, несколько связанные или никогда не решаемые проблемы:

1 Ответ

1 голос
/ 24 сентября 2019

ОК, поэтому после нескольких отладок я обнаружил, что переменные подстановки в облачном билде не переводятся в переменные среды в контейнере.Вы должны вручную установить переменные окружения для переменных подстановки, и тогда контейнер получит необходимые переменные.

Вот обновленная точка входа в CI:

builder/clasp_si.sh

#!/bin/bash

if [ ! -z "${CLASPRC}" -a ! -f "${HOME}/.clasprc.json" ]; then
echo $CLASPRC > "${HOME}/.clasprc.json"
fi

if [ ! -z "${SCRIPT_ID}" -a ! -z "$PROJECT_ID" -a ! -f ".clasp.json" ]; then
cat > '.clasp.json' << EOF
{"scriptId":"$SCRIPT_ID","projectId": "$PROJECT_ID"}
EOF
fi

clasp "$@"

, а затем обновленная конфигурация cloudbuild:

cloudbuild.yaml

steps:

- id: install
  name: 'gcr.io/cloud-builders/npm'
  args: ['install']

- id: build-server
  name: 'gcr.io/cloud-builders/npm'
  args: ['run','gas']
  env:
    - 'NODE_ENV=production'

- id: build-client
  name: 'gcr.io/cloud-builders/npm'
  args: ['run','prod']
  env:
    - 'NODE_ENV=production'

- id: push
  name: 'gcr.io/$PROJECT_ID/clasp'
  dir: './dist/gas'
  args: ['push','-f']
  env:
    - 'CLASPRC=$_CLASPRC'
    - 'SCRIPT_ID=$_SCRIPT_ID'
    - 'PROJECT_ID=$PROJECT_ID'

- id: deploy
  name: 'gcr.io/$PROJECT_ID/clasp'
  dir: './dist/gas'
  args: ['deploy','$TAG_NAME']
  env:
    - 'CLASPRC=$_CLASPRC'
    - 'SCRIPT_ID=$_SCRIPT_ID'
    - 'PROJECT_ID=$PROJECT_ID'

substitutions:
  _CLASPRC: 'your clasp rc file in your home dir after logging in locally'
  _SCRIPT_ID: 'your script id of the apps script project to deploy to'
...