7

因此,我非常难以通过 Google 的 Cloudbuild 获得一个 Google Apps 脚本项目来使用 Clasp 推送和部署。所以推送和部署命令来自谷歌的 Clasp cli,它要求你使用你的谷歌凭据登录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和我使用的构建器My Builders。但是,您确实不需要该项目,请按照以下步骤在您的本地进行重现。

  1. 确保创建了 GCP 项目并启用了 Apps Script API的gcloud cli
  2. 有扣子clinpm install -g @google/clasp
  3. clasp login.clasprc.json使用 GCP获取和身份验证
  4. clasp create --title "My Script" --type webapp并记下 Scripts ID
  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 "$@"
  1. 建设者 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"]
  1. 现在 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'
  1. 我用于应用程序脚本项目的 cloudbuild ci。如果您要创建一个新项目,则不需要构建步骤,也不需要and步骤dir中的键。这对于上面我的项目链接中的项目非常具体。pushdeploy

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'
  1. 这是加载构建器的命令。确保替换yourproject为您的实际项目 ID。
cd builder && gcloud builds submit --project yourproject --config=cloudbuild.yaml .
  1. 最终得到错误的命令。确保替换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 登录创建的凭据,但我得到了同样的错误。但是,这可能有助于解决问题。使用 OAuth 运行 Clasp 的文档

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

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

4

1 回答 1

4

好的,所以经过一堆调试后,我发现 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'
于 2019-09-24T18:01:03.240 回答