14

我有项目A和项目B。

我在项目 A 上使用 GCP Cloud Source Repository 作为我的“原始”遥控器。

我使用 Cloud Build 来触发对 repo 的“开发”分支的更改来触发构建。作为构建的一部分,我使用 gcloud 构建器将一些东西部署到项目 A。

现在,我想在项目 B 上运行相同的构建。也许是同一个分支,也许是一个不同的分支(即'release-*')。最后想用gcloud builder将一些东西部署到项目B。

问题是,当我在项目 B(在 Google Cloud Console 中)时,我什至看不到项目 A 中的存储库。它要求我“连接存储库”,但我只能选择 GitHub 或 Bitbucket 存储库进行镜像. “Cloud Source Repositories”选项显示为灰色,告诉我它们“已连接”。显然不是来自另一个项目。

我可以在项目 B 上建立一个新的 repo,然后推送两个 repo,但这似乎效率低下(而且可能不可持续长期)。奇怪的是,使用外部 Bitbucket/GitHub 存储库作为源并在两个项目中镜像,可以轻松实现这样的设置。

在没有外部依赖的谷歌云平台中,这样的事情是否可能发生?

我还尝试在项目 A 中运行我的所有构建,并有一个单独的触发器部署到项目 B(我使用替换来管理它),但它因权限问题而失败。Cloud Builds 似乎总是使用 Cloud Build 服务帐户运行,您可以管理其中的角色,但我看不出如何授予它访问另一个项目的权限。同样在这种情况下,两个构建在单个构建历史中似乎无法区分,这并不理想。

4

4 回答 4

5

我遇到了类似的问题,我通过拥有多个 Cloud Build 文件解决了这个问题。

一个 Cloud Build 文件(当代码被推送到某个分支时触发)专门用于将我的所有源代码复制到新的项目源代码库中,其中它还有自己的 Cloud Build 文件用于部署到该项目。

以下是将源代码复制到另一个项目的 Cloud Build 文件示例:


steps:
  - name: gcr.io/cloud-builders/git
    args: ['checkout', '--orphan', 'temp']
  - name: gcr.io/cloud-builders/git
    args: ['add', '-A']
  - name: gcr.io/cloud-builders/git
    args: ['config', '--global', 'user.name', 'Your Name']
  - name: gcr.io/cloud-builders/git
    args: ['config', '--global', 'user.email', 'Your Email']
  - name: gcr.io/cloud-builders/git
    args: ['commit', '-am', 'latest production commit']
  - name: gcr.io/cloud-builders/git
    args: ['branch', '-D', 'master']
  - name: gcr.io/cloud-builders/git
    args: ['branch', '-m', 'master']
  - name: gcr.io/cloud-builders/git
    args: ['push', '-f', 'https://source.developers.google.com/p/project-prod/r/project-repo', 'master']


这将所有源代码推送到新项目中。

请注意:您需要授予您的 Cloud Build 服务帐户权限才能将源代码推送到其他项目源代码库。

于 2020-01-01T09:47:19.320 回答
2

正如您已经说过的,您可以在 BitBucket/Github 外部托管您的存储库并将它们同步到每个项目,但您需要为每个构建支付额外费用。

您可以使用第三方服务在外部构建您的存储库并将结果部署到您想要的任何地方。查看 CircleCI 或类似的服务。

您可以授予构建权限,使其可以引用来自另一个项目的资源,但我会将它们分开以最大程度地降低复杂性。

于 2019-11-18T19:23:24.123 回答
1

我的解决方案:

  1. 从服务 A,使用 Build Configuration在分支上创建新的 Cloud Build,release-*指定项目 B id$_PROJECT_ID
  2. 在 GCP Cloud Build 定义中,添加新的变量名称_PROJECT_ID项目 B id

注意:请记住项目 B 上项目 A(@cloudbuild.gserviceaccount.com) 的服务帐户的授予权限

cloudbuild.yaml

  - name: gcr.io/cloud-builders/docker
    args:
      - build
      - '--no-cache'
      - '-t'
      - '$_GCR_HOSTNAME/$_PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
      - .
      - '-f'
      - Dockerfile
    id: Build
  - name: gcr.io/cloud-builders/docker
    args:
      - push
      - '$_GCR_HOSTNAME/$_PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
    id: Push
  - name: gcr.io/cloud-builders/gcloud
    args:
      - beta
      - run
      - deploy
      - $_SERVICE_NAME
      - '--platform=managed'
      - '--image=$_GCR_HOSTNAME/$_PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
      - >-
        --labels=managed-by=gcp-cloud-build-deploy-cloud-run,commit-sha=$COMMIT_SHA,gcb-build-id=$BUILD_ID,gcb-trigger-id=$_TRIGGER_ID,$_LABELS
      - '--region=$_DEPLOY_REGION'
      - '--quiet'
      - '--project=$_PROJECT_ID'
    id: Deploy
    entrypoint: gcloud
images:
  - '$_GCR_HOSTNAME/$_PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
options:
  substitutionOption: ALLOW_LOOSE
timeout: '20m'
tags:
  - gcp-cloud-build-deploy-cloud-run
  - gcp-cloud-build-deploy-cloud-run-managed
  - driveit-hp-agreement-mngt-api```


  [1]: https://i.stack.imgur.com/XhRJ4.png
于 2020-12-02T04:59:53.977 回答
0

不幸的是,Google 似乎并没有在 Source Repositories 中提供该功能(如果可以的话,它会摇滚)。

您可以考虑的另一种选择(尽管涉及外部依赖项)是首先将您的源存储库镜像到 GitHub 或 Bitbucket,然后再次镜像回源存储库。这样,对存储库的任何镜像所做的任何更改都将同步。(即在项目 B 中推送的更改将与 Bitbucket 同步,在项目 A 中也是如此)

编辑

为了说明我的替代解决方案,这是一个简单的图表

在此处输入图像描述

于 2019-11-18T16:36:59.407 回答