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

Posted

技术标签:

【中文标题】如何通过 cli / rest api / cloud 功能运行 Google Cloud Build 触发器?【英文标题】:How to run a Google Cloud Build trigger via cli / rest api / cloud functions? 【发布时间】:2019-01-25 15:56:20 【问题描述】:

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

我看到这个视频 CI/CD for Hybrid and Multi-Cloud Customers (Cloud Next '18) 宣布支持 API 触发器,我不确定这是否是我需要的。

【问题讨论】:

如果您想运行特定的触发器 ID 而不是等待 repo 上的更改,现在 gcloud cli alpha 支持触发器。 cloud.google.com/sdk/gcloud/reference/alpha/builds/triggerscloud.google.com/sdk/gcloud/reference/alpha/builds/triggers/run 可以分享吗?我看到这是 alpha @guille 来源:github.com/GoogleCloudPlatform/cloud-builders/issues/… 【参考方案1】:

您可以使用 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

希望这会有所帮助。

【讨论】:

【参考方案2】:

现在这似乎可以通过 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

【讨论】:

甚至更好 — 链接文档页面上的“试用此 API”UI 让您可以直接运行它,而无需在终端中设置所有内容! 好点——从cloud build 中的URL 当你edit 触发时。【参考方案3】:

您应该能够使用 curl 和 json 有效负载手动触发构建。 详情见:https://cloud.google.com/cloud-build/docs/running-builds/start-build-manually#running_builds。

鉴于此,您可以编写一个 Python Cloud 函数来通过 requests 模块复制 curl 调用。

【讨论】:

【参考方案4】:

几天前我也做过同样的事情。

您可以使用 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"]

【讨论】:

【参考方案5】:

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

    带有标准 API 端点的 HTTP trigger pubsub trigger,通过向 pubsub 主题发送消息来调用

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

【讨论】:

【参考方案6】:

你可以通过

触发一个函数

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

在您的函数中,您几乎可以在 Google 的公共 API 中做任何可能的事情

如果您只想从 git 直接触发 Google Cloud Builder,那么可能建议使用发布版本标签 - 因此您的聊天机器人可能会在 git 中的发布分支中添加发布标签,此时 cloud-builder 将开始构建。

更多信息在这里https://cloud.google.com/cloud-build/docs/running-builds/automate-builds

【讨论】:

目前,唯一可用的 Google Cloud Builder API 是创建触发器,但不运行它们。我正在考虑用我的聊天机器人推送标签,但我认为我必须先克隆它才能推送标签,这似乎很慢。我正在为我们的聊天机器人使用云功能,不想为此运行专用实例。 我从未尝试过,但我相信您可以将标签添加到提交 ID git tag -a v2.0 COMMIT_HASH 您误会了,您当然可以通过提交哈希进行标记,但这需要先克隆 repo。这使它成为一个缓慢的解决方案,而不是简单地通过 cli/api 触发构建。您是在建议通过云功能或我的聊天机器人进行 git 标记,对吗?这需要手动克隆。

以上是关于如何通过 cli / rest api / cloud 功能运行 Google Cloud Build 触发器?的主要内容,如果未能解决你的问题,请参考以下文章

使用rest api生成jenkins api令牌

Atitit 图像处理之编程之类库调用的接口api cli gui ws rest  attilax大总结.docx

Bitbucket REST Api:如何通过调用 rest api 按日期 desc 对所有分支进行排序?

如何通过 PHP 连接到 Restful API? CDK 全球光速 API

如何通过查询身份验证保护 REST API

如何通过restful api传递部分对象(json)