Google Apps 脚本和 Cloudbuild CI 登录

Posted

技术标签:

【中文标题】Google Apps 脚本和 Cloudbuild CI 登录【英文标题】:Google Apps Script and Cloudbuild CI Login 【发布时间】:2020-01-24 20:12:25 【问题描述】:

因此,我非常难以获得通过 Google Cloudbuild 使用 Clasp 推送和部署 Google Apps 脚本项目。所以推送和部署命令来自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 上都是开源的,所以如果你想参考实际代码,这里是实际项目的链接。 My Lil Admin 和我使用的构建器 My Builders。但是,您确实不需要该项目,请按照以下步骤在您的本地进行重现。

    确保已创建 GCP 项目并启用了 Apps Script API 的 gcloud cli 有npm install -g @google/clasp的clisp clasp login 获取 .clasprc.json 并使用 GCP 进行身份验证 clasp create --title "My Script" --type webapp 并记下脚本 ID associate the apps script project with your GCP project

以下步骤是导致问题的文件。只需将它们添加到创建的 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"]
    现在 cloudbuild 将推送 clasp builder

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 用于应用程序脚本项目。如果您要创建一个新项目,则不需要构建步骤,也不需要pushdeploy 步骤中的dir 键。这对于上面我的项目链接中的项目非常具体。

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 替换为您的实际项目 ID。
cd builder && gcloud builds submit --project yourproject --config=cloudbuild.yaml .
    最终得到错误的命令。确保将 yourproject 替换为您的实际项目 ID,并将 your_script_id 替换为您在第 4 步中记下的实际脚本 ID。
gcloud builds submit --project yourproject --config=cloudbuild.yaml . \
--substitutions=_CLASPRC="$(cat $HOME/.clasprc.json)" \
--substitutions=_SCRIPT_ID="your_script_id"

我也尝试过使用通过 OAuth 登录创建的凭据,但我得到了同样的错误。但是,这可能有助于解决问题。 Docs for Clasp Run with OAuth

希望有人可以帮助我完成这项工作。如果是这样,这将是第一个使用 Apps Script 和 Clasp 的 Cloudbuild CI 在线文档,因为我在任何地方都找不到这样做的人。我找到了一些使用 travis 和 jenkins 的链接,但由于某种原因他们正在做的事情不起作用。有谁看到我不是什么东西?我在这里错过了什么?!?!

其他一些相关或从未解决的问题:

https://github.com/google/clasp/issues/524 https://github.com/google/clasp/blob/master/tests/README.md https://github.com/google/clasp/issues/225 https://github.com/gazf/google-apps-script-ci-starter

【问题讨论】:

【参考方案1】:

好的,所以经过一堆调试后,我发现 cloudbuild 替换变量不会转换为容器中的环境变量。您必须手动将环境变量设置为替换变量,然后容器将获得它需要的变量。

这是更新后的 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'

【讨论】:

以上是关于Google Apps 脚本和 Cloudbuild CI 登录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google Apps 脚本在个人 Google 云端硬盘和团队云端硬盘之间移动文件?

外部编辑器支持Google Apps脚本

要遵循哪个 OAuth 流程? (Google Apps 脚本和 Google Fusion Tables API)

如何使用 Google Apps 脚本将来自 Google 电子表格和 ScriptDB 的数据插入 BigQuery 表

Google 表格中的 Google Apps 脚本是不是有类似悬停的触发器?

Google Apps脚本 - 电子邮件库存通知?