<commit_before>// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.devtools.cloudbuild.v1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/httpbody.proto";
import "google/api/resource.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";

option csharp_namespace = "Google.Cloud.CloudBuild.V1";
option go_package = "google.golang.org/genproto/googleapis/devtools/cloudbuild/v1;cloudbuild";
option java_multiple_files = true;
option java_package = "com.google.cloudbuild.v1";
option objc_class_prefix = "GCB";
option ruby_package = "Google::Cloud::Build::V1";
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/Network"
  pattern: "projects/{project}/global/networks/{network}"
};
option (google.api.resource_definition) = {
  type: "iam.googleapis.com/ServiceAccount"
  pattern: "projects/{project}/serviceAccounts/{service_account}"
};
option (google.api.resource_definition) = {
  type: "secretmanager.googleapis.com/Secret"
  pattern: "projects/{project}/secrets/{secret}"
};
option (google.api.resource_definition) = {
  type: "secretmanager.googleapis.com/SecretVersion"
  pattern: "projects/{project}/secrets/{secret}/versions/{version}"
};
option (google.api.resource_definition) = {
  type: "cloudkms.googleapis.com/CryptoKey"
  pattern: "projects/{project}/locations/{location}/keyRings/{keyring}/cryptoKeys/{key}"
};

// Creates and manages builds on Google Cloud Platform.
//
// The main concept used by this API is a `Build`, which describes the location
// of the source to build, how to build the source, and where to store the
// built artifacts, if any.
//
// A user can list previously-requested builds or get builds by their ID to
// determine the status of the build.
service CloudBuild {
  option (google.api.default_host) = "cloudbuild.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform";

  // Starts a build with the specified configuration.
  //
  // This method returns a long-running `Operation`, which includes the build
  // ID. Pass the build ID to `GetBuild` to determine the build status (such as
  // `SUCCESS` or `FAILURE`).
  rpc CreateBuild(CreateBuildRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/projects/{project_id}/builds"
      body: "build"
      additional_bindings {
        post: "/v1/{parent=projects/*/locations/*}/builds"
        body: "build"
      }
    };
    option (google.api.method_signature) = "project_id,build";
    option (google.longrunning.operation_info) = {
      response_type: "Build"
      metadata_type: "BuildOperationMetadata"
    };
  }

  // Returns information about a previously requested build.
  //
  // The `Build` that is returned includes its status (such as `SUCCESS`,
  // `FAILURE`, or `WORKING`), and timing information.
  rpc GetBuild(GetBuildRequest) returns (Build) {
    option (google.api.http) = {
      get: "/v1/projects/{project_id}/builds/{id}"
      additional_bindings { get: "/v1/{name=projects/*/locations/*/builds/*}" }
    };
    option (google.api.method_signature) = "project_id,id";
  }

  // Lists previously requested builds.
  //
  // Previously requested builds may still be in-progress, or may have finished
  // successfully or unsuccessfully.
  rpc ListBuilds(ListBuildsRequest) returns (ListBuildsResponse) {
    option (google.api.http) = {
      get: "/v1/projects/{project_id}/builds"
      additional_bindings { get: "/v1/{parent=projects/*/locations/*}/builds" }
    };
    option (google.api.method_signature) = "project_id,filter";
  }

  // Cancels a build in progress.
  rpc CancelBuild(CancelBuildRequest) returns (Build) {
    option (google.api.http) = {
      post: "/v1/projects/{project_id}/builds/{id}:cancel"
      body: "*"
      additional_bindings {
        post: "/v1/{name=projects/*/locations/*/builds/*}:cancel"
        body: "*"
      }
    };
    option (google.api.method_signature) = "project_id,id";
  }

  // 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 triggered builds:
  //
  // * Triggered builds resolve to a precise revision; therefore a retry of a
  // triggered build will result in a build that uses the same revision.
  //
  // For non-triggered builds that specify `RepoSource`:
  //
  // * If the original build built from the tip of a branch, the retried build
  // will build from the tip of that branch, which may not be the same revision
  // as the original build.
  // * If the original build specified a commit sha or revision ID, the retried
  // build will use the identical source.
  //
  // For builds that specify `StorageSource`:
  //
  // * If the original build pulled source from Google Cloud Storage without
  // specifying the generation of the object, the new build will use the current
  // object, which may be different from the original build source.
  // * If the original build pulled source from Cloud Storage and specified the
  // generation of the object, the new build will attempt to use the same
  // object, which may or may not be available depending on the bucket's
  // lifecycle management settings.
  rpc RetryBuild(RetryBuildRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/projects/{project_id}/builds/{id}:retry"
      body: "*"
      additional_bindings {
        post: "/v1/{name=projects/*/locations/*/builds/*}:retry"
        body: "*"
      }
    };
    option (google.api.method_signature) = "project_id,id";
    option (google.longrunning.operation_info) = {
      response_type: "Build"
      metadata_type: "BuildOperationMetadata"
    };
  }

  // Creates a new `BuildTrigger`.
  //
  // This API is experimental.
  rpc CreateBuildTrigger(CreateBuildTriggerRequest) returns (BuildTrigger) {
    option (google.api.http) = {
      post: "/v1/projects/{project_id}/triggers"
      body: "trigger"
    };
    option (google.api.method_signature) = "project_id,trigger";
  }

  // Returns information about a `BuildTrigger`.
  //
  // This API is experimental.
  rpc GetBuildTrigger(GetBuildTriggerRequest) returns (BuildTrigger) {
    option (google.api.http) = {
      get: "/v1/projects/{project_id}/triggers/{trigger_id}"
    };
    option (google.api.method_signature) = "project_id,trigger_id";
  }

  // Lists existing `BuildTrigger`s.
  //
  // This API is experimental.
  rpc ListBuildTriggers(ListBuildTriggersRequest)
      returns (ListBuildTriggersResponse) {
    option (google.api.http) = {
      get: "/v1/projects/{project_id}/triggers"
    };
    option (google.api.method_signature) = "project_id";
  }

  // Deletes a `BuildTrigger` by its project ID and trigger ID.
  //
  // This API is experimental.
  rpc DeleteBuildTrigger(DeleteBuildTriggerRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/projects/{project_id}/triggers/{trigger_id}"
    };
    option (google.api.method_signature) = "project_id,trigger_id";
  }

  // Updates a `BuildTrigger` by its project ID and trigger ID.
  //
  // This API is experimental.
  rpc UpdateBuildTrigger(UpdateBuildTriggerRequest) returns (BuildTrigger) {
    option (google.api.http) = {
      patch: "/v1/projects/{project_id}/triggers/{trigger_id}"
      body: "trigger"
    };
    option (google.api.method_signature) = "project_id,trigger_id,trigger";
  }

  // Runs a `BuildTrigger` at a particular source revision.
  rpc RunBuildTrigger(RunBuildTriggerRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/projects/{project_id}/triggers/{trigger_id}:run"
      body: "source"
    };
    option (google.api.method_signature) = "project_id,trigger_id,source";
    option (google.longrunning.operation_info) = {
      response_type: "Build"
      metadata_type: "BuildOperationMetadata"
    };
  }

  // ReceiveTriggerWebhook [Experimental] is called when the API receives a
  // webhook request targeted at a specific trigger.
  rpc ReceiveTriggerWebhook(ReceiveTriggerWebhookRequest)
      returns (ReceiveTriggerWebhookResponse) {
    option (google.api.http) = {
      post: "/v1/projects/{project_id}/triggers/{trigger}:webhook"
      body: "body"
    };
  }

  // Creates a `WorkerPool` to run the builds, and returns the new worker pool.
  //
  // This API is experimental.
  rpc CreateWorkerPool(CreateWorkerPoolRequest) returns (WorkerPool) {}

  // Returns information about a `WorkerPool`.
  //
  // This API is experimental.
  rpc GetWorkerPool(GetWorkerPoolRequest) returns (WorkerPool) {}

  // Deletes a `WorkerPool` by its project ID and WorkerPool name.
  //
  // This API is experimental.
  rpc DeleteWorkerPool(DeleteWorkerPoolRequest)
      returns (google.protobuf.Empty) {}

  // Update a `WorkerPool`.
  //
  // This API is experimental.
  rpc UpdateWorkerPool(UpdateWorkerPoolRequest) returns (WorkerPool) {}

  // List project's `WorkerPools`.
  //
  // This API is experimental.
  rpc ListWorkerPools(ListWorkerPoolsRequest)
      returns (ListWorkerPoolsResponse) {}
}

// Specifies a build to retry.
message RetryBuildRequest {
  // The name of the `Build` to retry.
  // Format: `projects/{project}/locations/{location}/builds/{build}`
  string name = 3 [(google.api.resource_reference) = {
    type: "cloudbuild.googleapis.com/Build"
  }];

  // Required. ID of the project.
  string project_id = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Build ID of the original build.
  string id = 2 [(google.api.field_behavior) = REQUIRED];
}

