Google Cloud Build Operators

The Google Cloud Build is a service that executes your builds on Google Cloud Platform infrastructure. Cloud Build can import source code from Google Cloud Storage, Cloud Source Repositories, execute a build to your specifications, and produce artifacts such as Docker containers or Java archives.

Prerequisite Tasks

To use these operators, you must do a few things:

CloudBuildCancelBuildOperator

Cancels a build in progress.

For parameter definition, take a look at CloudBuildCancelBuildOperator

Using the operator

Cancel a build in progress with the CloudBuildCancelBuildOperator operator.

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

    cancel_build = CloudBuildCancelBuildOperator(
        task_id="cancel_build",
        id_=cast(str, XComArg(create_build_without_wait, key="id")),
        project_id=PROJECT_ID,
    )

You can use Jinja templating with project_id, id_, gcp_conn_id, location parameters which allows you to dynamically determine values. The result is saved to XCom, which allows it to be used by other operators.

CloudBuildCreateBuildOperator

Starts a build with the specified configuration. This generated build ID of the created build, as the result of this operator, is not idempotent.

For parameter definition, take a look at CloudBuildCreateBuildOperator

Build configuration

In order to trigger a build, it is necessary to pass the build configuration.

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

CREATE_BUILD_FROM_STORAGE_BODY = {
    "source": {"storage_source": GCP_SOURCE_ARCHIVE_URL},
    "steps": [{"name": "ubuntu", "args": ["echo", "Hello world", "sleep 200"]}],
}

In addition, a build can refer to source stored in Google Cloud Source Repositories.

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

CREATE_BUILD_FROM_REPO_BODY: dict[str, Any] = {
    "source": {"repo_source": {"repo_name": GCP_SOURCE_REPOSITORY_NAME, "branch_name": "master"}},
    "steps": [{"name": "ubuntu", "args": ["echo", "Hello world", "sleep 200"]}],
}

Read Build Configuration Overview to understand all the fields you can include in a build config file.

Using the operator

Trigger a build is performed with the CloudBuildCreateBuildOperator operator.

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

    create_build_from_storage = CloudBuildCreateBuildOperator(
        task_id="create_build_from_storage",
        project_id=PROJECT_ID,
        build=CREATE_BUILD_FROM_STORAGE_BODY,
    )

You can use deferrable mode for this action in order to run the operator asynchronously:

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

    create_build_from_storage = CloudBuildCreateBuildOperator(
        task_id="create_build_from_storage",
        project_id=PROJECT_ID,
        build=CREATE_BUILD_FROM_STORAGE_BODY,
        deferrable=True,
    )

You can use Jinja templating with project_id, build, gcp_conn_id, impersonation_chain, location parameters which allows you to dynamically determine values. The result is saved to XCom, which allows it to be used by other operators.

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

    create_build_from_storage_result = BashOperator(
        bash_command=f"echo {cast(str, XComArg(create_build_from_storage, key='results'))}",
        task_id="create_build_from_storage_result",
    )

By default, after the build is created, it will wait for the build operation to complete. If there is no need to wait for complete, you can pass wait=False as example shown below.

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

    create_build_without_wait = CloudBuildCreateBuildOperator(
        task_id="create_build_without_wait",
        project_id=PROJECT_ID,
        build=CREATE_BUILD_FROM_REPO_BODY,
        wait=False,
    )

You can use deferrable mode for this action in order to run the operator asynchronously:

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

    create_build_without_wait = CloudBuildCreateBuildOperator(
        task_id="create_build_without_wait",
        project_id=PROJECT_ID,
        build=CREATE_BUILD_FROM_REPO_BODY,
        wait=False,
        deferrable=True,
    )

In order to start a build on Cloud Build you can use a build configuration file. A build config file defines the fields that are needed for Cloud Build to perform your tasks. You can write the build config file using the YAML or the JSON syntax.

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

create_build_from_file = CloudBuildCreateBuildOperator(
    task_id="create_build_from_file",
    project_id=PROJECT_ID,
    build=yaml.safe_load((Path(CURRENT_FOLDER) / "resources" / "example_cloud_build.yaml").read_text()),
    params={"name": "Airflow"},
)

You can use deferrable mode for this action in order to run the operator asynchronously:

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

create_build_from_file_deferrable = CloudBuildCreateBuildOperator(
    task_id="create_build_from_file_deferrable",
    project_id=PROJECT_ID,
    build=yaml.safe_load((Path(CURRENT_FOLDER) / "resources" / "example_cloud_build.yaml").read_text()),
    params={"name": "Airflow"},
    deferrable=True,
)

In addition, a Cloud Build can refer to source stored in Google Cloud Source Repositories. Once build has started, it ill build the code in source repositories.

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

        create_build_from_repo = CloudBuildCreateBuildOperator(
            task_id="create_build_from_repo",
            project_id=PROJECT_ID,
            build=CREATE_BUILD_FROM_REPO_BODY,
        )

You can use deferrable mode for this action in order to run the operator asynchronously:

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

    create_build_from_repo = CloudBuildCreateBuildOperator(
        task_id="create_build_from_repo",
        project_id=PROJECT_ID,
        build=CREATE_BUILD_FROM_REPO_BODY,
        deferrable=True,
    )

CloudBuildCreateBuildTriggerOperator

Creates a new Cloud Build trigger. This generated build trigger ID of the created build trigger, as the result of this operator, is not idempotent.

For parameter definition, take a look at CloudBuildCreateBuildTriggerOperator

Using the operator

Creates a new Cloud Build trigger with the CloudBuildCreateBuildTriggerOperator operator.

tests/system/providers/google/cloud/cloud_build/example_cloud_build_trigger.py[source]

create_build_trigger = CloudBuildCreateBuildTriggerOperator(
    task_id="create_build_trigger", project_id=PROJECT_ID, trigger=create_build_trigger_body
)

You can use Jinja templating with project_id, trigger, gcp_conn_id, location parameters which allows you to dynamically determine values. The result is saved to XCom, which allows it to be used by other operators.

CloudBuildDeleteBuildTriggerOperator

Deletes a Cloud Build trigger by its project ID and trigger ID.

For parameter definition, take a look at CloudBuildDeleteBuildTriggerOperator

Using the operator

Deletes a new Cloud Build trigger with the CloudBuildDeleteBuildTriggerOperator operator.

tests/system/providers/google/cloud/cloud_build/example_cloud_build_trigger.py[source]

delete_build_trigger = CloudBuildDeleteBuildTriggerOperator(
    task_id="delete_build_trigger",
    project_id=PROJECT_ID,
    trigger_id=build_trigger_id,
)

You can use Jinja templating with project_id, trigger_id, gcp_conn_id, location parameters which allows you to dynamically determine values. The result is saved to XCom, which allows it to be used by other operators.

CloudBuildGetBuildOperator

Returns information about a previously requested build.

For parameter definition, take a look at CloudBuildGetBuildOperator

Using the operator

Returns information about a previously requested build with the CloudBuildGetBuildOperator operator.

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

    get_build = CloudBuildGetBuildOperator(
        task_id="get_build",
        id_=cast(str, XComArg(retry_build, key="id")),
        project_id=PROJECT_ID,
    )

You can use Jinja templating with project_id, id_, gcp_conn_id, location parameters which allows you to dynamically determine values. The result is saved to XCom, which allows it to be used by other operators.

CloudBuildGetBuildTriggerOperator

Returns information about a Cloud Build trigger.

For parameter definition, take a look at CloudBuildGetBuildTriggerOperator

Using the operator

Returns information about a Cloud Build trigger with the CloudBuildGetBuildTriggerOperator operator.

tests/system/providers/google/cloud/cloud_build/example_cloud_build_trigger.py[source]

