mr *_*ven 7 continuous-integration google-apps-script google-cloud-platform clasp google-cloud-build
因此,我非常困难,但非常接近于通过 Googles Cloudbuild 使用 Clasp 推送和部署 Google Apps Script 项目。因此推送和部署命令来自Googles Clasp cli,它要求您使用clasp login. 登录将在您的主目录中创建一个~/.clasprc.json使用您的凭据调用的文件。这是推送和部署所必需的。在中,cloudbuild.yaml我创建了一个替换_CLASPRC来保存这个文件的内容,并在运行构建时使用我自己的自定义图像将它写入容器。
现在对于这个问题,当 push 命令运行时,我收到以下错误,这基本上不是说我没有登录或.clasprc.json. 由于这是我遇到的唯一错误,无论问题是什么,这个问题有点难以调试。
Could not read API credentials. Are you logged in globally?
Run Code Online (Sandbox Code Playgroud)
我曾尝试将 放在.clasprc.json主目录和项目目录中,但两种方式都遇到相同的问题。我很确定该文件正在写入项目目录,因为当我尝试在我的本地运行时没有.clasp.json它抱怨它在抱怨我没有登录之前丢失了。当.clasp.json它在那里时它只抱怨我没有登录在。
该项目只是我的一个个人项目,它在 Github 上都是开源的,所以如果你想参考实际代码,这里是实际项目的链接。我的 Lil Admin和我使用的构建器My Builders。但是,您确实不需要该项目,请按照以下步骤在本地进行重现。
npm install -g @google/claspclasp login获得.clasprc.json与GCP权威性clasp create --title "My Script" --type webapp 并记下脚本 ID以下步骤是导致问题的文件。只需将它们添加到创建的扣项目。6. 这是我的 Clasp Builder Image 的入口点:
builder/clasp_ci.sh
Could not read API credentials. Are you logged in globally?
Run Code Online (Sandbox Code Playgroud)
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"]
Run Code Online (Sandbox Code Playgroud)
builder/cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/clasp', '.' ]
images:
- 'gcr.io/$PROJECT_ID/clasp'
Run Code Online (Sandbox Code Playgroud)
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'
Run Code Online (Sandbox Code Playgroud)
yourproject为您的实际项目 ID。cd builder && gcloud builds submit --project yourproject --config=cloudbuild.yaml .
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
我也尝试使用通过 OAuth 登录创建的凭据,但我得到了完全相同的错误。但是,这可能有助于解决问题。使用 OAuth 运行 Clasp 的文档
希望有人可以帮助我完成这项工作。如果是这样,这将是带有 Apps Script 和 Clasp 的 Cloudbuild CI 的第一个在线文档,因为我在任何地方都找不到这样做的人。我发现了一些使用 travis 和 jenkins 的链接,但由于某种原因他们正在做的事情不起作用。有没有人看到我不是什么东西?我在这里错过了什么?!?!
其他一些相关或从未解决的问题:
好的,经过一系列调试后,我发现 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 "$@"
Run Code Online (Sandbox Code Playgroud)
然后是更新的 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'
Run Code Online (Sandbox Code Playgroud)