// Specifies a build trigger to run and the source to use.
message RunBuildTriggerRequest {
  // Required. ID of the project.
  string project_id = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. ID of the trigger.
  string trigger_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Source to build against this trigger.
  RepoSource source = 3;
}

// Location of the source in an archive file in Google Cloud Storage.
message StorageSource {
  // Google Cloud Storage bucket containing the source (see
  // [Bucket Name
  // Requirements](https://cloud.google.com/storage/docs/bucket-naming#requirements)).
  string bucket = 1;

  // Google Cloud Storage object containing the source.
  //
  // This object must be a gzipped archive file (`.tar.gz`) containing source to
  // build.
  string object = 2;

  // Google Cloud Storage generation for the object. If the generation is
  // omitted, the latest generation will be used.
  int64 generation = 3;
}

// Location of the source in a Google Cloud Source Repository.
message RepoSource {
  // ID of the project that owns the Cloud Source Repository. If omitted, the
  // project ID requesting the build is assumed.
  string project_id = 1;

  // Name of the Cloud Source Repository.
  string repo_name = 2;

  // A revision within the Cloud Source Repository must be specified in
  // one of these ways.
  oneof revision {
    // Regex matching branches to build.
    //
    // The syntax of the regular expressions accepted is the syntax accepted by
    // RE2 and described at https://github.com/google/re2/wiki/Syntax
    string branch_name = 3;

    // Regex matching tags to build.
    //
    // The syntax of the regular expressions accepted is the syntax accepted by
    // RE2 and described at https://github.com/google/re2/wiki/Syntax
    string tag_name = 4;

    // Explicit commit SHA to build.
    string commit_sha = 5;
  }

  // Directory, relative to the source root, in which to run the build.
  //
  // This must be a relative path. If a step's `dir` is specified and is an
  // absolute path, this value is ignored for that step's execution.
  string dir = 7;

  // Only trigger a build if the revision regex does NOT match the revision
  // regex.
  bool invert_regex = 8;

  // Substitutions to use in a triggered build.
  // Should only be used with RunBuildTrigger
  map<string, string> substitutions = 9;
}

// Location of the source in a supported storage service.
message Source {
  // Location of source.
  oneof source {
    // If provided, get the source from this location in Google Cloud Storage.
    StorageSource storage_source = 2;

    // If provided, get the source from this location in a Cloud Source
    // Repository.
    RepoSource repo_source = 3;
  }
}

