// Copyright 2016 Google Inc.
//
// 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/longrunning/operations.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";

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";


// Manages container image build requests in the cloud.
//
// The main concept used by this API is a Build, which describes the location of
// the source to build, how to build the source into a container image, and what
// tag to apply to the built image when it is pushed to Google Container
// Registry.
//
// A user can list previously-requested builds or get builds by their ID to
// determine the status of the build.
service CloudBuild {
  // Starts a build with the specified configuration.
  //
  // The long-running Operation returned by this method will include the ID of
  // the build, which can be passed to GetBuild to determine its status (e.g.,
  // success or failure).
  rpc CreateBuild(CreateBuildRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = { post: "/v1/projects/{project_id}/builds" body: "build" };
  }

  // Returns information about a previously requested build.
  //
  // The Build that is returned includes its status (e.g., success or failure,
  // or in-progress), and timing information.
  rpc GetBuild(GetBuildRequest) returns (Build) {
    option (google.api.http) = { get: "/v1/projects/{project_id}/builds/{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" };
  }

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

  // 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" };
  }

  // Gets 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}" };
  }

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

  // Deletes an 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}" };
  }

  // Updates an 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" };
  }
}

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

  // Google Cloud Storage object containing 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;
}

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

  // Name of the repo. If omitted, the name "default" is assumed.
  string repo_name = 2;

  // A revision within the source repository must be specified in
  // one of these ways.
  oneof revision {
    // Name of the branch to build.
    string branch_name = 3;

    // Name of the tag to build.
    string tag_name = 4;

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

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

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

// BuiltImage describes 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;
}

// BuildStep describes a step to perform in the build pipeline.
message BuildStep {
  // The name of the container image that will run this particular build step.
  //
  // If the image is already 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). 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, these args
  // will be used as arguments to that entrypoint. If the image does not define
  // an entrypoint, the first element in args will be used as the entrypoint,
  // and the remainder will be used as arguments.
  repeated string args = 3;

  // Working directory (relative to project source root) to use when running
  // this operation's container.
  string dir = 4;

  // Optional 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;

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

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

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

// A build resource in the Container Builder 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 what tag to
// apply to the built image when it is pushed to Google Container Registry.
//
// Fields can include the following variables which will be expanded when the
// build is created:
//
// - $PROJECT_ID: the project ID 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.
message Build {
  // Possible status of a build.
  enum Status {
    // Status of the build is unknown.
    STATUS_UNKNOWN = 0;

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

    // Build is being executed.
    WORKING = 2;

    // Build finished successfully.
    SUCCESS = 3;

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

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

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

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

  // Unique identifier of the build.
  // @OutputOnly
  string id = 1;

  // ID of the project.
  // @OutputOnly.
  string project_id = 16;

  // Status of the build.
  // @OutputOnly
  Status status = 2;

  // Customer-readable message about the current status.
  // @OutputOnly
  string status_detail = 24;

  // Describes where to find the source files to build.
  Source source = 3;

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

  // Results of the build.
  // @OutputOnly
  Results results = 10;

  // Time at which the request to create the build was received.
  // @OutputOnly
  google.protobuf.Timestamp create_time = 6;

  // Time at which execution of the build was started.
  // @OutputOnly
  google.protobuf.Timestamp start_time = 7;

  // 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.
  // @OutputOnly
  google.protobuf.Timestamp finish_time = 8;

  // 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.
  //
  // 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 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 = 13;

  // 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;

  // A permanent fixed identifier for source.
  // @OutputOnly
  SourceProvenance source_provenance = 21;

  // The ID of the BuildTrigger that triggered this build, if it was
  // triggered automatically.
  // @OutputOnly
  string build_trigger_id = 22;

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

  // URL to logs for this build in Google Cloud Logging.
  // @OutputOnly
  string log_url = 25;

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

// 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;

  // 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.
  // @OutputOnly
  map<string, FileHashes> file_hashes = 4;
}

// 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;
  }

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

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

// Request to create a new build.
message CreateBuildRequest {
  // ID of the project.
  string project_id = 1;

  // Build resource to create.
  Build build = 2;
}

// Request to get a build.
message GetBuildRequest {
  // ID of the project.
  string project_id = 1;

  // ID of the build.
  string id = 2;
}

// Request to list builds.
message ListBuildsRequest {
  // ID of the project.
  string project_id = 1;

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

  // Token to provide to skip to a particular spot in the list.
  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.
  string next_page_token = 2;
}

// Request to cancel an ongoing build.
message CancelBuildRequest {
  // ID of the project.
  string project_id = 1;

  // ID of the build.
  string id = 2;
}

// Configuration for an automated build in response to source repository
// changes.
message BuildTrigger {
  // Unique identifier of the trigger.
  //
  // @OutputOnly
  string id = 1;

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

  // 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.
  RepoSource trigger_template = 7;

  // 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 a file whose contents is used for the
    // template.
    string filename = 8;
  }

  // Time when the trigger was created.
  //
  // @OutputOnly
  google.protobuf.Timestamp create_time = 5;

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

  // Substitutions data for Build resource.
  map<string, string> substitutions = 11;
}

// Request to create a new BuildTrigger.
message CreateBuildTriggerRequest {
  // ID of the project for which to configure automatic builds.
  string project_id = 1;

  // BuildTrigger to create.
  BuildTrigger trigger = 2;
}

// Returns the BuildTrigger with the specified ID.
message GetBuildTriggerRequest {
  // ID of the project that owns the trigger.
  string project_id = 1;

  // ID of the BuildTrigger to get.
  string trigger_id = 2;
}

// Request to list existing BuildTriggers.
message ListBuildTriggersRequest {
  // ID of the project for which to list BuildTriggers.
  string project_id = 1;
}

// Response containing existing BuildTriggers.
message ListBuildTriggersResponse {
  // BuildTriggers for the project, sorted by create_time descending.
  repeated BuildTrigger triggers = 1;
}

// Request to delete a BuildTrigger.
message DeleteBuildTriggerRequest {
  // ID of the project that owns the trigger.
  string project_id = 1;

  // ID of the BuildTrigger to delete.
  string trigger_id = 2;
}

// Request to update an existing BuildTrigger.
message UpdateBuildTriggerRequest {
  // ID of the project that owns the trigger.
  string project_id = 1;

  // ID of the BuildTrigger to update.
  string trigger_id = 2;

  // BuildTrigger to update.
  BuildTrigger trigger = 3;
}

// Optional arguments to enable specific features of builds.
message BuildOptions {
  // Specifies the manner in which the build should be verified, if at all.
  enum VerifyOption {
    // Not a verifiable build. (default)
    NOT_VERIFIED = 0;

    // Verified build.
    VERIFIED = 1;
  }

  // Requested hash for SourceProvenance.
  repeated Hash.HashType source_provenance_hash = 1;

  // Requested verifiability options.
  VerifyOption requested_verify_option = 2;
}
