git-repohooks: setup CQ for new repo
Bug: b/400763202
Test: `./recipes/recipes.py test train`
Change-Id: I345c9baf76acd4c7d060e522de94cd861f85f5c9
diff --git a/generated/commit-queue.cfg b/generated/commit-queue.cfg
index 595b72b..9560d51 100644
--- a/generated/commit-queue.cfg
+++ b/generated/commit-queue.cfg
@@ -111,6 +111,38 @@
}
}
config_groups {
+ name: "git-repohooks_repo"
+ gerrit {
+ url: "https://gerrit-review.googlesource.com"
+ projects {
+ name: "git-repohooks"
+ ref_regexp: "refs/heads/.+"
+ }
+ }
+ verifiers {
+ gerrit_cq_ability {
+ committer_list: "googlers"
+ dry_run_access_list: "all"
+ new_patchset_run_access_list: "all"
+ }
+ tryjob {
+ builders {
+ name: "gerrit/try/Verify git-repohooks CL"
+ mode_allowlist: "DRY_RUN"
+ mode_allowlist: "FULL_RUN"
+ mode_allowlist: "NEW_PATCHSET_RUN"
+ }
+ retry_config {
+ single_quota: 1
+ global_quota: 2
+ failure_weight: 100
+ transient_failure_weight: 1
+ timeout_weight: 100
+ }
+ }
+ }
+}
+config_groups {
name: "luci-config_repo"
gerrit {
url: "https://gerrit-review.googlesource.com"
diff --git a/generated/cr-buildbucket.cfg b/generated/cr-buildbucket.cfg
index f72176a..58b8dd9 100644
--- a/generated/cr-buildbucket.cfg
+++ b/generated/cr-buildbucket.cfg
@@ -56,6 +56,27 @@
}
}
builders {
+ name: "Verify git-repohooks CL"
+ swarming_host: "chromium-swarm.appspot.com"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu"
+ dimensions: "pool:luci.gerrit.try"
+ exe {
+ cipd_package: "infra/recipe_bundles/gerrit.googlesource.com/luci-config"
+ cipd_version: "refs/heads/main"
+ cmd: "luciexe"
+ }
+ properties:
+ '{'
+ ' "recipe": "git-repohooks"'
+ '}'
+ service_account: "gerrit-luci-try-builder@gerritcodereview-ci.iam.gserviceaccount.com"
+ experiments {
+ key: "luci.recipes.use_python3"
+ value: 100
+ }
+ }
+ builders {
name: "Verify luci-test CL"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "cpu:x86-64"
diff --git a/main.star b/main.star
index 86b5a5e..dab7a0c 100755
--- a/main.star
+++ b/main.star
@@ -116,5 +116,6 @@
# Per-repo configurations
exec("//repos/gerrit.star")
exec("//repos/git-repo.star")
+exec("//repos/git-repohooks.star")
exec("//repos/luci-config.star")
exec("//repos/luci-test.star")
diff --git a/recipes/README.recipes.md b/recipes/README.recipes.md
index 85d53fe..353baa4 100644
--- a/recipes/README.recipes.md
+++ b/recipes/README.recipes.md
@@ -5,6 +5,7 @@
**[Recipes](#Recipes)**
* [gerrit](#recipes-gerrit)
* [git-repo](#recipes-git-repo)
+ * [git-repohooks](#recipes-git-repohooks)
* [luci-test](#recipes-luci-test)
## Recipes
@@ -26,6 +27,18 @@
Generate a gclient configuration to check out git-repo.
Return: (config) A gclient recipe module configuration.
+### *recipes* / [git-repohooks](/recipes/recipes/git-repohooks.py)
+
+[DEPS](/recipes/recipes/git-repohooks.py#15): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/step][recipe_engine/recipe_modules/step]
+
+
+— **def [RunSteps](/recipes/recipes/git-repohooks.py#40)(api):**
+
+— **def [gclient\_config](/recipes/recipes/git-repohooks.py#27)(api):**
+
+Generate a gclient configuration to check out git-repohooks.
+
+Return: (config) A gclient recipe module configuration.
### *recipes* / [luci-test](/recipes/recipes/luci-test.py)
[DEPS](/recipes/recipes/luci-test.py#9): [depot\_tools/gerrit][depot_tools/recipe_modules/gerrit], [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [fuchsia/git\_checkout][fuchsia/recipe_modules/git_checkout], [infra/zip][infra/recipe_modules/zip], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/nodejs][recipe_engine/recipe_modules/nodejs], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/step][recipe_engine/recipe_modules/step]
diff --git a/recipes/recipes/git-repohooks.expected/basic.json b/recipes/recipes/git-repohooks.expected/basic.json
new file mode 100644
index 0000000..3ef72b9
--- /dev/null
+++ b/recipes/recipes/git-repohooks.expected/basic.json
@@ -0,0 +1,174 @@
+[
+ {
+ "cmd": [
+ "vpython3",
+ "RECIPE_REPO[depot_tools]/gerrit_client.py",
+ "changes",
+ "--host",
+ "https://chromium-review.googlesource.com",
+ "--json_file",
+ "/path/to/tmp/json",
+ "--limit",
+ "1",
+ "-p",
+ "change=123456",
+ "-o",
+ "ALL_REVISIONS",
+ "-o",
+ "DOWNLOAD_COMMANDS",
+ "--verbose"
+ ],
+ "env": {
+ "PATH": "<PATH>:RECIPE_REPO[depot_tools]"
+ },
+ "infra_step": true,
+ "luci_context": {
+ "realm": {
+ "name": "git-repohooks:try"
+ },
+ "resultdb": {
+ "current_invocation": {
+ "name": "invocations/build:8945511751514863184",
+ "update_token": "token"
+ },
+ "hostname": "rdbhost"
+ }
+ },
+ "name": "gerrit fetch current CL info",
+ "timeout": 480,
+ "~followup_annotations": [
+ "@@@STEP_LOG_LINE@json.output@[@@@",
+ "@@@STEP_LOG_LINE@json.output@ {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"branch\": \"main\",@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"owner\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"name\": \"John Doe\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ },@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"184ebe53805e102605d11f6b143486d15c23a09c\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"_number\": \"7\",@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"ref\": \"refs/changes/56/123456/7\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@]@@@",
+ "@@@STEP_LOG_END@json.output@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "vpython3",
+ "-u",
+ "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
+ "--spec-path",
+ "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': True, 'name': 'git-repohooks', 'url': 'https://gerrit.googlesource.com/git-repohooks'}]",
+ "--patch_root",
+ "git-repohooks",
+ "--revision_mapping_file",
+ "{}",
+ "--git-cache-dir",
+ "[CACHE]/git",
+ "--cleanup-dir",
+ "[CLEANUP]/bot_update",
+ "--output_json",
+ "/path/to/tmp/json",
+ "--patch_ref",
+ "https://chromium.googlesource.com/git-repohooks@refs/heads/main:refs/changes/56/123456/7",
+ "--revision",
+ "git-repohooks@refs/heads/main",
+ "--refs",
+ "refs/heads/main"
+ ],
+ "env": {
+ "DEPOT_TOOLS_REPORT_BUILD": "git-repohooks/try/builder/8945511751514863184",
+ "GIT_BACKENDINFO": "1",
+ "GIT_DAPPER_TRACE": "1",
+ "GIT_HTTP_LOW_SPEED_LIMIT": "102400",
+ "GIT_HTTP_LOW_SPEED_TIME": "1800",
+ "GIT_SSH_COMMAND": "ssh -o SendEnv=GIT_DAPPER_TRACE -o SendEnv=GIT_BACKENDINFO",
+ "GIT_TRACE2_EVENT": "[CLEANUP]/trace2-event",
+ "GIT_TRACE_CURL": "[CLEANUP]/trace-curl",
+ "GIT_TRACE_CURL_NO_DATA": "1",
+ "GIT_TRACE_PACKET": "[CLEANUP]/trace-packet"
+ },
+ "env_suffixes": {
+ "DEPOT_TOOLS_UPDATE": [
+ "0"
+ ],
+ "PATH": [
+ "RECIPE_REPO[depot_tools]"
+ ]
+ },
+ "infra_step": true,
+ "luci_context": {
+ "realm": {
+ "name": "git-repohooks:try"
+ },
+ "resultdb": {
+ "current_invocation": {
+ "name": "invocations/build:8945511751514863184",
+ "update_token": "token"
+ },
+ "hostname": "rdbhost"
+ }
+ },
+ "name": "bot_update",
+ "~followup_annotations": [
+ "@@@STEP_TEXT@Some step text@@@",
+ "@@@STEP_LOG_LINE@json.output@{@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"did_run\": true,@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"git-repohooks\": \"HEAD\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ },@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"git-repohooks\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/git-repohooks.git\",@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"b6c460c58dc15a96b9398a97188dd17d3dc8006e\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ },@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"git-repohooks\",@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"b6c460c58dc15a96b9398a97188dd17d3dc8006e\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ },@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"root\": \"git-repohooks\",@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"source_manifest\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"directories\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"git-repohooks\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"git_checkout\": {@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"repo_url\": \"https://fake.org/git-repohooks.git\",@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"revision\": \"b6c460c58dc15a96b9398a97188dd17d3dc8006e\"@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ }@@@",
+ "@@@STEP_LOG_LINE@json.output@ },@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"version\": 0@@@",
+ "@@@STEP_LOG_LINE@json.output@ },@@@",
+ "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
+ "@@@STEP_LOG_LINE@json.output@}@@@",
+ "@@@STEP_LOG_END@json.output@@@",
+ "@@@SET_BUILD_PROPERTY@got_revision@\"b6c460c58dc15a96b9398a97188dd17d3dc8006e\"@@@"
+ ]
+ },
+ {
+ "cmd": [
+ "vpython3",
+ "run_tests",
+ "-vv"
+ ],
+ "cwd": "[START_DIR]/git-repohooks",
+ "luci_context": {
+ "realm": {
+ "name": "git-repohooks:try"
+ },
+ "resultdb": {
+ "current_invocation": {
+ "name": "invocations/build:8945511751514863184",
+ "update_token": "token"
+ },
+ "hostname": "rdbhost"
+ }
+ },
+ "name": "Run tests"
+ },
+ {
+ "name": "$result"
+ }
+]
\ No newline at end of file
diff --git a/recipes/recipes/git-repohooks.py b/recipes/recipes/git-repohooks.py
new file mode 100644
index 0000000..c823973
--- /dev/null
+++ b/recipes/recipes/git-repohooks.py
@@ -0,0 +1,53 @@
+# Copyright (C) 2025 The Android Open Source Project
+#
+# 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.
+
+DEPS = [
+ 'recipe_engine/buildbucket',
+ 'recipe_engine/step',
+ 'recipe_engine/path',
+ 'recipe_engine/context',
+ 'depot_tools/bot_update',
+ 'depot_tools/gclient',
+]
+
+PYTHON_VERSION_COMPATIBILITY = 'PY3'
+
+
+def gclient_config(api):
+ """Generate a gclient configuration to check out git-repohooks.
+
+ Return: (config) A gclient recipe module configuration.
+ """
+ cfg = api.gclient.make_config()
+ soln = cfg.solutions.add()
+ soln.name = 'git-repohooks'
+ soln.url = 'https://gerrit.googlesource.com/git-repohooks'
+ soln.revision = 'HEAD'
+ return cfg
+
+
+def RunSteps(api):
+ cl = api.buildbucket.build.input.gerrit_changes[0]
+ project_name = cl.project
+ assert project_name == 'git-repohooks', f'unknown project: "{project_name}"'
+
+ api.bot_update.ensure_checkout(gclient_config=gclient_config(api))
+
+ with api.context(cwd=api.path.start_dir / project_name):
+ # TODO(b/266734831): Use tox to run tests.
+ api.step('Run tests', ['vpython3', 'run_tests', '-vv'])
+
+
+def GenTests(api):
+ yield (api.test('basic') + api.buildbucket.try_build(project='git-repohooks'))
diff --git a/repos/git-repohooks.star b/repos/git-repohooks.star
new file mode 100644
index 0000000..62bb99a
--- /dev/null
+++ b/repos/git-repohooks.star
@@ -0,0 +1,58 @@
+# This is configuration for LUCI for the git-repohooks repo
+# https://gerrit.googlesource.com/git-repohooks
+
+# Set up Swarming permissions (for LED).
+luci.binding(
+ realm = "try",
+ roles = "role/swarming.taskTriggerer",
+ groups = "mdb/git-repo-try-build-access",
+)
+
+luci.binding(
+ realm = "pools/try",
+ roles = "role/swarming.poolUser",
+ groups = "mdb/git-repo-try-build-access",
+)
+
+luci.builder(
+ name = "Verify git-repohooks CL",
+ bucket = "try",
+ executable = luci.recipe(
+ name = "git-repohooks",
+ ),
+ service_account = "gerrit-luci-try-builder@gerritcodereview-ci.iam.gserviceaccount.com",
+ dimensions = {
+ "os": "Ubuntu",
+ "cpu": "x86-64",
+ "pool": "luci.gerrit.try",
+ },
+)
+
+luci.cq_group(
+ name = "git-repohooks_repo",
+ acls = [
+ acl.entry(
+ roles = [acl.CQ_DRY_RUNNER, acl.CQ_NEW_PATCHSET_RUN_TRIGGERER],
+ groups = "all",
+ ),
+ acl.entry(
+ acl.CQ_COMMITTER,
+ groups = "googlers",
+ ),
+ ],
+ watch = cq.refset(
+ repo = "https://gerrit.googlesource.com/git-repohooks",
+ refs = ["refs/heads/.+"],
+ ),
+)
+
+luci.cq_tryjob_verifier(
+ builder = "try/Verify git-repohooks CL",
+ cq_group = "git-repohooks_repo",
+ # Add NEW_PATCHSET_RUN to the defaults DRY_RUN and FULL_RUN
+ mode_allowlist = [
+ cq.MODE_DRY_RUN,
+ cq.MODE_FULL_RUN,
+ cq.MODE_NEW_PATCHSET_RUN,
+ ],
+)