// An image built by the pipeline.
message BuiltImage {
  // Name used to push the container image to Google Container Registry, as
  // presented to `docker push`.
  string name = 1;

  // Docker Registry 2.0 digest.
  string digest = 3;

  // Output only. Stores timing information for pushing the specified image.
  TimeSpan push_timing = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A step in the build pipeline.
message BuildStep {
  // Required. The name of the container image that will run this particular
  // build step.
  //
  // If the image is available in the host's Docker daemon's cache, it
  // will be run directly. If not, the host will attempt to pull the image
  // first, using the builder service account's credentials if necessary.
  //
  // The Docker daemon's cache will already have the latest versions of all of
  // the officially supported build steps
  // ([https://github.com/GoogleCloudPlatform/cloud-builders](https://github.com/GoogleCloudPlatform/cloud-builders)).
  // The Docker daemon will also have cached many of the layers for some popular
  // images, like "ubuntu", "debian", but they will be refreshed at the time you
  // attempt to use them.
  //
  // If you built an image in a previous build step, it will be stored in the
  // host's Docker daemon's cache and is available to use as the name for a
  // later build step.
  string name = 1;

  // A list of environment variable definitions to be used when running a step.
  //
  // The elements are of the form "KEY=VALUE" for the environment variable "KEY"
  // being given the value "VALUE".
  repeated string env = 2;

  // A list of arguments that will be presented to the step when it is started.
  //
  // If the image used to run the step's container has an entrypoint, the `args`
  // are used as arguments to that entrypoint. If the image does not define
  // an entrypoint, the first element in args is used as the entrypoint,
  // and the remainder will be used as arguments.
  repeated string args = 3;

  // Working directory to use when running this step's container.
  //
  // If this value is a relative path, it is relative to the build's working
  // directory. If this value is absolute, it may be outside the build's working
  // directory, in which case the contents of the path may not be persisted
  // across build step executions, unless a `volume` for that path is specified.
  //
  // If the build specifies a `RepoSource` with `dir` and a step with a `dir`,
  // which specifies an absolute path, the `RepoSource` `dir` is ignored for
  // the step's execution.
  string dir = 4;

  // Unique identifier for this build step, used in `wait_for` to
  // reference this build step as a dependency.
  string id = 5;

  // The ID(s) of the step(s) that this build step depends on.
  // This build step will not start until all the build steps in `wait_for`
  // have completed successfully. If `wait_for` is empty, this build step will
  // start when all previous build steps in the `Build.Steps` list have
  // completed successfully.
  repeated string wait_for = 6;

  // Entrypoint to be used instead of the build step image's default entrypoint.
  // If unset, the image's default entrypoint is used.
  string entrypoint = 7;

  // A list of environment variables which are encrypted using a Cloud Key
  // Management Service crypto key. These values must be specified in the
  // build's `Secret`.
  repeated string secret_env = 8;

  // List of volumes to mount into the build step.
  //
  // Each volume is created as an empty volume prior to execution of the
  // build step. Upon completion of the build, volumes and their contents are
  // discarded.
  //
  // Using a named volume in only one step is not valid as it is indicative
  // of a build request with an incorrect configuration.
  repeated Volume volumes = 9;

  // Output only. Stores timing information for executing this build step.
  TimeSpan timing = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Stores timing information for pulling this build step's
  // builder image only.
  TimeSpan pull_timing = 13 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Time limit for executing this build step. If not defined, the step has no
  // time limit and will be allowed to continue to run until either it completes
  // or the build itself times out.
  google.protobuf.Duration timeout = 11;

  // Output only. Status of the build step. At this time, build step status is
  // only updated on build completion; step status is not updated in real-time
  // as the build progresses.
  Build.Status status = 12 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Volume describes a Docker container volume which is mounted into build steps
// in order to persist files across build step execution.
message Volume {
  // Name of the volume to mount.
  //
  // Volume names must be unique per build step and must be valid names for
  // Docker volumes. Each named volume must be used by at least two build steps.
  string name = 1;

  // Path at which to mount the volume.
  //
  // Paths must be absolute and cannot conflict with other volume paths on the
  // same build step or with certain reserved volume paths.
  string path = 2;
}

// Artifacts created by the build pipeline.
message Results {
  // Container images that were built as a part of the build.
  repeated BuiltImage images = 2;

  // List of build step digests, in the order corresponding to build step
  // indices.
  repeated string build_step_images = 3;

  // Path to the artifact manifest. Only populated when artifacts are uploaded.
  string artifact_manifest = 4;

  // Number of artifacts uploaded. Only populated when artifacts are uploaded.
  int64 num_artifacts = 5;

  // List of build step outputs, produced by builder images, in the order
  // corresponding to build step indices.
  //
  // [Cloud Builders](https://cloud.google.com/cloud-build/docs/cloud-builders)
  // can produce this output by writing to `$BUILDER_OUTPUT/output`.
  // Only the first 4KB of data is stored.
  repeated bytes build_step_outputs = 6;

  // Time to push all non-container artifacts.
  TimeSpan artifact_timing = 7;
}

// An artifact that was uploaded during a build. This
// is a single record in the artifact manifest JSON file.
message ArtifactResult {
  // The path of an artifact in a Google Cloud Storage bucket, with the
  // generation number. For example,
  // `gs://mybucket/path/to/output.jar#generation`.
  string location = 1;

  // The file hash of the artifact.
  repeated FileHashes file_hash = 2;
}

// A build resource in the Cloud Build API.
//
// At a high level, a `Build` describes where to find source code, how to build
// it (for example, the builder image to run on the source), and where to store
// the built artifacts.
//
// Fields can include the following variables, which will be expanded when the
// build is created:
//
// - $PROJECT_ID: the project ID of the build.
// - $PROJECT_NUMBER: the project number of the build.
// - $BUILD_ID: the autogenerated ID of the build.
// - $REPO_NAME: the source repository name specified by RepoSource.
// - $BRANCH_NAME: the branch name specified by RepoSource.
// - $TAG_NAME: the tag name specified by RepoSource.
// - $REVISION_ID or $COMMIT_SHA: the commit SHA specified by RepoSource or
//   resolved from the specified branch or tag.
// - $SHORT_SHA: first 7 characters of $REVISION_ID or $COMMIT_SHA.
message Build {
  option (google.api.resource) = {
    type: "cloudbuild.googleapis.com/Build"
    pattern: "projects/{project}/builds/{build}"
    pattern: "projects/{project}/locations/{location}/builds/{build}"
  };

  // Possible status of a build or build step.
  enum Status {
    // Status of the build is unknown.
    STATUS_UNKNOWN = 0;

    // Build or step is queued; work has not yet begun.
    QUEUED = 1;

    // Build or step is being executed.
    WORKING = 2;

    // Build or step finished successfully.
    SUCCESS = 3;

    // Build or step failed to complete successfully.
    FAILURE = 4;

    // Build or step failed due to an internal cause.
    INTERNAL_ERROR = 5;

    // Build or step took longer than was allowed.
    TIMEOUT = 6;

    // Build or step was canceled by a user.
    CANCELLED = 7;

    // Build was enqueued for longer than the value of `queue_ttl`.
    EXPIRED = 9;
  }

  // Output only. The 'Build' name with format:
  // `projects/{project}/locations/{location}/builds/{build}`, where {build}
  // is a unique identifier generated by the service.
  string name = 45 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Unique identifier of the build.
  string id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. ID of the project.
  string project_id = 16 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Status of the build.
  Status status = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Customer-readable message about the current status.
  string status_detail = 24 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The location of the source files to build.
  Source source = 3;

  // Required. The operations to be performed on the workspace.
  repeated BuildStep steps = 11;

  // Output only. Results of the build.
  Results results = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the request to create the build was received.
  google.protobuf.Timestamp create_time = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which execution of the build was started.
  google.protobuf.Timestamp start_time = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which execution of the build was finished.
  //
  // The difference between finish_time and start_time is the duration of the
  // build's execution.
  google.protobuf.Timestamp finish_time = 8
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Amount of time that this build should be allowed to run, to second
  // granularity. If this amount of time elapses, work on the build will cease
  // and the build status will be `TIMEOUT`.
  //
  // `timeout` starts ticking from `startTime`.
  //
  // Default time is ten minutes.
  google.protobuf.Duration timeout = 12;

  // A list of images to be pushed upon the successful completion of all build
  // steps.
  //
  // The images are pushed using the builder service account's credentials.
  //
  // The digests of the pushed images will be stored in the `Build` resource's
  // results field.
  //
  // If any of the images fail to be pushed, the build status is marked
  // `FAILURE`.
  repeated string images = 13;

  // TTL in queue for this build. If provided and the build is enqueued longer
  // than this value, the build will expire and the build status will be
  // `EXPIRED`.
  //
  // The TTL starts ticking from create_time.
  google.protobuf.Duration queue_ttl = 40;

  // Artifacts produced by the build that should be uploaded upon
  // successful completion of all build steps.
  Artifacts artifacts = 37;

  // Google Cloud Storage bucket where logs should be written (see
  // [Bucket Name
  // Requirements](https://cloud.google.com/storage/docs/bucket-naming#requirements)).
  // Logs file names will be of the format `${logs_bucket}/log-${build_id}.txt`.
  string logs_bucket = 19;

  // Output only. A permanent fixed identifier for source.
  SourceProvenance source_provenance = 21
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The ID of the `BuildTrigger` that triggered this build, if it
  // was triggered automatically.
  string build_trigger_id = 22 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Special options for this build.
  BuildOptions options = 23;

  // Output only. URL to logs for this build in Google Cloud Console.
  string log_url = 25 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Substitutions data for `Build` resource.
  map<string, string> substitutions = 29;

  // Tags for annotation of a `Build`. These are not docker tags.
  repeated string tags = 31;

  // Secrets to decrypt using Cloud Key Management Service.
  // Note: Secret Manager is the recommended technique
  // for managing sensitive data with Cloud Build. Use `available_secrets` to
  // configure builds to access secrets from Secret Manager. For instructions,
  // see: https://cloud.google.com/cloud-build/docs/securing-builds/use-secrets
  repeated Secret secrets = 32;

  // Output only. Stores timing information for phases of the build. Valid keys
  // are:
  //
  // * BUILD: time to execute all build steps
  // * PUSH: time to push all specified images.
  // * FETCHSOURCE: time to fetch source.
  //
  // If the build does not specify source or images,
  // these keys will not be included.
  map<string, TimeSpan> timing = 33 [(google.api.field_behavior) = OUTPUT_ONLY];

  // IAM service account whose credentials will be used at build runtime.
  // Must be of the format `projects/{PROJECT_ID}/serviceAccounts/{ACCOUNT}`.
  // ACCOUNT can be email address or uniqueId of the service account.
  //
  // This field is in beta.
  string service_account = 42 [(google.api.resource_reference) = {
    type: "iam.googleapis.com/ServiceAccount"
  }];

  // Secrets and secret environment variables.
  Secrets available_secrets = 47;
}

// Artifacts produced by a build that should be uploaded upon
// successful completion of all build steps.
message Artifacts {
  // Files in the workspace to upload to Cloud Storage upon successful
  // completion of all build steps.
  message ArtifactObjects {
    // Cloud Storage bucket and optional object path, in the form
    // "gs://bucket/path/to/somewhere/". (see [Bucket Name
    // Requirements](https://cloud.google.com/storage/docs/bucket-naming#requirements)).
    //
    // Files in the workspace matching any path pattern will be uploaded to
    // Cloud Storage with this location as a prefix.
    string location = 1;

    // Path globs used to match files in the build's workspace.
    repeated string paths = 2;

    // Output only. Stores timing information for pushing all artifact objects.
    TimeSpan timing = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // A list of images to be pushed upon the successful completion of all build
  // steps.
  //
  // The images will be pushed using the builder service account's credentials.
  //
  // The digests of the pushed images will be stored in the Build resource's
  // results field.
  //
  // If any of the images fail to be pushed, the build is marked FAILURE.
  repeated string images = 1;

  // A list of objects to be uploaded to Cloud Storage upon successful
  // completion of all build steps.
  //
  // Files in the workspace matching specified paths globs will be uploaded to
  // the specified Cloud Storage location using the builder service account's
  // credentials.
  //
  // The location and generation of the uploaded objects will be stored in the
  // Build resource's results field.
  //
  // If any objects fail to be pushed, the build is marked FAILURE.
  ArtifactObjects objects = 2;
}

// Start and end times for a build execution phase.
message TimeSpan {
  // Start of time span.
  google.protobuf.Timestamp start_time = 1;

  // End of time span.
  google.protobuf.Timestamp end_time = 2;
}

// Metadata for build operations.
message BuildOperationMetadata {
  // The build that the operation is tracking.
  Build build = 1;
}

// Provenance of the source. Ways to find the original source, or verify that
// some source was used for this build.
message SourceProvenance {
  // A copy of the build's `source.storage_source`, if exists, with any
  // generations resolved.
  StorageSource resolved_storage_source = 3;

  // A copy of the build's `source.repo_source`, if exists, with any
  // revisions resolved.
  RepoSource resolved_repo_source = 6;

  // Output only. Hash(es) of the build source, which can be used to verify that
  // the original source integrity was maintained in the build. Note that
  // `FileHashes` will only be populated if `BuildOptions` has requested a
  // `SourceProvenanceHash`.
  //
  // The keys to this map are file paths used as build source and the values
  // contain the hash values for those files.
  //
  // If the build source came in a single package such as a gzipped tarfile
  // (`.tar.gz`), the `FileHash` will be for the single path to that file.
  map<string, FileHashes> file_hashes = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Container message for hashes of byte content of files, used in
// SourceProvenance messages to verify integrity of source input to the build.
message FileHashes {
  // Collection of file hashes.
  repeated Hash file_hash = 1;
}

// Container message for hash values.
message Hash {
  // Specifies the hash algorithm, if any.
  enum HashType {
    // No hash requested.
    NONE = 0;

    // Use a sha256 hash.
    SHA256 = 1;

    // Use a md5 hash.
    MD5 = 2;
  }

  // The type of hash that was performed.
  HashType type = 1;

  // The hash value.
  bytes value = 2;
}

// Secrets and secret environment variables.
message Secrets {
  // Secrets in Secret Manager and associated secret environment variable.
  repeated SecretManagerSecret secret_manager = 1;

  // Secrets encrypted with KMS key and the associated secret environment
  // variable.
  repeated InlineSecret inline = 2;
}

// Pairs a set of secret environment variables mapped to encrypted
// values with the Cloud KMS key to use to decrypt the value.
message InlineSecret {
  // Resource name of Cloud KMS crypto key to decrypt the encrypted value.
  // In format: projects/*/locations/*/keyRings/*/cryptoKeys/*
  string kms_key_name = 1 [(google.api.resource_reference) = {
    type: "cloudkms.googleapis.com/CryptoKey"
  }];

  // Map of environment variable name to its encrypted value.
  //
  // Secret environment variables must be unique across all of a build's
  // secrets, and must be used by at least one build step. Values can be at most
  // 64 KB in size. There can be at most 100 secret values across all of a
  // build's secrets.
  map<string, bytes> env_map = 2;
}

// Pairs a secret environment variable with a SecretVersion in Secret Manager.
message SecretManagerSecret {
  // Resource name of the SecretVersion. In format:
  // projects/*/secrets/*/versions/*
  string version_name = 1 [(google.api.resource_reference) = {
    type: "secretmanager.googleapis.com/SecretVersion"
  }];

  // Environment variable name to associate with the secret.
  // Secret environment variables must be unique across all of a build's
  // secrets, and must be used by at least one build step.
  string env = 2;
}

// Pairs a set of secret environment variables containing encrypted
// values with the Cloud KMS key to use to decrypt the value.
// Note: Use `kmsKeyName` with  `available_secrets` instead of using
// `kmsKeyName` with `secret`. For instructions see:
// https://cloud.google.com/cloud-build/docs/securing-builds/use-encrypted-credentials.
message Secret {
  // Cloud KMS key name to use to decrypt these envs.
  string kms_key_name = 1;

  // Map of environment variable name to its encrypted value.
  //
  // Secret environment variables must be unique across all of a build's
  // secrets, and must be used by at least one build step. Values can be at most
  // 64 KB in size. There can be at most 100 secret values across all of a
  // build's secrets.
  map<string, bytes> secret_env = 3;
}

// Request to create a new build.
message CreateBuildRequest {
  // The parent resource where this build will be created.
  // Format: `projects/{project}/locations/{location}`
  string parent = 4 [(google.api.resource_reference) = {
    child_type: "cloudbuild.googleapis.com/Build"
  }];

  // Required. ID of the project.
  string project_id = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Build resource to create.
  Build build = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request to get a build.
message GetBuildRequest {
  // The name of the `Build` to retrieve.
  // Format: `projects/{project}/locations/{location}/builds/{build}`
  string name = 4 [(google.api.resource_reference) = {
    type: "cloudbuild.googleapis.com/Build"
  }];

  // Required. ID of the project.
  string project_id = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. ID of the build.
  string id = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request to list builds.
message ListBuildsRequest {
  // The parent of the collection of `Builds`.
  // Format: `projects/{project}/locations/location`
  string parent = 9 [(google.api.resource_reference) = {
    child_type: "cloudbuild.googleapis.com/Build"
  }];

  // Required. ID of the project.
  string project_id = 1 [(google.api.field_behavior) = REQUIRED];

  // Number of results to return in the list.
  int32 page_size = 2;

  // The page token for the next page of Builds.
  //
  // If unspecified, the first page of results is returned.
  //
  // If the token is rejected for any reason, INVALID_ARGUMENT will be thrown.
  // In this case, the token should be discarded, and pagination should be
  // restarted from the first page of results.
  //
  // See https://google.aip.dev/158 for more.
  string page_token = 3;

  // The raw filter text to constrain the results.
  string filter = 8;
}

// Response including listed builds.
message ListBuildsResponse {
  // Builds will be sorted by `create_time`, descending.
  repeated Build builds = 1;

  // Token to receive the next page of results.
  // This will be absent if the end of the response list has been reached.
  string next_page_token = 2;
}

// Request to cancel an ongoing build.
message CancelBuildRequest {
  // The name of the `Build` to cancel.
  // Format: `projects/{project}/locations/{location}/builds/{build}`
  string name = 4 [(google.api.resource_reference) = {
    type: "cloudbuild.googleapis.com/Build"
  }];

  // Required. ID of the project.
  string project_id = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. ID of the build.
  string id = 2 [(google.api.field_behavior) = REQUIRED];
}

// Configuration for an automated build in response to source repository
// changes.
message BuildTrigger {
  option (google.api.resource) = {
    type: "cloudbuild.googleapis.com/BuildTrigger"
    pattern: "projects/{project}/triggers/{trigger}"
  };

  // Output only. Unique identifier of the trigger.
  string id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Human-readable description of this trigger.
  string description = 10;

  // User-assigned name of the trigger. Must be unique within the project.
  // Trigger names must meet the following requirements:
  //
  // + They must contain only alphanumeric characters and dashes.
  // + They can be 1-64 characters long.
  // + They must begin and end with an alphanumeric character.
  string name = 21;

  // Tags for annotation of a `BuildTrigger`
  repeated string tags = 19;

  // Template describing the types of source changes to trigger a build.
  //
  // Branch and tag names in trigger templates are interpreted as regular
  // expressions. Any branch or tag change that matches that regular expression
  // will trigger a build.
  //
  // Mutually exclusive with `github`.
  RepoSource trigger_template = 7;

  // GitHubEventsConfig describes the configuration of a trigger that creates
  // a build whenever a GitHub event is received.
  //
  // Mutually exclusive with `trigger_template`.
  GitHubEventsConfig github = 13;

  // Template describing the Build request to make when the trigger is matched.
  oneof build_template {
    // Contents of the build template.
    Build build = 4;

    // Path, from the source root, to the build configuration file
    // (i.e. cloudbuild.yaml).
    string filename = 8;
  }

  // Output only. Time when the trigger was created.
  google.protobuf.Timestamp create_time = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // If true, the trigger will never automatically execute a build.
  bool disabled = 9;

  // Substitutions for Build resource. The keys must match the following
  // regular expression: `^_[A-Z0-9_]+$`.
  map<string, string> substitutions = 11;

  // ignored_files and included_files are file glob matches using
  // https://golang.org/pkg/path/filepath/#Match extended with support for "**".
  //
  // If ignored_files and changed files are both empty, then they are
  // not used to determine whether or not to trigger a build.
  //
  // If ignored_files is not empty, then we ignore any files that match
  // any of the ignored_file globs. If the change has no files that are
  // outside of the ignored_files globs, then we do not trigger a build.
  repeated string ignored_files = 15;

  // If any of the files altered in the commit pass the ignored_files
  // filter and included_files is empty, then as far as this filter is
  // concerned, we should trigger the build.
  //
  // If any of the files altered in the commit pass the ignored_files
  // filter and included_files is not empty, then we make sure that at
  // least one of those files matches a included_files glob. If not,
  // then we do not trigger a build.
  repeated string included_files = 16;
}

// GitHubEventsConfig describes the configuration of a trigger that creates a
// build whenever a GitHub event is received.
//
// This message is experimental.
message GitHubEventsConfig {
  // The installationID that emits the GitHub event.
  int64 installation_id = 1 [deprecated = true];

  // Owner of the repository. For example: The owner for
  // https://github.com/googlecloudplatform/cloud-builders is
  // "googlecloudplatform".
  string owner = 6;

  // Name of the repository. For example: The name for
  // https://github.com/googlecloudplatform/cloud-builders is "cloud-builders".
  string name = 7;

  // Filter describing the types of events to trigger a build.
  // Currently supported event types: push, pull_request.
  oneof event {
    // filter to match changes in pull requests.
    PullRequestFilter pull_request = 4;

    // filter to match changes in refs like branches, tags.
    PushFilter push = 5;
  }
}

// PullRequestFilter contains filter properties for matching GitHub Pull
// Requests.
message PullRequestFilter {
  // Controls behavior of Pull Request comments.
  enum CommentControl {
    // Do not require comments on Pull Requests before builds are triggered.
    COMMENTS_DISABLED = 0;

    // Enforce that repository owners or collaborators must comment on Pull
    // Requests before builds are triggered.
    COMMENTS_ENABLED = 1;
<commit_msg>feat: Add fields for Pub/Sub triggers<commit_after>// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.devtools.cloudbuild.v1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/httpbody.proto";
import "google/api/resource.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";

option csharp_namespace = "Google.Cloud.CloudBuild.V1";
option go_package = "google.golang.org/genproto/googleapis/devtools/cloudbuild/v1;cloudbuild";
option java_multiple_files = true;
option java_package = "com.google.cloudbuild.v1";
option objc_class_prefix = "GCB";
option ruby_package = "Google::Cloud::Build::V1";
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/Network"
  pattern: "projects/{project}/global/networks/{network}"
};
option (google.api.resource_definition) = {
  type: "iam.googleapis.com/ServiceAccount"
  pattern: "projects/{project}/serviceAccounts/{service_account}"
};
option (google.api.resource_definition) = {
  type: "secretmanager.googleapis.com/Secret"
  pattern: "projects/{project}/secrets/{secret}"
};
option (google.api.resource_definition) = {
  type: "secretmanager.googleapis.com/SecretVersion"
  pattern: "projects/{project}/secrets/{secret}/versions/{version}"
};
option (google.api.resource_definition) = {
  type: "cloudkms.googleapis.com/CryptoKey"
  pattern: "projects/{project}/locations/{location}/keyRings/{keyring}/cryptoKeys/{key}"
};
option (google.api.resource_definition) = {
  type: "pubsub.googleapis.com/Subscription"
  pattern: "projects/{project}/subscriptions/{subscription}"
};
option (google.api.resource_definition) = {
  type: "pubsub.googleapis.com/Topic"
  pattern: "projects/{project}/topics/{topic}"
};

// Creates and manages builds on Google Cloud Platform.
//
// The main concept used by this API is a `Build`, which describes the location
// of the source to build, how to build the source, and where to store the
// built artifacts, if any.
//
// A user can list previously-requested builds or get builds by their ID to
// determine the status of the build.
service CloudBuild {
  option (google.api.default_host) = "cloudbuild.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform";

  // Starts a build with the specified configuration.
  //
  // This method returns a long-running `Operation`, which includes the build
  // ID. Pass the build ID to `GetBuild` to determine the build status (such as
  // `SUCCESS` or `FAILURE`).
  rpc CreateBuild(CreateBuildRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/projects/{project_id}/builds"
      body: "build"
      additional_bindings {
        post: "/v1/{parent=projects/*/locations/*}/builds"
        body: "build"
      }
    };
    option (google.api.method_signature) = "project_id,build";
    option (google.longrunning.operation_info) = {
      response_type: "Build"
      metadata_type: "BuildOperationMetadata"
    };
  }

  // Returns information about a previously requested build.
  //
  // The `Build` that is returned includes its status (such as `SUCCESS`,
  // `FAILURE`, or `WORKING`), and timing information.
  rpc GetBuild(GetBuildRequest) returns (Build) {
    option (google.api.http) = {
      get: "/v1/projects/{project_id}/builds/{id}"
      additional_bindings { get: "/v1/{name=projects/*/locations/*/builds/*}" }
    };
    option (google.api.method_signature) = "project_id,id";
  }

  // Lists previously requested builds.
  //
  // Previously requested builds may still be in-progress, or may have finished
  // successfully or unsuccessfully.
  rpc ListBuilds(ListBuildsRequest) returns (ListBuildsResponse) {
    option (google.api.http) = {
      get: "/v1/projects/{project_id}/builds"
      additional_bindings { get: "/v1/{parent=projects/*/locations/*}/builds" }
    };
    option (google.api.method_signature) = "project_id,filter";
  }

  // Cancels a build in progress.
  rpc CancelBuild(CancelBuildRequest) returns (Build) {
    option (google.api.http) = {
      post: "/v1/projects/{project_id}/builds/{id}:cancel"
      body: "*"
      additional_bindings {
        post: "/v1/{name=projects/*/locations/*/builds/*}:cancel"
        body: "*"
      }
    };
    option (google.api.method_signature) = "project_id,id";
  }

  // 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 triggered builds:
  //
  // * Triggered builds resolve to a precise revision; therefore a retry of a
  // triggered build will result in a build that uses the same revision.
  //
  // For non-triggered builds that specify `RepoSource`:
  //
  // * If the original build built from the tip of a branch, the retried build
  // will build from the tip of that branch, which may not be the same revision
  // as the original build.
  // * If the original build specified a commit sha or revision ID, the retried
  // build will use the identical source.
  //
  // For builds that specify `StorageSource`:
  //
  // * If the original build pulled source from Google Cloud Storage without
  // specifying the generation of the object, the new build will use the current
  // object, which may be different from the original build source.
  // * If the original build pulled source from Cloud Storage and specified the
  // generation of the object, the new build will attempt to use the same
  // object, which may or may not be available depending on the bucket's
  // lifecycle management settings.
  rpc RetryBuild(RetryBuildRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/projects/{project_id}/builds/{id}:retry"
      body: "*"
      additional_bindings {
        post: "/v1/{name=projects/*/locations/*/builds/*}:retry"
        body: "*"
      }
    };
    option (google.api.method_signature) = "project_id,id";
    option (google.longrunning.operation_info) = {
      response_type: "Build"
      metadata_type: "BuildOperationMetadata"
    };
  }

  // Creates a new `BuildTrigger`.
  //
  // This API is experimental.
  rpc CreateBuildTrigger(CreateBuildTriggerRequest) returns (BuildTrigger) {
    option (google.api.http) = {
      post: "/v1/projects/{project_id}/triggers"
      body: "trigger"
    };
    option (google.api.method_signature) = "project_id,trigger";
  }

  // Returns information about a `BuildTrigger`.
  //
  // This API is experimental.
  rpc GetBuildTrigger(GetBuildTriggerRequest) returns (BuildTrigger) {
    option (google.api.http) = {
      get: "/v1/projects/{project_id}/triggers/{trigger_id}"
    };
    option (google.api.method_signature) = "project_id,trigger_id";
  }

  // Lists existing `BuildTrigger`s.
  //
  // This API is experimental.
  rpc ListBuildTriggers(ListBuildTriggersRequest)
      returns (ListBuildTriggersResponse) {
    option (google.api.http) = {
      get: "/v1/projects/{project_id}/triggers"
    };
    option (google.api.method_signature) = "project_id";
  }

  // Deletes a `BuildTrigger` by its project ID and trigger ID.
  //
  // This API is experimental.
  rpc DeleteBuildTrigger(DeleteBuildTriggerRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/projects/{project_id}/triggers/{trigger_id}"
    };
    option (google.api.method_signature) = "project_id,trigger_id";
  }

  // Updates a `BuildTrigger` by its project ID and trigger ID.
  //
  // This API is experimental.
  rpc UpdateBuildTrigger(UpdateBuildTriggerRequest) returns (BuildTrigger) {
    option (google.api.http) = {
      patch: "/v1/projects/{project_id}/triggers/{trigger_id}"
      body: "trigger"
    };
    option (google.api.method_signature) = "project_id,trigger_id,trigger";
  }

  // Runs a `BuildTrigger` at a particular source revision.
  rpc RunBuildTrigger(RunBuildTriggerRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/projects/{project_id}/triggers/{trigger_id}:run"
      body: "source"
    };
    option (google.api.method_signature) = "project_id,trigger_id,source";
    option (google.longrunning.operation_info) = {
      response_type: "Build"
      metadata_type: "BuildOperationMetadata"
    };
  }

  // ReceiveTriggerWebhook [Experimental] is called when the API receives a
  // webhook request targeted at a specific trigger.
  rpc ReceiveTriggerWebhook(ReceiveTriggerWebhookRequest)
      returns (ReceiveTriggerWebhookResponse) {
    option (google.api.http) = {
      post: "/v1/projects/{project_id}/triggers/{trigger}:webhook"
      body: "body"
    };
  }

  // Creates a `WorkerPool` to run the builds, and returns the new worker pool.
  //
  // This API is experimental.
  rpc CreateWorkerPool(CreateWorkerPoolRequest) returns (WorkerPool) {}

  // Returns information about a `WorkerPool`.
  //
  // This API is experimental.
  rpc GetWorkerPool(GetWorkerPoolRequest) returns (WorkerPool) {}

  // Deletes a `WorkerPool` by its project ID and WorkerPool name.
  //
  // This API is experimental.
  rpc DeleteWorkerPool(DeleteWorkerPoolRequest)
      returns (google.protobuf.Empty) {}

  // Update a `WorkerPool`.
  //
  // This API is experimental.
  rpc UpdateWorkerPool(UpdateWorkerPoolRequest) returns (WorkerPool) {}

  // List project's `WorkerPools`.
  //
  // This API is experimental.
  rpc ListWorkerPools(ListWorkerPoolsRequest)
      returns (ListWorkerPoolsResponse) {}
}

// Specifies a build to retry.
message RetryBuildRequest {
  // The name of the `Build` to retry.
  // Format: `projects/{project}/locations/{location}/builds/{build}`
  string name = 3 [(google.api.resource_reference) = {
    type: "cloudbuild.googleapis.com/Build"
  }];

  // Required. ID of the project.
  string project_id = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Build ID of the original build.
  string id = 2 [(google.api.field_behavior) = REQUIRED];
}

// Specifies a build trigger to run and the source to use.
message RunBuildTriggerRequest {
  // Required. ID of the project.
  string project_id = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. ID of the trigger.
  string trigger_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Source to build against this trigger.
  RepoSource source = 3;
}

// Location of the source in an archive file in Google Cloud Storage.
message StorageSource {
  // Google Cloud Storage bucket containing the source (see
  // [Bucket Name
  // Requirements](https://cloud.google.com/storage/docs/bucket-naming#requirements)).
  string bucket = 1;

  // Google Cloud Storage object containing the source.
  //
  // This object must be a gzipped archive file (`.tar.gz`) containing source to
  // build.
  string object = 2;

  // Google Cloud Storage generation for the object. If the generation is
  // omitted, the latest generation will be used.
  int64 generation = 3;
}

// Location of the source in a Google Cloud Source Repository.
message RepoSource {
  // ID of the project that owns the Cloud Source Repository. If omitted, the
  // project ID requesting the build is assumed.
  string project_id = 1;

  // Name of the Cloud Source Repository.
  string repo_name = 2;

  // A revision within the Cloud Source Repository must be specified in
  // one of these ways.
  oneof revision {
    // Regex matching branches to build.
    //
    // The syntax of the regular expressions accepted is the syntax accepted by
    // RE2 and described at https://github.com/google/re2/wiki/Syntax
    string branch_name = 3;

    // Regex matching tags to build.
    //
    // The syntax of the regular expressions accepted is the syntax accepted by
    // RE2 and described at https://github.com/google/re2/wiki/Syntax
    string tag_name = 4;

    // Explicit commit SHA to build.
    string commit_sha = 5;
  }

  // Directory, relative to the source root, in which to run the build.
  //
  // This must be a relative path. If a step's `dir` is specified and is an
  // absolute path, this value is ignored for that step's execution.
  string dir = 7;

  // Only trigger a build if the revision regex does NOT match the revision
  // regex.
  bool invert_regex = 8;

  // Substitutions to use in a triggered build.
  // Should only be used with RunBuildTrigger
  map<string, string> substitutions = 9;
}

// Location of the source in a supported storage service.
message Source {
  // Location of source.
  oneof source {
    // If provided, get the source from this location in Google Cloud Storage.
    StorageSource storage_source = 2;

    // If provided, get the source from this location in a Cloud Source
    // Repository.
    RepoSource repo_source = 3;
  }
}

// An image built by the pipeline.
message BuiltImage {
  // Name used to push the container image to Google Container Registry, as
  // presented to `docker push`.
  string name = 1;

  // Docker Registry 2.0 digest.
  string digest = 3;

  // Output only. Stores timing information for pushing the specified image.
  TimeSpan push_timing = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A step in the build pipeline.
message BuildStep {
  // Required. The name of the container image that will run this particular
  // build step.
  //
  // If the image is available in the host's Docker daemon's cache, it
  // will be run directly. If not, the host will attempt to pull the image
  // first, using the builder service account's credentials if necessary.
  //
  // The Docker daemon's cache will already have the latest versions of all of
  // the officially supported build steps
  // ([https://github.com/GoogleCloudPlatform/cloud-builders](https://github.com/GoogleCloudPlatform/cloud-builders)).
  // The Docker daemon will also have cached many of the layers for some popular
  // images, like "ubuntu", "debian", but they will be refreshed at the time you
  // attempt to use them.
  //
  // If you built an image in a previous build step, it will be stored in the
  // host's Docker daemon's cache and is available to use as the name for a
  // later build step.
  string name = 1;

  // A list of environment variable definitions to be used when running a step.
  //
  // The elements are of the form "KEY=VALUE" for the environment variable "KEY"
  // being given the value "VALUE".
  repeated string env = 2;

  // A list of arguments that will be presented to the step when it is started.
  //
  // If the image used to run the step's container has an entrypoint, the `args`
  // are used as arguments to that entrypoint. If the image does not define
  // an entrypoint, the first element in args is used as the entrypoint,
  // and the remainder will be used as arguments.
  repeated string args = 3;

  // Working directory to use when running this step's container.
  //
  // If this value is a relative path, it is relative to the build's working
  // directory. If this value is absolute, it may be outside the build's working
  // directory, in which case the contents of the path may not be persisted
  // across build step executions, unless a `volume` for that path is specified.
  //
  // If the build specifies a `RepoSource` with `dir` and a step with a `dir`,
  // which specifies an absolute path, the `RepoSource` `dir` is ignored for
  // the step's execution.
  string dir = 4;

  // Unique identifier for this build step, used in `wait_for` to
  // reference this build step as a dependency.
  string id = 5;

  // The ID(s) of the step(s) that this build step depends on.
  // This build step will not start until all the build steps in `wait_for`
  // have completed successfully. If `wait_for` is empty, this build step will
  // start when all previous build steps in the `Build.Steps` list have
  // completed successfully.
  repeated string wait_for = 6;

  // Entrypoint to be used instead of the build step image's default entrypoint.
  // If unset, the image's default entrypoint is used.
  string entrypoint = 7;

  // A list of environment variables which are encrypted using a Cloud Key
  // Management Service crypto key. These values must be specified in the
  // build's `Secret`.
  repeated string secret_env = 8;

  // List of volumes to mount into the build step.
  //
  // Each volume is created as an empty volume prior to execution of the
  // build step. Upon completion of the build, volumes and their contents are
  // discarded.
  //
  // Using a named volume in only one step is not valid as it is indicative
  // of a build request with an incorrect configuration.
  repeated Volume volumes = 9;

  // Output only. Stores timing information for executing this build step.
  TimeSpan timing = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Stores timing information for pulling this build step's
  // builder image only.
  TimeSpan pull_timing = 13 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Time limit for executing this build step. If not defined, the step has no
  // time limit and will be allowed to continue to run until either it completes
  // or the build itself times out.
  google.protobuf.Duration timeout = 11;

  // Output only. Status of the build step. At this time, build step status is
  // only updated on build completion; step status is not updated in real-time
  // as the build progresses.
  Build.Status status = 12 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Volume describes a Docker container volume which is mounted into build steps
// in order to persist files across build step execution.
message Volume {
  // Name of the volume to mount.
  //
  // Volume names must be unique per build step and must be valid names for
  // Docker volumes. Each named volume must be used by at least two build steps.
  string name = 1;

  // Path at which to mount the volume.
  //
  // Paths must be absolute and cannot conflict with other volume paths on the
  // same build step or with certain reserved volume paths.
  string path = 2;
}

// Artifacts created by the build pipeline.
message Results {
  // Container images that were built as a part of the build.
  repeated BuiltImage images = 2;

  // List of build step digests, in the order corresponding to build step
  // indices.
  repeated string build_step_images = 3;

  // Path to the artifact manifest. Only populated when artifacts are uploaded.
  string artifact_manifest = 4;

  // Number of artifacts uploaded. Only populated when artifacts are uploaded.
  int64 num_artifacts = 5;

  // List of build step outputs, produced by builder images, in the order
  // corresponding to build step indices.
  //
  // [Cloud Builders](https://cloud.google.com/cloud-build/docs/cloud-builders)
  // can produce this output by writing to `$BUILDER_OUTPUT/output`.
  // Only the first 4KB of data is stored.
  repeated bytes build_step_outputs = 6;

  // Time to push all non-container artifacts.
  TimeSpan artifact_timing = 7;
}

// An artifact that was uploaded during a build. This
// is a single record in the artifact manifest JSON file.
message ArtifactResult {
  // The path of an artifact in a Google Cloud Storage bucket, with the
  // generation number. For example,
  // `gs://mybucket/path/to/output.jar#generation`.
  string location = 1;

  // The file hash of the artifact.
  repeated FileHashes file_hash = 2;
}

// A build resource in the Cloud Build API.
//
// At a high level, a `Build` describes where to find source code, how to build
// it (for example, the builder image to run on the source), and where to store
// the built artifacts.
//
// Fields can include the following variables, which will be expanded when the
// build is created:
//
// - $PROJECT_ID: the project ID of the build.
// - $PROJECT_NUMBER: the project number of the build.
// - $BUILD_ID: the autogenerated ID of the build.
// - $REPO_NAME: the source repository name specified by RepoSource.
// - $BRANCH_NAME: the branch name specified by RepoSource.
// - $TAG_NAME: the tag name specified by RepoSource.
// - $REVISION_ID or $COMMIT_SHA: the commit SHA specified by RepoSource or
//   resolved from the specified branch or tag.
// - $SHORT_SHA: first 7 characters of $REVISION_ID or $COMMIT_SHA.
message Build {
  option (google.api.resource) = {
    type: "cloudbuild.googleapis.com/Build"
    pattern: "projects/{project}/builds/{build}"
    pattern: "projects/{project}/locations/{location}/builds/{build}"
  };

  // Possible status of a build or build step.
  enum Status {
    // Status of the build is unknown.
    STATUS_UNKNOWN = 0;

    // Build or step is queued; work has not yet begun.
    QUEUED = 1;

    // Build or step is being executed.
    WORKING = 2;

    // Build or step finished successfully.
    SUCCESS = 3;

    // Build or step failed to complete successfully.
    FAILURE = 4;

    // Build or step failed due to an internal cause.
    INTERNAL_ERROR = 5;

    // Build or step took longer than was allowed.
    TIMEOUT = 6;

    // Build or step was canceled by a user.
    CANCELLED = 7;

    // Build was enqueued for longer than the value of `queue_ttl`.
    EXPIRED = 9;
  }

  // Output only. The 'Build' name with format:
  // `projects/{project}/locations/{location}/builds/{build}`, where {build}
  // is a unique identifier generated by the service.
  string name = 45 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Unique identifier of the build.
  string id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. ID of the project.
  string project_id = 16 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Status of the build.
  Status status = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Customer-readable message about the current status.
  string status_detail = 24 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The location of the source files to build.
  Source source = 3;

  // Required. The operations to be performed on the workspace.
  repeated BuildStep steps = 11;

  // Output only. Results of the build.
  Results results = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which the request to create the build was received.
  google.protobuf.Timestamp create_time = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which execution of the build was started.
  google.protobuf.Timestamp start_time = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time at which execution of the build was finished.
  //
  // The difference between finish_time and start_time is the duration of the
  // build's execution.
  google.protobuf.Timestamp finish_time = 8
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Amount of time that this build should be allowed to run, to second
  // granularity. If this amount of time elapses, work on the build will cease
  // and the build status will be `TIMEOUT`.
  //
  // `timeout` starts ticking from `startTime`.
  //
  // Default time is ten minutes.
  google.protobuf.Duration timeout = 12;

  // A list of images to be pushed upon the successful completion of all build
  // steps.
  //
  // The images are pushed using the builder service account's credentials.
  //
  // The digests of the pushed images will be stored in the `Build` resource's
  // results field.
  //
  // If any of the images fail to be pushed, the build status is marked
  // `FAILURE`.
  repeated string images = 13;

  // TTL in queue for this build. If provided and the build is enqueued longer
  // than this value, the build will expire and the build status will be
  // `EXPIRED`.
  //
  // The TTL starts ticking from create_time.
  google.protobuf.Duration queue_ttl = 40;

  // Artifacts produced by the build that should be uploaded upon
  // successful completion of all build steps.
  Artifacts artifacts = 37;

  // Google Cloud Storage bucket where logs should be written (see
  // [Bucket Name
  // Requirements](https://cloud.google.com/storage/docs/bucket-naming#requirements)).
  // Logs file names will be of the format `${logs_bucket}/log-${build_id}.txt`.
  string logs_bucket = 19;

  // Output only. A permanent fixed identifier for source.
  SourceProvenance source_provenance = 21
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The ID of the `BuildTrigger` that triggered this build, if it
  // was triggered automatically.
  string build_trigger_id = 22 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Special options for this build.
  BuildOptions options = 23;

  // Output only. URL to logs for this build in Google Cloud Console.
  string log_url = 25 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Substitutions data for `Build` resource.
  map<string, string> substitutions = 29;

  // Tags for annotation of a `Build`. These are not docker tags.
  repeated string tags = 31;

  // Secrets to decrypt using Cloud Key Management Service.
  // Note: Secret Manager is the recommended technique
  // for managing sensitive data with Cloud Build. Use `available_secrets` to
  // configure builds to access secrets from Secret Manager. For instructions,
  // see: https://cloud.google.com/cloud-build/docs/securing-builds/use-secrets
  repeated Secret secrets = 32;

  // Output only. Stores timing information for phases of the build. Valid keys
  // are:
  //
  // * BUILD: time to execute all build steps
  // * PUSH: time to push all specified images.
  // * FETCHSOURCE: time to fetch source.
  //
  // If the build does not specify source or images,
  // these keys will not be included.
  map<string, TimeSpan> timing = 33 [(google.api.field_behavior) = OUTPUT_ONLY];

  // IAM service account whose credentials will be used at build runtime.
  // Must be of the format `projects/{PROJECT_ID}/serviceAccounts/{ACCOUNT}`.
  // ACCOUNT can be email address or uniqueId of the service account.
  //
  // This field is in beta.
  string service_account = 42 [(google.api.resource_reference) = {
    type: "iam.googleapis.com/ServiceAccount"
  }];

  // Secrets and secret environment variables.
  Secrets available_secrets = 47;
}

// Artifacts produced by a build that should be uploaded upon
// successful completion of all build steps.
message Artifacts {
  // Files in the workspace to upload to Cloud Storage upon successful
  // completion of all build steps.
  message ArtifactObjects {
    // Cloud Storage bucket and optional object path, in the form
    // "gs://bucket/path/to/somewhere/". (see [Bucket Name
    // Requirements](https://cloud.google.com/storage/docs/bucket-naming#requirements)).
    //
    // Files in the workspace matching any path pattern will be uploaded to
    // Cloud Storage with this location as a prefix.
    string location = 1;

    // Path globs used to match files in the build's workspace.
    repeated string paths = 2;

    // Output only. Stores timing information for pushing all artifact objects.
    TimeSpan timing = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // A list of images to be pushed upon the successful completion of all build
  // steps.
  //
  // The images will be pushed using the builder service account's credentials.
  //
  // The digests of the pushed images will be stored in the Build resource's
  // results field.
  //
  // If any of the images fail to be pushed, the build is marked FAILURE.
  repeated string images = 1;

  // A list of objects to be uploaded to Cloud Storage upon successful
  // completion of all build steps.
  //
  // Files in the workspace matching specified paths globs will be uploaded to
  // the specified Cloud Storage location using the builder service account's
  // credentials.
  //
  // The location and generation of the uploaded objects will be stored in the
  // Build resource's results field.
  //
  // If any objects fail to be pushed, the build is marked FAILURE.
  ArtifactObjects objects = 2;
}

// Start and end times for a build execution phase.
message TimeSpan {
  // Start of time span.
  google.protobuf.Timestamp start_time = 1;

  // End of time span.
  google.protobuf.Timestamp end_time = 2;
}

// Metadata for build operations.
message BuildOperationMetadata {
  // The build that the operation is tracking.
  Build build = 1;
}

// Provenance of the source. Ways to find the original source, or verify that
// some source was used for this build.
message SourceProvenance {
  // A copy of the build's `source.storage_source`, if exists, with any
  // generations resolved.
  StorageSource resolved_storage_source = 3;

  // A copy of the build's `source.repo_source`, if exists, with any
  // revisions resolved.
  RepoSource resolved_repo_source = 6;

  // Output only. Hash(es) of the build source, which can be used to verify that
  // the original source integrity was maintained in the build. Note that
  // `FileHashes` will only be populated if `BuildOptions` has requested a
  // `SourceProvenanceHash`.
  //
  // The keys to this map are file paths used as build source and the values
  // contain the hash values for those files.
  //
  // If the build source came in a single package such as a gzipped tarfile
  // (`.tar.gz`), the `FileHash` will be for the single path to that file.
  map<string, FileHashes> file_hashes = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Container message for hashes of byte content of files, used in
// SourceProvenance messages to verify integrity of source input to the build.
message FileHashes {
  // Collection of file hashes.
  repeated Hash file_hash = 1;
}

// Container message for hash values.
message Hash {
  // Specifies the hash algorithm, if any.
  enum HashType {
    // No hash requested.
    NONE = 0;

    // Use a sha256 hash.
    SHA256 = 1;

    // Use a md5 hash.
    MD5 = 2;
  }

  // The type of hash that was performed.
  HashType type = 1;

  // The hash value.
  bytes value = 2;
}

// Secrets and secret environment variables.
message Secrets {
  // Secrets in Secret Manager and associated secret environment variable.
  repeated SecretManagerSecret secret_manager = 1;

  // Secrets encrypted with KMS key and the associated secret environment
  // variable.
  repeated InlineSecret inline = 2;
}

// Pairs a set of secret environment variables mapped to encrypted
// values with the Cloud KMS key to use to decrypt the value.
message InlineSecret {
  // Resource name of Cloud KMS crypto key to decrypt the encrypted value.
  // In format: projects/*/locations/*/keyRings/*/cryptoKeys/*
  string kms_key_name = 1 [(google.api.resource_reference) = {
    type: "cloudkms.googleapis.com/CryptoKey"
  }];

  // Map of environment variable name to its encrypted value.
  //
  // Secret environment variables must be unique across all of a build's
  // secrets, and must be used by at least one build step. Values can be at most
  // 64 KB in size. There can be at most 100 secret values across all of a
  // build's secrets.
  map<string, bytes> env_map = 2;
}

// Pairs a secret environment variable with a SecretVersion in Secret Manager.
message SecretManagerSecret {
  // Resource name of the SecretVersion. In format:
  // projects/*/secrets/*/versions/*
  string version_name = 1 [(google.api.resource_reference) = {
    type: "secretmanager.googleapis.com/SecretVersion"
  }];

  // Environment variable name to associate with the secret.
  // Secret environment variables must be unique across all of a build's
  // secrets, and must be used by at least one build step.
  string env = 2;
}

// Pairs a set of secret environment variables containing encrypted
// values with the Cloud KMS key to use to decrypt the value.
// Note: Use `kmsKeyName` with  `available_secrets` instead of using
// `kmsKeyName` with `secret`. For instructions see:
// https://cloud.google.com/cloud-build/docs/securing-builds/use-encrypted-credentials.
message Secret {
  // Cloud KMS key name to use to decrypt these envs.
  string kms_key_name = 1;

  // Map of environment variable name to its encrypted value.
  //
  // Secret environment variables must be unique across all of a build's
  // secrets, and must be used by at least one build step. Values can be at most
  // 64 KB in size. There can be at most 100 secret values across all of a
  // build's secrets.
  map<string, bytes> secret_env = 3;
}

// Request to create a new build.
message CreateBuildRequest {
  // The parent resource where this build will be created.
  // Format: `projects/{project}/locations/{location}`
  string parent = 4 [(google.api.resource_reference) = {
    child_type: "cloudbuild.googleapis.com/Build"
  }];

  // Required. ID of the project.
  string project_id = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Build resource to create.
  Build build = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request to get a build.
message GetBuildRequest {
  // The name of the `Build` to retrieve.
  // Format: `projects/{project}/locations/{location}/builds/{build}`
  string name = 4 [(google.api.resource_reference) = {
    type: "cloudbuild.googleapis.com/Build"
  }];

  // Required. ID of the project.
  string project_id = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. ID of the build.
  string id = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request to list builds.
message ListBuildsRequest {
  // The parent of the collection of `Builds`.
  // Format: `projects/{project}/locations/location`
  string parent = 9 [(google.api.resource_reference) = {
    child_type: "cloudbuild.googleapis.com/Build"
  }];

  // Required. ID of the project.
  string project_id = 1 [(google.api.field_behavior) = REQUIRED];

  // Number of results to return in the list.
  int32 page_size = 2;

  // The page token for the next page of Builds.
  //
  // If unspecified, the first page of results is returned.
  //
  // If the token is rejected for any reason, INVALID_ARGUMENT will be thrown.
  // In this case, the token should be discarded, and pagination should be
  // restarted from the first page of results.
  //
  // See https://google.aip.dev/158 for more.
  string page_token = 3;

  // The raw filter text to constrain the results.
  string filter = 8;
}

// Response including listed builds.
message ListBuildsResponse {
  // Builds will be sorted by `create_time`, descending.
  repeated Build builds = 1;

  // Token to receive the next page of results.
  // This will be absent if the end of the response list has been reached.
  string next_page_token = 2;
}

// Request to cancel an ongoing build.
message CancelBuildRequest {
  // The name of the `Build` to cancel.
  // Format: `projects/{project}/locations/{location}/builds/{build}`
  string name = 4 [(google.api.resource_reference) = {
    type: "cloudbuild.googleapis.com/Build"
  }];

  // Required. ID of the project.
  string project_id = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. ID of the build.
  string id = 2 [(google.api.field_behavior) = REQUIRED];
}

// Configuration for an automated build in response to source repository
// changes.
message BuildTrigger {
  option (google.api.resource) = {
    type: "cloudbuild.googleapis.com/BuildTrigger"
    pattern: "projects/{project}/triggers/{trigger}"
  };

  // Output only. Unique identifier of the trigger.
  string id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Human-readable description of this trigger.
  string description = 10;

  // User-assigned name of the trigger. Must be unique within the project.
  // Trigger names must meet the following requirements:
  //
  // + They must contain only alphanumeric characters and dashes.
  // + They can be 1-64 characters long.
  // + They must begin and end with an alphanumeric character.
  string name = 21;

  // Tags for annotation of a `BuildTrigger`
  repeated string tags = 19;

  // Template describing the types of source changes to trigger a build.
  //
  // Branch and tag names in trigger templates are interpreted as regular
  // expressions. Any branch or tag change that matches that regular expression
  // will trigger a build.
  //
  // Mutually exclusive with `github`.
  RepoSource trigger_template = 7;

  // GitHubEventsConfig describes the configuration of a trigger that creates
  // a build whenever a GitHub event is received.
  //
  // Mutually exclusive with `trigger_template`.
  GitHubEventsConfig github = 13;

  // Optional. PubsubConfig describes the configuration of a trigger that
  // creates a build whenever a Pub/Sub message is published.
  PubsubConfig pubsub_config = 29 [(google.api.field_behavior) = OPTIONAL];

  // Template describing the Build request to make when the trigger is matched.
  oneof build_template {
    // Contents of the build template.
    Build build = 4;

    // Path, from the source root, to the build configuration file
    // (i.e. cloudbuild.yaml).
    string filename = 8;
  }

  // Output only. Time when the trigger was created.
  google.protobuf.Timestamp create_time = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // If true, the trigger will never automatically execute a build.
  bool disabled = 9;

  // Substitutions for Build resource. The keys must match the following
  // regular expression: `^_[A-Z0-9_]+$`.
  map<string, string> substitutions = 11;

  // ignored_files and included_files are file glob matches using
  // https://golang.org/pkg/path/filepath/#Match extended with support for "**".
  //
  // If ignored_files and changed files are both empty, then they are
  // not used to determine whether or not to trigger a build.
  //
  // If ignored_files is not empty, then we ignore any files that match
  // any of the ignored_file globs. If the change has no files that are
  // outside of the ignored_files globs, then we do not trigger a build.
  repeated string ignored_files = 15;

  // If any of the files altered in the commit pass the ignored_files
  // filter and included_files is empty, then as far as this filter is
  // concerned, we should trigger the build.
  //
  // If any of the files altered in the commit pass the ignored_files
  // filter and included_files is not empty, then we make sure that at
  // least one of those files matches a included_files glob. If not,
  // then we do not trigger a build.
  repeated string included_files = 16;

  // Optional. A Common Expression Language string.
  string filter = 30 [(google.api.field_behavior) = OPTIONAL];
}

// GitHubEventsConfig describes the configuration of a trigger that creates a
// build whenever a GitHub event is received.
//
// This message is experimental.
message GitHubEventsConfig {
  // The installationID that emits the GitHub event.
  int64 installation_id = 1 [deprecated = true];

  // Owner of the repository. For example: The owner for
  // https://github.com/googlecloudplatform/cloud-builders is
  // "googlecloudplatform".
  string owner = 6;

  // Name of the repository. For example: The name for
  // https://github.com/googlecloudplatform/cloud-builders is "cloud-builders".
  string name = 7;

  // Filter describing the types of events to trigger a build.
  // Currently supported event types: push, pull_request.
  oneof event {
    // filter to match changes in pull requests.
    PullRequestFilter pull_request = 4;

    // filter to match changes in refs like branches, tags.
    PushFilter push = 5;
  }
}

// PubsubConfig describes the configuration of a trigger that
// creates a build whenever a Pub/Sub message is published.
message PubsubConfig {
  // Enumerates potential issues with the underlying Pub/Sub subscription
  // configuration.
  enum State {
    // The subscription configuration has not been checked.
    STATE_UNSPECIFIED = 0;

    // The Pub/Sub subscription is properly configured.
    OK = 1;

    // The subscription has been deleted.
    SUBSCRIPTION_DELETED = 2;

    // The topic has been deleted.
    TOPIC_DELETED = 3;

    // Some of the subscription's field are misconfigured.
    SUBSCRIPTION_MISCONFIGURED = 4;
  }

  // Output only. Name of the subscription. Format is
  // `projects/{project}/subscriptions/{subscription}`.
  string subscription = 1 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "pubsub.googleapis.com/Subscription"
    }
  ];

  // The name of the topic from which this subscription is receiving messages.
  // Format is `projects/{project}/topics/{topic}`.
  string topic = 2 [
    (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" }
  ];

  // Service account that will make the push request.
  string service_account_email = 3 [(google.api.resource_reference) = {
    type: "iam.googleapis.com/ServiceAccount"
  }];

  // Potential issues with the underlying Pub/Sub subscription configuration.
  // Only populated on get requests.
  State state = 4;
}

// PullRequestFilter contains filter properties for matching GitHub Pull
// Requests.
message PullRequestFilter {
  // Controls behavior of Pull Request comments.
  enum CommentControl {
    // Do not require comments on Pull Requests before builds are triggered.
    COMMENTS_DISABLED = 0;

    // Enforce that repository owners or collaborators must comment on Pull
    // Requests before builds are triggered.
    COMMENTS_ENABLED = 1;

{'fraction_non_alphanumeric': 0.09600564882336471, 'fraction_numerical': 0.006123616707856004, 'mean_word_length': 3.1015628900983674, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 30, 'lorem ipsum': 0, 'www.': 4, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6336910', 'n_tokens_mistral': 23955, 'n_tokens_neox': 22677, 'n_words': 9389}