因此,我非常棘手,但是离通过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。但是,您实际上并不需要该项目,只需在您的本地计算机上按照以下步骤进行复制即可。
  • 确保已创建GCP项目,并且已启用了Apps Script API的gcloud cli
  • 带有npm install -g @google/clasp扣紧cli
  • 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镜像的入口点:
    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 "$@"
    
  • build 者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来 push 搭扣生成器
  • builder/cloudbuild.yaml
    steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/clasp', '.' ]
    images:
      - 'gcr.io/$PROJECT_ID/clasp'
    
  • 我的appbuild脚本项目的cloudbuild ci。如果您要进行一个新项目,则不需要dirpush步骤中的构建步骤或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 .
    
  • 该命令最终得到错误。确保用您在步骤4中记下的实际项目ID替换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 问题:
  • 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
  • 最佳答案

    好的,因此在进行大量调试之后,我发现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'
    

    08-17 09:17