因此,我非常棘手,但是离通过Google的Cloudbuild与Clasp推送和部署Google Apps脚本项目很近。因此,push和deploy命令来自Googles Clasp cli,它要求您使用clasp login
使用Google凭据登录。登录名将使用您的凭据在您的主目录中创建一个名为~/.clasprc.json
的文件。这是 push 和部署所必需的。在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。但是,您实际上并不需要该项目,只需在您的本地计算机上按照以下步骤进行复制即可。
npm install -g @google/clasp
扣紧cli clasp login
以获取.clasprc.json
并使用GCP clasp create --title "My Script" --type webapp
并记下脚本ID 以下步骤是导致问题的文件。只需将它们添加到创建的clasp项目中即可。
6.这是我的Clasp Builder镜像的入口点:
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 "$@"
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'
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
替换为您的实际项目ID。 cd builder && gcloud builds submit --project yourproject --config=cloudbuild.yaml .
yourproject
,并用您实际的脚本ID替换your_script_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的某些链接,但是由于某种原因它们在做什么却无法正常工作。有人看到我不是什么吗?我在这里想念什么?!?!
其他一些相关或从 Unresolved 问题:
最佳答案
好的,因此在进行大量调试之后,我发现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'