如何通过 cli / rest api / 云函数 运行 Google Cloud Build 触发器?
How to run a Google Cloud Build trigger via cli / rest api / cloud functions?
有这样的选择吗?我的用例是 运行 生产构建(部署到生产)的触发器。理想情况下,该触发器不需要监听任何更改,因为它是通过聊天机器人手动调用的。
我看到这个视频 CI/CD for Hybrid and Multi-Cloud Customers (Cloud Next '18) 宣布有一个 API 触发支持,我不确定这是否是我需要的。
您可以通过
触发一个功能
gcloud 函数调用 NAME --data 'THING'
在您的函数中,您可以在 Google 秒 Public API 的
内做几乎所有可能的事情
如果您只想从 git 直接触发 Google Cloud Builder,那么建议使用发布版本标签 - 因此您的聊天机器人可能会向 [=] 中的发布分支添加发布标签23=] cloud-builder 将在此时开始构建。
更多信息在这里https://cloud.google.com/cloud-build/docs/running-builds/automate-builds
如果您只想创建一个可以直接调用的函数,您有两种选择:
- 具有标准 API 端点的 HTTP trigger
- 您通过向 pubsub 主题发送消息来调用的 pubsub trigger
第一种是更常见的方法,因为您正在有效地创建一个 Web API,任何客户端都可以使用他们选择的 HTTP 库调用该 Web。
几天前我也做了同样的事情。
您可以使用 gcloud 和 rest 提交您的构建 api
gcloud:
gcloud builds submit --no-source --config=cloudbuild.yaml --async --format=json
休息API:
以 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"}]}
您应该能够使用 curl 和 json 负载手动触发构建。
详情见:https://cloud.google.com/cloud-build/docs/running-builds/start-build-manually#running_builds.
鉴于此,您可以编写一个 Python 云函数来通过请求模块复制 curl 调用。
现在似乎可以通过 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
您可以使用 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
希望对您有所帮助。
有这样的选择吗?我的用例是 运行 生产构建(部署到生产)的触发器。理想情况下,该触发器不需要监听任何更改,因为它是通过聊天机器人手动调用的。
我看到这个视频 CI/CD for Hybrid and Multi-Cloud Customers (Cloud Next '18) 宣布有一个 API 触发支持,我不确定这是否是我需要的。
您可以通过
触发一个功能gcloud 函数调用 NAME --data 'THING'
在您的函数中,您可以在 Google 秒 Public API 的
内做几乎所有可能的事情如果您只想从 git 直接触发 Google Cloud Builder,那么建议使用发布版本标签 - 因此您的聊天机器人可能会向 [=] 中的发布分支添加发布标签23=] cloud-builder 将在此时开始构建。
更多信息在这里https://cloud.google.com/cloud-build/docs/running-builds/automate-builds
如果您只想创建一个可以直接调用的函数,您有两种选择:
- 具有标准 API 端点的 HTTP trigger
- 您通过向 pubsub 主题发送消息来调用的 pubsub trigger
第一种是更常见的方法,因为您正在有效地创建一个 Web API,任何客户端都可以使用他们选择的 HTTP 库调用该 Web。
几天前我也做了同样的事情。
您可以使用 gcloud 和 rest 提交您的构建 api
gcloud:
gcloud builds submit --no-source --config=cloudbuild.yaml --async --format=json
休息API:
以 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"}]}
您应该能够使用 curl 和 json 负载手动触发构建。 详情见:https://cloud.google.com/cloud-build/docs/running-builds/start-build-manually#running_builds.
鉴于此,您可以编写一个 Python 云函数来通过请求模块复制 curl 调用。
现在似乎可以通过 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
您可以使用 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
希望对您有所帮助。