繁体   English   中英

如何通过 cli / rest api / 云功能运行 Google Cloud Build 触发器?

[英]How to run a Google Cloud Build trigger via cli / rest api / cloud functions?

有这样的选择吗? 我的用例将运行生产构建的触发器(部署到生产)。 理想情况下,该触发器不需要监听任何更改,因为它是通过聊天机器人手动调用的。

我看到这个视频CI/CD 用于混合和多云客户 (Cloud Next '18)宣布有 API 触发器支持,我不确定这是否是我需要的。

几天前我做了同样的事情。

您可以使用gcloud和rest api提交构建

gcloud:

gcloud builds submit --no-source  --config=cloudbuild.yaml --async --format=json

休息API:

使用Auth Token将带有JSON的cloudbuild.yaml发送到此URL https://cloudbuild.googleapis.com/v1/projects/standf-188123/builds?alt=json

示例cloudbuild.yaml:

steps:

- name: 'gcr.io/cloud-builders/docker'
  id: Docker Version
  args: ["version"]

- name: 'alpine'
  id:  Hello Cloud Build
  args: ["echo", "Hello Cloud Build"]

例子rest_json_body:

{"steps": [{"args": ["version"], "id": "Docker Version", "name": "gcr.io/cloud-builders/docker"}, {"args": ["echo", "Hello Cloud Build"], "id": "Hello Cloud Build", "name": "alpine"}]}

现在似乎可以通过API:

https://cloud.google.com/cloud-build/docs/api/reference/rest/v1/projects.triggers/run

request.json:

{
  "projectId": "*****",
  "commitSha": "************"
}

curl请求(使用gcloud命令):

PROJECT_ID="********" TRIGGER_ID="*******************"; curl -X POST -T request.json -H "Authorization: Bearer $(gcloud config config-helper \
    --format='value(credential.access_token)')" \
    https://cloudbuild.googleapis.com/v1/projects/"$PROJECT_ID"/triggers/"$TRIGGER_ID":run

如果您只想创建一个可以直接调用的函数,您有两个选择:

  1. 具有标准API端点的HTTP触发器
  2. 通过向pubsub主题发送消息来调用的pubsub触发器

第一种是更常见的方法,因为您有效地创建了一个Web API,任何客户端都可以使用他们选择的HTTP库调用它。

您可以使用google客户端API通过python创建构建作业:

import operator
from functools import reduce
from typing import Dict, List, Union

from google.oauth2 import service_account
from googleapiclient import discovery


class GcloudService():
    def __init__(self, service_token_path, project_id: Union[str, None]):
        self.project_id = project_id
        self.service_token_path = service_token_path
        self.credentials = service_account.Credentials.from_service_account_file(self.service_token_path)


class CloudBuildApiService(GcloudService):
    def __init__(self, *args, **kwargs):
        super(CloudBuildApiService, self).__init__(*args, **kwargs)

        scoped_credentials = self.credentials.with_scopes(['https://www.googleapis.com/auth/cloud-platform'])
        self.service = discovery.build('cloudbuild', 'v1', credentials=scoped_credentials, cache_discovery=False)

    def get(self, build_id: str) -> Dict:
        return self.service.projects().builds().get(projectId=self.project_id, id=build_id).execute()

    def create(self, image_name: str, gcs_name: str, gcs_path: str, env: Dict = None):
        args: List[str] = self._get_env(env) if env else []
        opt_params: List[str] = [
            '-t', f'gcr.io/{self.project_id}/{image_name}',
            '-f', f'./{image_name}/Dockerfile',
            f'./{image_name}'
        ]
        build_cmd: List[str] = ['build'] + args + opt_params
        body = {
            "projectId": self.project_id,
            "source": {
                'storageSource': {
                    'bucket': gcs_name,
                    'object': gcs_path,
                }
            },
            "steps": [
                {
                    "name": "gcr.io/cloud-builders/docker",
                    "args": build_cmd,
                },
            ],
            "images": [
                [
                    f'gcr.io/{self.project_id}/{image_name}'
                ]
            ],
        }
        return self.service.projects().builds().create(projectId=self.project_id, body=body).execute()

    def _get_env(self, env: Dict) -> List[str]:
        env: List[str] = [['--build-arg', f'{key}={value}'] for key, value in env.items()]
        # Flatten array
        return reduce(operator.iconcat, env, [])

以下是文档,您可以实现更多功能: https//cloud.google.com/cloud-build/docs/api

希望这可以帮助。

你可以通过触发功能

gcloud函数调用NAME --data'THING'

在你的功能中,你可以在Googles Public API中做任何可能的事情

如果你只想从git直接触发Google Cloud Builder,那么可能建议使用Release版本标签 - 所以你的聊天机器人可能会在git中向你的发布分支添加一个发布标签,此时cloud-builder将启动构建。

更多信息,请访问https://cloud.google.com/cloud-build/docs/running-builds/automate-builds

您应该能够使用curl和json有效负载手动触发构建。 有关详细信息,请参阅: https//cloud.google.com/cloud-build/docs/running-builds/start-build-manually#running_builds

鉴于此,您可以编写Python Cloud函数以通过请求模块复制curl调用。

我正在寻找同样的东西(2022 年秋季),虽然我还没有测试过,但我想在忘记之前回答。 它现在似乎可以在gcloud beta builds triggers run TRIGGER中使用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM