web-dev-qa-db-ja.com

cli / rest api / cloud関数を介してGoogle Cloud Buildトリガーを実行するにはどうすればよいですか?

そのようなオプションはありますか?私のユースケースは、本番ビルドのトリガーを実行することです(本番にデプロイします)。理想的には、そのトリガーはチャットボットを介して手動で呼び出されるため、変更をリッスンする必要はありません。

このビデオを見ました ハイブリッドおよびマルチクラウドのお客様向けのCI/CD(Cloud Next '18) APIトリガーのサポートがあることを発表しましたが、それが必要かどうかはわかりません。

7
chriz

私は数日前に同じことをしました。

Gcloudとrestapiを使用してビルドを送信できます

gcloud:

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

Rest API:

このURLに認証トークンを含むJSONとしてcloudbuild.yamlを送信します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
3

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

お役に立てれば。

1
Tobias Ernst

直接呼び出すことができる関数を作成したいだけの場合は、次の2つの選択肢があります。

  1. HTTPトリガー 標準のAPIエンドポイント
  2. pubsubトリガー pubsubトピックにメッセージを送信して呼び出す

1つ目は、より一般的なアプローチです。これは、任意のクライアントが選択したHTTPライブラリを使用して呼び出すことができるWebAPIを効果的に作成しているためです。

1
Doug Stevenson

Curlとjsonペイロードを使用してビルドを手動でトリガーできるはずです。詳細については、 https://cloud.google.com/cloud-build/docs/running-builds/start-build-manually#running_builds を参照してください。

それを前提として、Python Cloud関数を記述して、requestsモジュールを介してcurl呼び出しを複製することができます。

0
Mithrill

経由で関数をトリガーできます

gcloud関数はNAME--data'THING 'を呼び出します

関数内では、GoogleのパブリックAPI内で可能なほとんどすべてのことを実行できます。

gitからGoogleCloud Builderを直接トリガーするだけの場合は、リリースバージョンタグを使用することをお勧めします。そのため、チャットボットはgitのリリースブランチにリリースタグを追加し、その時点でcloud-builderがビルドを開始します。

詳細はこちら https://cloud.google.com/cloud-build/docs/running-builds/automate-builds

0
Dan