如何从另一个项目访问GCP云源代码库?

15

我有项目A和项目B。

我在项目A上使用GCP Cloud Source Repository作为我的“origin”远程仓库。

我使用Cloud Build,并配置了一个触发器,以便在该代码库的“develop”分支上进行更改时触发构建。作为构建的一部分,我使用gcloud builder将某些东西部署到项目A。

现在,我想在项目B上运行相同的构建流程。也许是相同的分支,也可能是不同的分支(即“release-*”)。最终,希望使用gcloud builder将某些内容部署到项目B。

问题是,当我在项目B中(Google Cloud Console中),我甚至看不到项目A中的代码库。它要求我“连接代码库”,但我只能选择GitHub或Bitbucket镜像的代码库。选项“Cloud Source Repositories”已被禁用,告诉我它们“已经连接”。很显然,这两个项目没有连在一起。

我可以在项目B上设置一个新的代码库,并将代码推送到两个代码库,但这似乎效率低下(而且长期来看可能无法持续)。有趣的是,使用外部的Bitbucket/GitHub作为origin并在两个项目中镜像,可以轻松地实现这样的设置。

在Google Cloud Platform中,是否有可能不使用外部依赖项实现此类操作?

我也尝试将所有的项目A都运行并设置一个单独的触发器来部署到项目B(我使用替换来管理),但由于权限问题失败了。Cloud Builds似乎始终会以Cloud Build服务帐户运行,您可以管理该帐户的角色,但我无法看到如何使其访问其他项目。此外,在这种情况下,两个构建将在单个构建历史记录中难以区分,这不是理想的。

嗨,你选择了什么方法来解决这个问题? - Madhi
1
@Madhi 我放弃了这种方法,继续使用现有的本地基础设施来管理我们的构建。我相信在我们的 GCP 结构的更高层级上设置共享 repo 是可能的,但我没有那里的访问权限,也没有人对探索这个感兴趣。 - ci_
1
有一个有关GCP的功能请求已经开启了! https://issuetracker.google.com/issues/119569442 请投票(开始),谢谢! - Alexandre Paes
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服务帐户授予权限,以将源代码推送到其他项目的源代码库中。


1
你好,这是将项目A的代码库复制到项目B的推荐方法吗? - Madhi

2

如你所说,你可以将代码库托管在BitBucket/Github之外,并将其同步到每个项目中,但是你需要为每次构建额外付费。

否则,你可以使用第三方服务来在外部构建你的代码库,并将结果部署到任何你想要的地方,例如查看CircleCI或类似的服务。

你可以授予权限让它可以引用另一个项目的资源进行构建,但我会将它们分开以尽量减少复杂性。


1

我的解决方案:

  1. 从服务A中,在分支release-*上创建新的Cloud Build,构建配置指定$_PROJECT_ID项目B的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://istack.dev59.com/XhRJ4.webp

我无法让它工作……你能更好地描述一下你是如何做到的吗?当我尝试在我的云构建YAML中添加$ _PROJECT_ID时,它会显示该值不存在。 - nicolasassi
嗨@nicolasassi,您需要在Cloud Build中添加一个变量名为_PROJECT_ID - Hung Hoang

0

很遗憾,谷歌似乎没有在源代码库中提供该功能(如果可以的话会很棒)。

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

编辑

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

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接