运行 从 bitbucket 到 GCP 的管道出错

Error while running pipeline from bitbucket to GCP

我正在尝试 运行 从 bitbucket 到 GCP 的管道。这是我的管道配置:

image: node:10.15.3

pipelines:
  default:
    - parallel:
        - step:
            name: Build and Test
            caches:
              - node
            script:
              - npm install
        - step:
            name: Deploy
            deployment: staging
            script:
            - curl -o /tmp/google-cloud-sdk.tar.gz https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-347.0.0-linux-x86_64.tar.gz
            - tar -xvf /tmp/google-cloud-sdk.tar.gz -C /tmp/
            - /tmp/google-cloud-sdk/install.sh -q
            - source /tmp/google-cloud-sdk/path.bash.inc
            - gcloud -v
            - echo "${KEY_FILE}" | base64 --decode --ignore-garbage > ./gcloud-api-key.json
            - gcloud auth activate-service-account --key-file gcloud-api-key.json
            - echo "$(gcloud auth list)"
            - gcloud config unset project
            - gcloud config set project $PROJECT_ID
            - echo "GCLOUD" "$(gcloud iam service-accounts list)"
            - echo "$(gcloud projects list)"
            #- gcloud auth login
            - gcloud app deploy  # getting error here

在 GCP 仪表板上,我从顶部下拉菜单中选择了我的项目并创建了服务帐户。我的服务帐户拥有这些权限:

我已经下载了服务帐户 json 并在使用 base64 编码后将环境变量 KEY_FILE 添加到 bitbucket(执行 base64 <service-account>.json 并将输出粘贴到变量)。 PROJECT_ID 变量包含来自 GCP 的项目 ID。

为管道命令添加输出:

gcloud auth activate-service-account --key-file gcloud-api-key.json

Activated service account credentials for: [service-account-name@project-id.iam.gserviceaccount.com]

echo "$(gcloud auth list)"

To set the active account, run: $ gcloud config set account ACCOUNT

ACTIVE ACCOUNT

  •    service-account-name@project-id.iam.gserviceaccount.com
    

gcloud config unset project

Unset property [core/project].

gcloud config set project $PROJECT_ID

Updated property [core/project]. WARNING: You do not appear to have access to project [PROJECT_ID] or it does not exist.

echo "$(gcloud projects list)"

Listed 0 items.

gcloud app deploy

ERROR: (gcloud.app.deploy) Permissions error fetching application

经过几个小时的研究,我无法解决问题。任何输入都会有所帮助。

您应该能够从任何 机器运行 脚本,这将有助于调试; 运行 它在本地(可能在 'clean' 容器内)发现错误。

您包含引用 service-account-name@project-id.iam.gserviceaccount.comiam.gserviceaccount.com 的输出建议使用用户创建的服务帐户。

但是,您在屏幕截图中引用的帐户是 App Engine 默认服务帐户 appspot.gserviceaccount.com

您可能已经为它创建了一个服务帐户和一个密钥,但没有为其分配任何权限。这将解释错误。

服务帐户由特定项目拥有,您可以使用以下方法列出特定项目中的服务帐户:

PROJECT=[[YOUR-PROJECT-ID]]

gcloud iam service-accounts list \
--project=${PROJECT}

您可以使用以下方式列出项目的权限:

gcloud projects get-iam-policy ${PROJECT}

NOTE Service Accounts must be role'd on every project or project resources on which the account needs permissions.

NOTE To list projects, an account requires the IAM permission resourcemanager.projects.list. This must be enabled on an organization or folder link

正如@DazWilkin 所说,当服务帐户处于活动状态时尝试激活项目 (gcloud config set project $PROJECT_ID) 时会出现此问题,因为服务帐户仅对添加了它的项目具有权限。您可以在激活服务帐户(即在 gcloud auth activate-service-account --key-file gcloud-api-key.json 之后)后立即使用命令 gcloud projects list 进行检查,它会显示一个列表,其中包含活动帐户可以访问的所有项目。如果您想使用其他项目的服务帐户,则必须将其添加到每个项目中(检查此 )。