get_build_trigger = CloudBuildGetBuildTriggerOperator(
    task_id="get_build_trigger",
    project_id=PROJECT_ID,
    trigger_id=build_trigger_id,
)

You can use Jinja templating with project_id, trigger_id, gcp_conn_id, location parameters which allows you to dynamically determine values. The result is saved to XCom, which allows it to be used by other operators.

CloudBuildListBuildTriggersOperator

Lists all the existing Cloud Build triggers.

For parameter definition, take a look at CloudBuildListBuildTriggersOperator

Using the operator

Lists all the existing Cloud Build triggers with the CloudBuildListBuildTriggersOperator operator.

tests/system/providers/google/cloud/cloud_build/example_cloud_build_trigger.py[source]

list_build_triggers = CloudBuildListBuildTriggersOperator(
    task_id="list_build_triggers",
    project_id=PROJECT_ID,
    location="global",
    page_size=5,
)

You can use Jinja templating with location, project_id, gcp_conn_id parameters which allows you to dynamically determine values. The result is saved to XCom, which allows it to be used by other operators.

CloudBuildListBuildsOperator

Lists previously requested builds.

For parameter definition, take a look at CloudBuildListBuildsOperator

Using the operator

Lists previously requested builds with the CloudBuildListBuildsOperator operator.

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

list_builds = CloudBuildListBuildsOperator(
    task_id="list_builds",
    project_id=PROJECT_ID,
    location="global",
)

You can use Jinja templating with location, project_id, gcp_conn_id parameters which allows you to dynamically determine values. The result is saved to XCom, which allows it to be used by other operators.

CloudBuildRetryBuildOperator

Creates a new build based on the specified build. This method creates a new build using the original build request, which may or may not result in an identical build.

For parameter definition, take a look at CloudBuildRetryBuildOperator

Using the operator

Creates a new build based on the specified build with the CloudBuildRetryBuildOperator operator.

tests/system/providers/google/cloud/cloud_build/example_cloud_build.py[source]

    retry_build = CloudBuildRetryBuildOperator(
        task_id="retry_build",
        id_=cast(str, XComArg(cancel_build, key="id")),
        project_id=PROJECT_ID,
    )

You can use Jinja templating with project_id, id_, gcp_conn_id, location parameters which allows you to dynamically determine values. The result is saved to XCom, which allows it to be used by other operators.

CloudBuildRunBuildTriggerOperator

Runs a trigger at a particular source revision.

For parameter definition, take a look at CloudBuildRunBuildTriggerOperator

Using the operator

Runs a trigger at a particular source revision with the CloudBuildRunBuildTriggerOperator operator.

tests/system/providers/google/cloud/cloud_build/example_cloud_build_trigger.py[source]

run_build_trigger = CloudBuildRunBuildTriggerOperator(
    task_id="run_build_trigger",
    project_id=PROJECT_ID,
    trigger_id=build_trigger_id,
    source=create_build_from_repo_body["source"]["repo_source"],
)

You can use Jinja templating with project_id, trigger_id, source, gcp_conn_id, location parameters which allows you to dynamically determine values. The result is saved to XCom, which allows it to be used by other operators.

CloudBuildUpdateBuildTriggerOperator

Updates a Cloud Build trigger by its project ID and trigger ID.

For parameter definition, take a look at CloudBuildUpdateBuildTriggerOperator

Using the operator

Updates a Cloud Build trigger with the CloudBuildUpdateBuildTriggerOperator operator.

tests/system/providers/google/cloud/cloud_build/example_cloud_build_trigger.py[source]

create_build_trigger = CloudBuildCreateBuildTriggerOperator(
    task_id="create_build_trigger", project_id=PROJECT_ID, trigger=create_build_trigger_body
)

You can use Jinja templating with project_id, trigger_id, trigger, gcp_conn_id, location parameters which allows you to dynamically determine values. The result is saved to XCom, which allows it to be used by other operators.

Reference

For further information, look at:

Was this entry helpful?