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

前端 未结 6 1116
野性不改
野性不改 2021-02-09 01:53

Is there such an option? My use case would be running a trigger for a production build (deploys to production). Ideally, that trigger doesn\'t need to listen to any change since

相关标签:
6条回答
  • 2021-02-09 02:05

    If you just want to create a function that you can invoke directly, you have two choices:

    1. An HTTP trigger with a standard API endpoint
    2. A pubsub trigger that you invoke by sending a message to a pubsub topic

    The first is the more common approach, as you are effectively creating a web API that any client can call with an HTTP library of their choice.

    0 讨论(0)
  • 2021-02-09 02:14

    I did same thing few days ago.

    You can submit your builds using gcloud and rest api

    gcloud:

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

    Rest API:

    Send you cloudbuild.yaml as JSON with Auth Token to this url https://cloudbuild.googleapis.com/v1/projects/standf-188123/builds?alt=json

    example 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"]
    

    example 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"}]}
    
    0 讨论(0)
  • 2021-02-09 02:15

    you can trigger a function via

    gcloud functions call NAME --data 'THING'

    inside your function you can do pretty much anything possibile within Googles Public API's

    if you just want to directly trigger Google Cloud Builder from git then its probably advisable to use Release version tags - so your chatbot might add a release tag to your release branch in git at which point cloud-builder will start the build.

    more info here https://cloud.google.com/cloud-build/docs/running-builds/automate-builds

    0 讨论(0)
  • 2021-02-09 02:21

    You can use google client api to create build jobs with 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, [])
    

    Here is the documentation so that you can implement more functionality: https://cloud.google.com/cloud-build/docs/api

    Hope this helps.

    0 讨论(0)
  • 2021-02-09 02:24

    You should be able to manually trigger a build using curl and a json payload. For details see: https://cloud.google.com/cloud-build/docs/running-builds/start-build-manually#running_builds.

    Given that, you could write a Python Cloud function to replicate the curl call via the requests module.

    0 讨论(0)
  • 2021-02-09 02:27

    This now seems to be possible via API:

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

    request.json:

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

    curl request (with using a gcloud command):

    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
    
    0 讨论(0)
提交回复
热议问题