go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/buildbucket/proto/builds_service.proto (about)

     1  // Copyright 2020 The Swarming Authors. All rights reserved.
     2  // Use of this source code is governed by the Apache v2.0 license that can be
     3  // found in the LICENSE file.
     4  
     5  syntax = "proto3";
     6  
     7  package buildbucket.v2;
     8  
     9  option go_package = "go.chromium.org/luci/buildbucket/proto;buildbucketpb";
    10  
    11  import "google/api/field_behavior.proto";
    12  import "google/protobuf/duration.proto";
    13  import "google/protobuf/field_mask.proto";
    14  import "google/protobuf/struct.proto";
    15  import "google/rpc/status.proto";
    16  import "go.chromium.org/luci/buildbucket/proto/build.proto";
    17  import "go.chromium.org/luci/buildbucket/proto/builder_common.proto";
    18  import "go.chromium.org/luci/buildbucket/proto/common.proto";
    19  import "go.chromium.org/luci/buildbucket/proto/notification.proto";
    20  import "go.chromium.org/luci/common/proto/structmask/structmask.proto";
    21  
    22  // Manages builds.
    23  //
    24  // Buildbot: To simplify V1->V2 API transition for clients, buildbucket.v2.Builds
    25  // service has some support for non-LUCI builds. Most of such builds are
    26  // Buildbot builds and this documentation refers to them as such, but they also
    27  // include non-Buildbot non-LUCI builds (e.g. Skia builds).
    28  // See "Buildbot" paragraph in each RPC comment.
    29  service Builds {
    30    // Gets a build.
    31    //
    32    // By default the returned build does not include all fields.
    33    // See GetBuildRequest.mask.
    34    //
    35    // Buildbot: if the specified build is a buildbot build, converts it to Build
    36    // message with the following rules:
    37    // * bucket names are full, e.g. "luci.infra.try". Note that LUCI buckets
    38    //   in v2 are shortened, e.g. "try".
    39    // * if a v2 Build field does not make sense in V1, it is unset/empty.
    40    // * step support is not implemented for Buildbot builds.
    41    // Note that it does not support getting a buildbot build by build number.
    42    // Examples: go/buildbucket-rpc#getbuild
    43    //
    44    // GetBuild is good for getting detailed information for a build.
    45    // For use cases that only requires build status checking (e.g. wait for a
    46    // build to complete), please use GetBuildStatus instead.
    47    rpc GetBuild(GetBuildRequest) returns (Build) {};
    48  
    49    // Searches for builds.
    50    // Examples: go/buildbucket-rpc#searchbuilds
    51    rpc SearchBuilds(SearchBuildsRequest) returns (SearchBuildsResponse) {};
    52  
    53    // Updates a build.
    54    //
    55    // RPC metadata must include "x-buildbucket-token" key with a token
    56    // generated by the server when scheduling the build.
    57    rpc UpdateBuild(UpdateBuildRequest) returns (Build) {};
    58  
    59    // Schedules a new build.
    60    // The requester must have at least SCHEDULER role in the destination bucket.
    61    // Example: go/buildbucket-rpc#schedulebuild
    62    rpc ScheduleBuild(ScheduleBuildRequest) returns (Build) {};
    63  
    64    // Cancels a build.
    65    // The requester must have at least SCHEDULER role in the destination bucket.
    66    // Note that cancelling a build in ended state (meaning build is not in
    67    // STATUS_UNSPECIFIED, SCHEDULED or STARTED status) will be a no-op and
    68    // directly return up-to-date Build message.
    69    //
    70    // When called, Buildbucket will set the build's cancelTime to "now".  It
    71    // will also recursively start the cancellation process for any children of
    72    // this build which are marked as can_outlive_parent=false.
    73    //
    74    // The next time the build checks in (which happens periodically in
    75    // `bbagent`), bbagent will see the cancelTime, and start the cancellation
    76    // process described by the 'deadline' section in
    77    // https://chromium.googlesource.com/infra/luci/luci-py/+/HEAD/client/LUCI_CONTEXT.md.
    78    //
    79    // If the build ends before the build's grace_period, then the final status
    80    // reported from the build is accepted; this is considered 'graceful termination'.
    81    //
    82    // If the build doesn't end within the build's grace_period, Buildbucket will
    83    // forcibly cancel the build.
    84    rpc CancelBuild(CancelBuildRequest) returns (Build) {};
    85  
    86    // Executes multiple requests in a batch.
    87    // The response code is always OK.
    88    // Examples: go/buildbucket-rpc#batch
    89    rpc Batch(BatchRequest) returns (BatchResponse) {};
    90  
    91    // Creates a new build for the provided build proto.
    92    //
    93    // If build with the given ID already exists, returns ALREADY_EXISTS
    94    // error code.
    95    rpc CreateBuild(CreateBuildRequest) returns (Build) {};
    96  
    97    // Synthesizes a build proto.
    98    //
    99    // This RPC is exclusively for generating led builds.
   100    rpc SynthesizeBuild(SynthesizeBuildRequest) returns (Build) {};
   101  
   102    // Gets a build's status.
   103    //
   104    // The returned build contains the requested build id or
   105    // (builder + build number), and build status.
   106    //
   107    // It's useful when a user only wants to check the build's status (i.e. wait
   108    // for a build to complete).
   109    rpc GetBuildStatus(GetBuildStatusRequest) returns (Build) {};
   110  
   111    // Starts a build.
   112    //
   113    // RPC metadata must include "x-buildbucket-token" key with
   114    // * a BUILD type token generated by the server when it creates a Swarming
   115    //   task for the build (builds on Swarming) or
   116    // * a START_BUILD type token generated by the server when it attempts to run
   117    //   a backend task (builds on TaskBackend).
   118    //
   119    // Agent must call it before making any UpdateBuild calls.
   120    //
   121    // StartBuild will associate a task with a build if the association is not done
   122    // after RunTaskResponse is returned to buildbucket.
   123    rpc StartBuild(StartBuildRequest) returns (StartBuildResponse) {};
   124  }
   125  
   126  // A request message for GetBuild RPC.
   127  message GetBuildRequest {
   128    // Build ID.
   129    // Mutually exclusive with builder and number.
   130    int64 id = 1;
   131  
   132    // Builder of the build.
   133    // Requires number. Mutually exclusive with id.
   134    BuilderID builder = 2;
   135    // Build number.
   136    // Requires builder. Mutually exclusive with id.
   137    int32 build_number = 3;
   138  
   139    // Fields to include in the response.
   140    //
   141    // DEPRECATED: Use mask instead.
   142    //
   143    // If not set, the default mask is used, see Build message comments for the
   144    // list of fields returned by default.
   145    //
   146    // Supports advanced semantics, see
   147    // https://chromium.googlesource.com/infra/luci/luci-py/+/f9ae69a37c4bdd0e08a8b0f7e123f6e403e774eb/appengine/components/components/protoutil/field_masks.py#7
   148    // In particular, if the client needs only some output properties, they
   149    // can be requested with paths "output.properties.fields.foo".
   150    google.protobuf.FieldMask fields = 100 [deprecated = true];
   151  
   152    // What portion of the Build message to return.
   153    //
   154    // If not set, the default mask is used, see Build message comments for the
   155    // list of fields returned by default.
   156    BuildMask mask = 101;
   157  }
   158  
   159  // A request message for SearchBuilds RPC.
   160  message SearchBuildsRequest {
   161    // Returned builds must satisfy this predicate. Required.
   162    BuildPredicate predicate = 1;
   163  
   164    // Fields to include in the response, see GetBuildRequest.fields.
   165    //
   166    // DEPRECATED: Use mask instead.
   167    //
   168    // Note that this applies to the response, not each build, so e.g. steps must
   169    // be requested with a path "builds.*.steps".
   170    google.protobuf.FieldMask fields = 100 [deprecated = true];
   171  
   172    // What portion of the Build message to return.
   173    //
   174    // If not set, the default mask is used, see Build message comments for the
   175    // list of fields returned by default.
   176    BuildMask mask = 103;
   177  
   178    // Number of builds to return.
   179    // Defaults to 100.
   180    // Any value >1000 is interpreted as 1000.
   181    int32 page_size = 101;
   182  
   183    // Value of SearchBuildsResponse.next_page_token from the previous response.
   184    // Use it to continue searching.
   185    // The predicate and page_size in this request MUST be exactly same as in the
   186    // previous request.
   187    string page_token = 102;
   188  }
   189  
   190  // A response message for SearchBuilds RPC.
   191  message SearchBuildsResponse {
   192    // Search results.
   193    //
   194    // Ordered by build ID, descending. IDs are monotonically decreasing, so in
   195    // other words the order is newest-to-oldest.
   196    repeated Build builds = 1;
   197  
   198    // Value for SearchBuildsRequest.page_token to continue searching.
   199    string next_page_token = 100;
   200  }
   201  
   202  // A request message for Batch RPC.
   203  message BatchRequest {
   204  
   205    // One request in a batch.
   206    message Request {
   207      oneof request {
   208        GetBuildRequest get_build = 1;
   209        SearchBuildsRequest search_builds = 2;
   210        ScheduleBuildRequest schedule_build = 3;
   211        CancelBuildRequest cancel_build = 4 ;
   212        GetBuildStatusRequest get_build_status = 5;
   213      }
   214    }
   215  
   216    // Requests to execute in a single batch.
   217    //
   218    // * All requests are executed in their own individual transactions.
   219    // * BatchRequest as a whole is not transactional.
   220    // * There's no guaranteed order of execution between batch items (i.e.
   221    //   consider them to all operate independently).
   222    // * There is a limit of 200 requests per batch.
   223    repeated Request requests = 1;
   224  }
   225  
   226  // A response message for Batch RPC.
   227  message BatchResponse {
   228  
   229    // Response a BatchRequest.Response.
   230    message Response {
   231      oneof response {
   232        Build get_build = 1;
   233        SearchBuildsResponse search_builds = 2;
   234        Build schedule_build = 3;
   235        Build cancel_build = 4;
   236        Build get_build_status = 5;
   237  
   238        // Error code and details of the unsuccessful RPC.
   239        google.rpc.Status error = 100;
   240      }
   241    }
   242  
   243    // Responses in the same order as BatchRequest.requests.
   244    repeated Response responses = 1;
   245  }
   246  
   247  // A request message for UpdateBuild RPC.
   248  message UpdateBuildRequest {
   249    // Build to update, with new field values.
   250    Build build = 1;
   251  
   252    // Build fields to update.
   253    // See also
   254    // https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask
   255    //
   256    // Currently supports only the following path strings:
   257    // - build.output
   258    // - build.output.properties
   259    // - build.output.gitiles_commit
   260    // - build.output.status
   261    // - build.output.status_details
   262    // - build.output.summary_markdown
   263    // - build.status
   264    // - build.status_details
   265    // - build.steps
   266    // - build.summary_markdown
   267    // - build.tags
   268    // - build.infra.buildbucket.agent.output
   269    // - build.infra.buildbucket.agent.purposes
   270    //
   271    // Note, "build.output.status" is required explicitly to update the field.
   272    // If there is only "build.output" in update_mask, build.output.status will not
   273    // be updated.
   274    //
   275    // If omitted, Buildbucket will update the Build's update_time, but nothing else.
   276    google.protobuf.FieldMask update_mask = 2;
   277  
   278    // Fields to include in the response. See also GetBuildRequest.fields.
   279    //
   280    // DEPRECATED: Use mask instead.
   281    google.protobuf.FieldMask fields = 100 [deprecated = true];
   282  
   283    // What portion of the Build message to return.
   284    //
   285    // If not set, an empty build will be returned.
   286    BuildMask mask = 101;
   287  }
   288  
   289  // A request message for ScheduleBuild RPC.
   290  //
   291  // Next ID: 24.
   292  message ScheduleBuildRequest {
   293    // ** STRONGLY RECOMMENDED **.
   294    // A unique string id used for detecting duplicate requests.
   295    // Should be unique at least per requesting identity.
   296    // Used to dedup build scheduling requests with same id within 1 min.
   297    // If a build was successfully scheduled with the same request id in the past
   298    // minute, the existing build will be returned.
   299    string request_id = 1;
   300  
   301    // ID of a build to retry as is or altered.
   302    // When specified, fields below default to the values in the template build.
   303    int64 template_build_id = 2;
   304  
   305    // Value for Build.builder. See its comments.
   306    // Required, unless template_build_id is specified.
   307    BuilderID builder = 3;
   308  
   309    // DEPRECATED
   310    //
   311    // Set "luci.buildbucket.canary_software" in `experiments` instead.
   312    //
   313    // YES sets "luci.buildbucket.canary_software" to true in `experiments`.
   314    // NO sets "luci.buildbucket.canary_software" to false in `experiments`.
   315    Trinary canary = 4;
   316  
   317    // DEPRECATED
   318    //
   319    // Set "luci.non_production" in `experiments` instead.
   320    //
   321    // YES sets "luci.non_production" to true in `experiments`.
   322    // NO sets "luci.non_production" to false in `experiments`.
   323    Trinary experimental = 5;
   324  
   325    // Sets (or prevents) these experiments on the scheduled build.
   326    //
   327    // See `Builder.experiments` for well-known experiments.
   328    map<string, bool> experiments = 16;
   329  
   330    // Properties to include in Build.input.properties.
   331    //
   332    // Input properties of the created build are result of merging server-defined
   333    // properties and properties in this field.
   334    // Each property in this field defines a new or replaces an existing property
   335    // on the server.
   336    // If the server config does not allow overriding/adding the property, the
   337    // request will fail with InvalidArgument error code.
   338    // A server-defined property cannot be removed, but its value can be
   339    // replaced with null.
   340    //
   341    // Reserved property paths:
   342    //   ["$recipe_engine/buildbucket"]
   343    //   ["$recipe_engine/runtime", "is_experimental"]
   344    //   ["$recipe_engine/runtime", "is_luci"]
   345    //   ["branch"]
   346    //   ["buildbucket"]
   347    //   ["buildername"]
   348    //   ["repository"]
   349    //
   350    // The Builder configuration specifies which top-level property names are
   351    // overridable via the `allowed_property_overrides` field. ScheduleBuild
   352    // requests which attempt to override a property which isn't allowed will
   353    // fail with InvalidArgument.
   354    //
   355    // V1 equivalent: corresponds to "properties" key in "parameters_json".
   356    google.protobuf.Struct properties = 6;
   357  
   358    // Value for Build.input.gitiles_commit.
   359    //
   360    // Setting this field will cause the created build to have a "buildset"
   361    // tag with value "commit/gitiles/{hostname}/{project}/+/{id}".
   362    //
   363    // GitilesCommit objects MUST have host, project, ref fields set.
   364    //
   365    // V1 equivalent: supersedes "revision" property and "buildset"
   366    // tag that starts with "commit/gitiles/".
   367    GitilesCommit gitiles_commit = 7;
   368  
   369    // Value for Build.input.gerrit_changes.
   370    // Usually present in tryjobs, set by CQ, Gerrit, git-cl-try.
   371    // Applied on top of gitiles_commit if specified, otherwise tip of the tree.
   372    // All GerritChange fields are required.
   373    //
   374    // Setting this field will cause the created build to have a "buildset"
   375    // tag with value "patch/gerrit/{hostname}/{change}/{patchset}"
   376    // for each change.
   377    //
   378    // V1 equivalent: supersedes patch_* properties and "buildset"
   379    // tag that starts with "patch/gerrit/".
   380    repeated GerritChange gerrit_changes = 8;
   381  
   382    // Tags to include in Build.tags of the created build, see Build.tags
   383    // comments.
   384    // Note: tags of the created build may include other tags defined on the
   385    // server.
   386    repeated StringPair tags = 9;
   387  
   388    // Overrides default dimensions defined by builder config or template build.
   389    //
   390    // A set of entries with the same key defines a new or replaces an existing
   391    // dimension with the same key.
   392    // If the config does not allow overriding/adding the dimension, the request
   393    // will fail with InvalidArgument error code.
   394    //
   395    // After merging, dimensions with empty value will be excluded.
   396    //
   397    // Note: For the same key dimensions, it won't allow to pass empty and
   398    // non-empty values at the same time in the request.
   399    //
   400    // Note: "caches" and "pool" dimensions may only be specified in builder
   401    // configs. Setting them hear will fail the request.
   402    //
   403    // A dimension expiration must be a multiple of 1min.
   404    repeated RequestedDimension dimensions = 10;
   405  
   406    // If not zero, overrides swarming task priority.
   407    // See also Build.infra.swarming.priority.
   408    int32 priority = 11;
   409  
   410    // A per-build notification configuration.
   411    NotificationConfig notify = 12;
   412  
   413    // Fields to include in the response. See also GetBuildRequest.fields.
   414    //
   415    // DEPRECATED: Use mask instead.
   416    google.protobuf.FieldMask fields = 100 [deprecated = true];
   417  
   418    // What portion of the Build message to return.
   419    //
   420    // If not set, the default mask is used, see Build message comments for the
   421    // list of fields returned by default.
   422    BuildMask mask = 101;
   423  
   424    // Value for Build.critical.
   425    Trinary critical = 13;
   426  
   427    // Overrides Builder.exe in the config.
   428    // Supported subfields: cipd_version.
   429    Executable exe = 14;
   430  
   431    // Swarming specific part of the build request.
   432    message Swarming {
   433      // If specified, parent_run_id should match actual Swarming task run ID the
   434      // caller is running as and results in swarming server ensuring that the newly
   435      // triggered build will not outlive its parent.
   436      //
   437      // Typical use is for triggering and waiting on child build(s) from within
   438      // 1 parent build and if child build(s) on their own aren't useful. Then,
   439      // if parent build ends for whatever reason, all not yet finished child
   440      // builds aren't useful and it's desirable to terminate them, too.
   441      //
   442      // If the Builder config does not specify a swarming backend, the request
   443      // will fail with InvalidArgument error code.
   444      //
   445      // The parent_run_id is assumed to be from the same swarming server as the
   446      // one the new build is to be executed on. The ScheduleBuildRequest doesn't
   447      // check if parent_run_id refers to actually existing task, but eventually
   448      // the new build will fail if so.
   449      string parent_run_id = 1;
   450    }
   451    // Swarming specific part of the build request.
   452    Swarming swarming = 15;
   453  
   454    // Maximum build pending time.
   455    //
   456    // If set, overrides the default `expiration_secs` set in builder config.
   457    // Only supports seconds precision for now.
   458    // For more information, see Build.scheduling_timeout in build.proto.
   459    google.protobuf.Duration scheduling_timeout = 17;
   460  
   461    // Maximum build execution time.
   462    //
   463    // If set, overrides the default `execution_timeout_secs` set in builder config.
   464    // Only supports seconds precision for now.
   465    // For more information, see Build.execution_timeout in build.proto.
   466    google.protobuf.Duration execution_timeout = 18;
   467  
   468    // Amount of cleanup time after execution_timeout.
   469    //
   470    // If set, overrides the default `grace_period` set in builder config.
   471    // Only supports seconds precision for now.
   472    // For more information, see Build.grace_period in build.proto.
   473    google.protobuf.Duration grace_period = 19;
   474  
   475    // Whether or not this request constitutes a dry run.
   476    //
   477    // A dry run returns the build proto without actually scheduling it. All
   478    // fields except those which can only be computed at run-time are filled in.
   479    // Does not cause side-effects. When batching, all requests must specify the
   480    // same value for dry_run.
   481    bool dry_run = 20;
   482  
   483    // Flag to control if the build can outlive its parent.
   484    //
   485    // If the value is UNSET, it means this build doesn't have any parent, so
   486    // the request must not have a head with any BuildToken.
   487    //
   488    // If the value is anything other than UNSET, then the BuildToken for the
   489    // parent build must be set as a header.
   490    // Note: it's not currently possible to establish parent/child relationship
   491    // except via the parent build at the time the build is launched.
   492    //
   493    // If the value is NO, it means that the build SHOULD reach a terminal status
   494    // (SUCCESS, FAILURE, INFRA_FAILURE or CANCELED) before its parent. If the
   495    // child fails to do so, Buildbucket will cancel it some time after the
   496    // parent build reaches a terminal status.
   497    //
   498    // A build that can outlive its parent can also outlive its parent's ancestors.
   499    //
   500    // If schedule a build without parent, this field must be UNSET.
   501    //
   502    // If schedule a build with parent, this field should be YES or NO.
   503    // But UNSET is also accepted for now, and it has the same effect as YES.
   504    // TODO(crbug.com/1031205): after the parent tracking feature is stable,
   505    // require this field to be set when scheduling a build with parent.
   506    Trinary can_outlive_parent = 21;
   507  
   508    // Value for Build.retriable.
   509    Trinary retriable = 22;
   510  
   511    // Information for scheduling a build as a shadow build.
   512    message ShadowInput {
   513    }
   514    // Input for scheduling a build in the shadow bucket.
   515    //
   516    // If this field is set, it means the build to be scheduled will
   517    // * be scheduled in the shadow bucket of the requested bucket, with shadow
   518    //   adjustments on service_account, dimensions and properties.
   519    // * inherit its parent build's agent input and agent source if it has a parent.
   520    ShadowInput shadow_input = 23;
   521  }
   522  
   523  // A request message for CancelBuild RPC.
   524  message CancelBuildRequest {
   525    // ID of the build to cancel.
   526    int64 id = 1;
   527  
   528    // Required. Value for Build.cancellation_markdown. Will be appended to
   529    // Build.summary_markdown when exporting to bigquery and returned via GetBuild.
   530    string summary_markdown = 2;
   531  
   532    // Fields to include in the response. See also GetBuildRequest.fields.
   533    //
   534    // DEPRECATED: Use mask instead.
   535    google.protobuf.FieldMask fields = 100 [deprecated = true];
   536  
   537    // What portion of the Build message to return.
   538    //
   539    // If not set, the default mask is used, see Build message comments for the
   540    // list of fields returned by default.
   541    BuildMask mask = 101;
   542  }
   543  
   544  // A request message for CreateBuild RPC.
   545  message CreateBuildRequest {
   546    // The Build to be created.
   547    Build build = 1  [(google.api.field_behavior) = REQUIRED];
   548  
   549    // A unique identifier for this request.
   550    // A random UUID is recommended.
   551    // This request is only idempotent if a `request_id` is provided.
   552    string request_id = 2;
   553  
   554    // What portion of the Build message to return.
   555    //
   556    // If not set, the default mask is used, see Build message comments for the
   557    // list of fields returned by default.
   558    BuildMask mask = 3;
   559  }
   560  
   561  // A request message for SynthesizeBuild RPC.
   562  message SynthesizeBuildRequest {
   563    // ID of a build to use as the template.
   564    // Mutually exclusive with builder.
   565    int64 template_build_id = 1;
   566  
   567    // Value for Build.builder. See its comments.
   568    // Required, unless template_build_id is specified.
   569    BuilderID builder = 2;
   570  
   571    // Sets (or prevents) these experiments on the synthesized build.
   572    //
   573    // See `Builder.experiments` for well-known experiments.
   574    map<string, bool> experiments = 3;
   575  }
   576  
   577  // A request message for StartBuild RPC.
   578  message StartBuildRequest {
   579    // A nonce to deduplicate requests.
   580    string request_id = 1 [(google.api.field_behavior) = REQUIRED];
   581    // Id of the build to start.
   582    int64 build_id = 2 [(google.api.field_behavior) = REQUIRED];
   583    // Id of the task running the started build.
   584    string task_id = 3 [(google.api.field_behavior) = REQUIRED];
   585  }
   586  
   587  // A response message for StartBuild RPC.
   588  message StartBuildResponse {
   589    // The whole proto of the started build.
   590    Build build = 1;
   591    // a build token for agent to use when making subsequent UpdateBuild calls.
   592    string update_build_token = 2;
   593  }
   594  
   595  // A request message for GetBuildStatus RPC.
   596  message GetBuildStatusRequest {
   597    // Build ID.
   598    // Mutually exclusive with builder and number.
   599    int64 id = 1;
   600  
   601    // Builder of the build.
   602    // Requires number. Mutually exclusive with id.
   603    BuilderID builder = 2;
   604    // Build number.
   605    // Requires builder. Mutually exclusive with id.
   606    int32 build_number = 3;
   607  }
   608  
   609  // Defines a subset of Build fields and properties to return.
   610  message BuildMask {
   611    // Fields of the Build proto to include.
   612    //
   613    // Follows the standard FieldMask semantics as documented at e.g.
   614    // https://pkg.go.dev/google.golang.org/protobuf/types/known/fieldmaskpb.
   615    //
   616    // If not set, the default mask is used, see Build message comments for the
   617    // list of fields returned by default.
   618    google.protobuf.FieldMask fields = 1;
   619  
   620    // Defines a subset of `input.properties` to return.
   621    //
   622    // When not empty, implicitly adds the corresponding field to `fields`.
   623    repeated structmask.StructMask input_properties = 2;
   624  
   625    // Defines a subset of `output.properties` to return.
   626    //
   627    // When not empty, implicitly adds the corresponding field to `fields`.
   628    repeated structmask.StructMask output_properties = 3;
   629  
   630    // Defines a subset of `infra.buildbucket.requested_properties` to return.
   631    //
   632    // When not empty, implicitly adds the corresponding field to `fields`.
   633    repeated structmask.StructMask requested_properties = 4;
   634  
   635    // Flag for including all fields.
   636    //
   637    // Mutually exclusive with `fields`, `input_properties`, `output_properties`,
   638    // and `requested_properties`.
   639    bool all_fields = 5;
   640  
   641    // A status to filter returned `steps` by. If unspecified, no filter is
   642    // applied. Otherwise filters by the union of the given statuses.
   643    //
   644    // No effect unless `fields` specifies that `steps` should be returned or
   645    // `all_fields` is true.
   646    repeated Status step_status = 6;
   647  }
   648  
   649  // A build predicate.
   650  //
   651  // At least one of the following fields is required: builder, gerrit_changes and
   652  // git_commits.
   653  // If a field value is empty, it is ignored, unless stated otherwise.
   654  message BuildPredicate {
   655    // A build must be in this builder.
   656    BuilderID builder = 1;
   657  
   658    // A build must have this status.
   659    Status status = 2;
   660  
   661    // A build's Build.Input.gerrit_changes must include ALL of these changes.
   662    repeated GerritChange gerrit_changes = 3;
   663  
   664    // DEPRECATED
   665    //
   666    // Never implemented.
   667    GitilesCommit output_gitiles_commit = 4;
   668  
   669    // A build must be created by this identity.
   670    string created_by = 5;
   671  
   672    // A build must have ALL of these tags.
   673    // For "ANY of these tags" make separate RPCs.
   674    repeated StringPair tags = 6;
   675  
   676    // A build must have been created within the specified range.
   677    // Both boundaries are optional.
   678    TimeRange create_time = 7;
   679  
   680    // If false (the default), equivalent to filtering by experiment
   681    // "-luci.non_production".
   682    //
   683    // If true, has no effect (both production and non_production builds will be
   684    // returned).
   685    //
   686    // NOTE: If you explicitly search for non_production builds with the experiment
   687    // filter "+luci.non_production", this is implied to be true.
   688    //
   689    // See `Builder.experiments` for well-known experiments.
   690    bool include_experimental = 8;
   691  
   692    // A build must be in this build range.
   693    BuildRange build = 9;
   694  
   695    // DEPRECATED
   696    //
   697    // If YES, equivalent to filtering by experiment
   698    // "+luci.buildbucket.canary_software".
   699    //
   700    // If NO, equivalent to filtering by experiment
   701    // "-luci.buildbucket.canary_software".
   702    //
   703    // See `Builder.experiments` for well-known experiments.
   704    Trinary canary = 10;
   705  
   706    // A list of experiments to include or exclude from the search results.
   707    //
   708    // Each entry should look like "[-+]$experiment_name".
   709    //
   710    // A "+" prefix means that returned builds MUST have that experiment set.
   711    // A "-" prefix means that returned builds MUST NOT have that experiment set
   712    //   AND that experiment was known for the builder at the time the build
   713    //   was scheduled (either via `Builder.experiments` or via
   714    //   `ScheduleBuildRequest.experiments`). Well-known experiments are always
   715    //   considered to be available.
   716    repeated string experiments = 11;
   717  
   718    // A build ID.
   719    //
   720    // Returned builds will be descendants of this build (e.g. "100" means
   721    // "any build transitively scheduled starting from build 100").
   722    //
   723    // Mutually exclusive with `child_of`.
   724    int64 descendant_of = 12;
   725  
   726    // A build ID.
   727    //
   728    // Returned builds will be only the immediate children of this build.
   729    //
   730    // Mutually exclusive with `descendant_of`.
   731    int64 child_of = 13;
   732  }
   733  
   734  // Open build range.
   735  message BuildRange {
   736    // Inclusive lower (less recent build) boundary. Optional.
   737    int64 start_build_id = 1;
   738    // Inclusive upper (more recent build) boundary. Optional.
   739    int64 end_build_id = 2;
   740  }