From 1d0ea4d3536daef09aa6ad9a2dcf7c2fe719a94d Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Mon, 27 May 2024 19:31:53 +0000 Subject: [PATCH 01/21] feat: enable hermetic library generation --- .../{.OwlBot.yaml => .OwlBot-hermetic.yaml} | 0 .../hermetic_library_generation.yaml | 39 ++++++ .../update_googleapis_committish.yaml | 42 ++++++ generation/hermetic_library_generation.sh | 125 ++++++++++++++++++ generation/update_googleapis_committish.sh | 92 +++++++++++++ generation_config.yaml | 30 +++++ 6 files changed, 328 insertions(+) rename .github/{.OwlBot.yaml => .OwlBot-hermetic.yaml} (100%) create mode 100644 .github/workflows/hermetic_library_generation.yaml create mode 100644 .github/workflows/update_googleapis_committish.yaml create mode 100644 generation/hermetic_library_generation.sh create mode 100644 generation/update_googleapis_committish.sh create mode 100644 generation_config.yaml diff --git a/.github/.OwlBot.yaml b/.github/.OwlBot-hermetic.yaml similarity index 100% rename from .github/.OwlBot.yaml rename to .github/.OwlBot-hermetic.yaml diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml new file mode 100644 index 000000000..a7e05557b --- /dev/null +++ b/.github/workflows/hermetic_library_generation.yaml @@ -0,0 +1,39 @@ +# Copyright 2024 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. +# GitHub action job to test core java library features on +# downstream client libraries before they are released. +name: Hermetic library generation upon generation config change through pull requests +on: + pull_request: + +jobs: + library_generation: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} + - name: Generate changed libraries + shell: bash + run: | + set -x + [ -z "$(git config user.email)" ] && git config --global user.email "cloud-java-bot@google.com" + [ -z "$(git config user.name)" ] && git config --global user.name "cloud-java-bot" + bash generation/hermetic_library_generation.sh \ + --target_branch ${{ github.base_ref }} \ + --current_branch ${{ github.head_ref }} \ + --image_tag $(cat generation_config.yaml | yq .gapic_generator_version) + env: + GH_TOKEN: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} diff --git a/.github/workflows/update_googleapis_committish.yaml b/.github/workflows/update_googleapis_committish.yaml new file mode 100644 index 000000000..aac08d039 --- /dev/null +++ b/.github/workflows/update_googleapis_committish.yaml @@ -0,0 +1,42 @@ +# Copyright 2024 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. +# GitHub action job to test core java library features on +# downstream client libraries before they are released. +name: Update googleapis commit +on: + schedule: + - cron: '0 2 * * *' + workflow_dispatch: + +jobs: + update-googleapis-committish: + runs-on: ubuntu-22.04 + env: + # the branch into which the pull request is merged + base_branch: main + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} + - name: Update googleapis committish to latest + shell: bash + run: | + set -x + [ -z "$(git config user.email)" ] && git config --global user.email "cloud-java-bot@google.com" + [ -z "$(git config user.name)" ] && git config --global user.name "cloud-java-bot" + bash generation/update_googleapis_committish.sh \ + --base_branch "${base_branch}"\ + --repo ${{ github.repository }} + env: + GH_TOKEN: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} diff --git a/generation/hermetic_library_generation.sh b/generation/hermetic_library_generation.sh new file mode 100644 index 000000000..f425d9c12 --- /dev/null +++ b/generation/hermetic_library_generation.sh @@ -0,0 +1,125 @@ +#!/bin/bash +set -e +# This script should be run at the root of the repository. +# This script is used to, when a pull request changes the generation +# configuration (generation_config.yaml by default): +# 1. Find whether the last commit in this pull request contains changes to +# the generation configuration and exit early if it doesn't have such a change +# since the generation result would be the same. +# 2. Compare generation configurations in the current branch (with which the +# pull request associated) and target branch (into which the pull request is +# merged); +# 3. Generate changed libraries using library_generation image; +# 4. Commit the changes to the pull request, if any. +# 5. Edit the PR body with generated pull request description, if applicable. + +# The following commands need to be installed before running the script: +# 1. git +# 2. gh +# 3. docker + +# The parameters of this script is: +# 1. target_branch, the branch into which the pull request is merged. +# 2. current_branch, the branch with which the pull request is associated. +# 3. image_tag, the tag of gcr.io/cloud-devrel-public-resources/java-library-generation. +# 3. [optional] generation_config, the path to the generation configuration, +# the default value is generation_config.yaml in the repository root. +while [[ $# -gt 0 ]]; do +key="$1" +case "${key}" in + --target_branch) + target_branch="$2" + shift + ;; + --current_branch) + current_branch="$2" + shift + ;; + --image_tag) + image_tag="$2" + shift + ;; + --generation_config) + generation_config="$2" + shift + ;; + *) + echo "Invalid option: [$1]" + exit 1 + ;; +esac +shift +done + +if [ -z "${target_branch}" ]; then + echo "missing required argument --target_branch" + exit 1 +fi + +if [ -z "${current_branch}" ]; then + echo "missing required argument --current_branch" + exit 1 +fi + +if [ -z "${image_tag}" ]; then + echo "missing required argument --image_tag" + exit 1 +fi + +if [ -z "${generation_config}" ]; then + generation_config=generation_config.yaml + echo "Use default generation config: ${generation_config}" +fi + +workspace_name="/workspace" +baseline_generation_config="baseline_generation_config.yaml" +message="chore: generate libraries at $(date)" + +git checkout "${target_branch}" +git checkout "${current_branch}" +# if the last commit doesn't contain changes to generation configuration, +# do not generate again as the result will be the same. +change_of_last_commit="$(git diff-tree --no-commit-id --name-only HEAD~1..HEAD -r)" +if [[ ! ("${change_of_last_commit}" == *"${generation_config}"*) ]]; then + echo "The last commit doesn't contain any changes to the generation_config.yaml, skipping the whole generation process." || true + exit 0 +fi +# copy generation configuration from target branch to current branch. +git show "${target_branch}":"${generation_config}" > "${baseline_generation_config}" +config_diff=$(diff "${generation_config}" "${baseline_generation_config}" || true) + +# run hermetic code generation docker image. +docker run \ + --rm \ + -u "$(id -u):$(id -g)" \ + -v "$(pwd):${workspace_name}" \ + -v "${HOME}/.m2:/home/.m2" \ + gcr.io/cloud-devrel-public-resources/java-library-generation:"${image_tag}" \ + --baseline-generation-config-path="${workspace_name}/${baseline_generation_config}" \ + --current-generation-config-path="${workspace_name}/${generation_config}" + + +# commit the change to the pull request. +if [[ $(basename $(pwd)) == "google-cloud-java" ]]; then + git add java-* pom.xml gapic-libraries-bom/pom.xml versions.txt +else + # The image leaves intermediate folders and files it works with. Here we remove them + rm -rdf output googleapis baseline_generation_config.yaml pr_description.txt + git add . +fi +changed_files=$(git diff --cached --name-only) +if [[ "${changed_files}" == "" ]]; then + echo "There is no generated code change with the generation config change ${config_diff}." + echo "Skip committing to the pull request." + exit 0 +fi + +echo "Configuration diff:" +echo "${config_diff}" +git commit -m "${message}" +git push +# set pr body if pr_description.txt is generated. +if [[ -f "pr_description.txt" ]]; then + pr_num=$(gh pr list -s open -H "${current_branch}" -q . --json number | jq ".[] | .number") + gh pr edit "${pr_num}" --body "$(cat pr_description.txt)" +fi diff --git a/generation/update_googleapis_committish.sh b/generation/update_googleapis_committish.sh new file mode 100644 index 000000000..5dfcaba56 --- /dev/null +++ b/generation/update_googleapis_committish.sh @@ -0,0 +1,92 @@ +#!/bin/bash +set -e +# This script should be run at the root of the repository. +# This script is used to update googleapis committish to latest in generation +# configuration at the time of running and create a pull request. + +# The following commands need to be installed before running the script: +# 1. git +# 2. gh + +# The parameters of this script is: +# 1. base_branch, the base branch of the result pull request. +# 2. repo, organization/repo-name, e.g., googleapis/google-cloud-java +# 3. [optional] generation_config, the path to the generation configuration, +# the default value is generation_config.yaml in the repository root. +while [[ $# -gt 0 ]]; do +key="$1" +case "${key}" in + --base_branch) + base_branch="$2" + shift + ;; + --repo) + repo="$2" + shift + ;; + --generation_config) + generation_config="$2" + shift + ;; + *) + echo "Invalid option: [$1]" + exit 1 + ;; +esac +shift +done + +if [ -z "${base_branch}" ]; then + echo "missing required argument --base_branch" + exit 1 +fi + +if [ -z "${repo}" ]; then + echo "missing required argument --repo" + exit 1 +fi + +if [ -z "${generation_config}" ]; then + generation_config="generation_config.yaml" + echo "Use default generation config: ${generation_config}" +fi + +current_branch="generate-libraries-${base_branch}" +title="chore: update googleapis committish at $(date)" + +# try to find a open pull request associated with the branch +pr_num=$(gh pr list -s open -H "${current_branch}" -q . --json number | jq ".[] | .number") +# create a branch if there's no open pull request associated with the +# branch; otherwise checkout the pull request. +if [ -z "${pr_num}" ]; then + git checkout -b "${current_branch}" +else + gh pr checkout "${pr_num}" +fi + +mkdir tmp-googleapis +# use partial clone because only commit history is needed. +git clone --filter=blob:none https://github.com/googleapis/googleapis.git tmp-googleapis +pushd tmp-googleapis +git pull +latest_commit=$(git rev-parse HEAD) +popd +rm -rf tmp-googleapis +sed -i -e "s/^googleapis_commitish.*$/googleapis_commitish: ${latest_commit}/" "${generation_config}" + +git add "${generation_config}" +changed_files=$(git diff --cached --name-only) +if [[ "${changed_files}" == "" ]]; then + echo "The latest googleapis commit is not changed." + echo "Skip committing to the pull request." + exit 0 +fi +git commit -m "${title}" +if [ -z "${pr_num}" ]; then + git remote add remote_repo https://cloud-java-bot:"${GH_TOKEN}@github.com/${repo}.git" + git fetch -q --unshallow remote_repo + git push -f remote_repo "${current_branch}" + gh pr create --title "${title}" --head "${current_branch}" --body "${title}" --base "${base_branch}" +else + git push +fi diff --git a/generation_config.yaml b/generation_config.yaml new file mode 100644 index 000000000..1f8e3004d --- /dev/null +++ b/generation_config.yaml @@ -0,0 +1,30 @@ +gapic_generator_version: 2.40.1 +protoc_version: '25.2' +googleapis_commitish: 6f289d775912966eb0cf04bda91e5e355c998d30 +libraries_bom_version: 26.38.0 +template_excludes: + - 'README.md' + - '.github/release-please.yml' + - '.github/sync-repo-settings.yaml' + - '.github/blunderbuss.yml' + - '.kokoro/nightly/integration.cfg' + - '.kokoro/build.sh' + - '.kokoro/requirements.in' + - '.kokoro/requirements.txt' + - '.kokoro/presubmit/graalvm-native.cfg' + - '.kokoro/presubmit/graalvm-native-17.cfg' +libraries: + - api_shortname: "spanner-jdbc" + name_pretty: "Google Cloud Spanner JDBC" + product_documentation: "https://cloud.google.com/spanner/docs/use-oss-jdbc" + client_documentation: "https://cloud.google.com/java/docs/reference/google-cloud-spanner-jdbc/latest/history" + release_level: "stable" + language: "java" + min_java_version: 8 + repo: "googleapis/java-spanner-jdbc" + repo_short: "java-spanner-jdbc" + distribution_name: "com.google.cloud:google-cloud-spanner-jdbc" + library_type: "OTHER" + codeowner_team: "@googleapis/api-spanner-java" + recommended_package: "com.google.cloud.spanner.jdbc" + GAPICs: From 2416cd988d8d0495fe717a3d974f251ccae09e19 Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Mon, 27 May 2024 20:47:59 +0000 Subject: [PATCH 02/21] fix config yaml syntax --- generation_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generation_config.yaml b/generation_config.yaml index 1f8e3004d..72baf7ddd 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -27,4 +27,4 @@ libraries: library_type: "OTHER" codeowner_team: "@googleapis/api-spanner-java" recommended_package: "com.google.cloud.spanner.jdbc" - GAPICs: + GAPICs: [] From 67c1f042702241b13221bc79889c25da1f6c09c1 Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Tue, 28 May 2024 00:08:50 +0000 Subject: [PATCH 03/21] do not map runners home folder --- generation/hermetic_library_generation.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/generation/hermetic_library_generation.sh b/generation/hermetic_library_generation.sh index f425d9c12..9464642d9 100644 --- a/generation/hermetic_library_generation.sh +++ b/generation/hermetic_library_generation.sh @@ -93,7 +93,6 @@ docker run \ --rm \ -u "$(id -u):$(id -g)" \ -v "$(pwd):${workspace_name}" \ - -v "${HOME}/.m2:/home/.m2" \ gcr.io/cloud-devrel-public-resources/java-library-generation:"${image_tag}" \ --baseline-generation-config-path="${workspace_name}/${baseline_generation_config}" \ --current-generation-config-path="${workspace_name}/${generation_config}" From 586efb9e1e6c48f514faee1c50599f08d359d34b Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Tue, 28 May 2024 00:24:33 +0000 Subject: [PATCH 04/21] try dummy proto_path --- generation_config.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/generation_config.yaml b/generation_config.yaml index 72baf7ddd..d650c4bfa 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -27,4 +27,5 @@ libraries: library_type: "OTHER" codeowner_team: "@googleapis/api-spanner-java" recommended_package: "com.google.cloud.spanner.jdbc" - GAPICs: [] + GAPICs: + - google/api #we use a dummy path to produce a no-op From 59a8cacadeabe29d720091629ddeee647edb0c4d Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Tue, 28 May 2024 00:28:33 +0000 Subject: [PATCH 05/21] correct whitespace --- generation_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generation_config.yaml b/generation_config.yaml index d650c4bfa..fcc96906b 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -28,4 +28,4 @@ libraries: codeowner_team: "@googleapis/api-spanner-java" recommended_package: "com.google.cloud.spanner.jdbc" GAPICs: - - google/api #we use a dummy path to produce a no-op + - google/api #we use a dummy path to produce a no-op From 197d2108d7f1ff9817ecb376f659bba6572e2bde Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Tue, 28 May 2024 00:39:51 +0000 Subject: [PATCH 06/21] use copyright update comittish --- generation_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generation_config.yaml b/generation_config.yaml index fcc96906b..ef0f55734 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -1,6 +1,6 @@ gapic_generator_version: 2.40.1 protoc_version: '25.2' -googleapis_commitish: 6f289d775912966eb0cf04bda91e5e355c998d30 +googleapis_committish: 3597f7db2191c00b100400991ef96e52d62f5841 libraries_bom_version: 26.38.0 template_excludes: - 'README.md' From 1fce4da304d8f1c040f34253471d73fd452ac117 Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Tue, 28 May 2024 00:41:59 +0000 Subject: [PATCH 07/21] correct proto_path --- generation_config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generation_config.yaml b/generation_config.yaml index ef0f55734..8c35a3834 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -1,6 +1,6 @@ gapic_generator_version: 2.40.1 protoc_version: '25.2' -googleapis_committish: 3597f7db2191c00b100400991ef96e52d62f5841 +googleapis_commitish: 6f289d775912966eb0cf04bda91e5e355c998d30 libraries_bom_version: 26.38.0 template_excludes: - 'README.md' @@ -28,4 +28,4 @@ libraries: codeowner_team: "@googleapis/api-spanner-java" recommended_package: "com.google.cloud.spanner.jdbc" GAPICs: - - google/api #we use a dummy path to produce a no-op + - proto_path: google/api #we use a dummy path to produce a no-op From 0efa1cda0fd5ded547e76f7fc2509bcf53b2564e Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Wed, 29 May 2024 21:32:40 +0000 Subject: [PATCH 08/21] preserve pr_description --- generation/hermetic_library_generation.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generation/hermetic_library_generation.sh b/generation/hermetic_library_generation.sh index 9464642d9..d7e55e3c6 100644 --- a/generation/hermetic_library_generation.sh +++ b/generation/hermetic_library_generation.sh @@ -103,8 +103,8 @@ if [[ $(basename $(pwd)) == "google-cloud-java" ]]; then git add java-* pom.xml gapic-libraries-bom/pom.xml versions.txt else # The image leaves intermediate folders and files it works with. Here we remove them - rm -rdf output googleapis baseline_generation_config.yaml pr_description.txt - git add . + rm -rdf output googleapis "${baseline_generation_config}" + git add --all -- ':!pr_description.txt' fi changed_files=$(git diff --cached --name-only) if [[ "${changed_files}" == "" ]]; then From 3e957c53754e953aeee1a61429cc21d8b8eed8bf Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Tue, 4 Jun 2024 20:50:28 +0000 Subject: [PATCH 09/21] update gapic_generator_version to 2.41.0 --- generation_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generation_config.yaml b/generation_config.yaml index 8c35a3834..005cb01bb 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -1,4 +1,4 @@ -gapic_generator_version: 2.40.1 +gapic_generator_version: 2.41.0 protoc_version: '25.2' googleapis_commitish: 6f289d775912966eb0cf04bda91e5e355c998d30 libraries_bom_version: 26.38.0 From 573832a23e85ef2eae2c4d5822cb53bcb9c05709 Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Wed, 12 Jun 2024 17:11:49 +0000 Subject: [PATCH 10/21] infer image tag from config yaml --- .../workflows/hermetic_library_generation.yaml | 3 +-- generation/hermetic_library_generation.sh | 15 ++++----------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml index a7e05557b..23385a1be 100644 --- a/.github/workflows/hermetic_library_generation.yaml +++ b/.github/workflows/hermetic_library_generation.yaml @@ -33,7 +33,6 @@ jobs: [ -z "$(git config user.name)" ] && git config --global user.name "cloud-java-bot" bash generation/hermetic_library_generation.sh \ --target_branch ${{ github.base_ref }} \ - --current_branch ${{ github.head_ref }} \ - --image_tag $(cat generation_config.yaml | yq .gapic_generator_version) + --current_branch ${{ github.head_ref }} env: GH_TOKEN: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} diff --git a/generation/hermetic_library_generation.sh b/generation/hermetic_library_generation.sh index d7e55e3c6..6c3f22d8f 100644 --- a/generation/hermetic_library_generation.sh +++ b/generation/hermetic_library_generation.sh @@ -21,7 +21,6 @@ set -e # The parameters of this script is: # 1. target_branch, the branch into which the pull request is merged. # 2. current_branch, the branch with which the pull request is associated. -# 3. image_tag, the tag of gcr.io/cloud-devrel-public-resources/java-library-generation. # 3. [optional] generation_config, the path to the generation configuration, # the default value is generation_config.yaml in the repository root. while [[ $# -gt 0 ]]; do @@ -35,10 +34,6 @@ case "${key}" in current_branch="$2" shift ;; - --image_tag) - image_tag="$2" - shift - ;; --generation_config) generation_config="$2" shift @@ -61,14 +56,9 @@ if [ -z "${current_branch}" ]; then exit 1 fi -if [ -z "${image_tag}" ]; then - echo "missing required argument --image_tag" - exit 1 -fi - if [ -z "${generation_config}" ]; then generation_config=generation_config.yaml - echo "Use default generation config: ${generation_config}" + echo "Using default generation config: ${generation_config}" fi workspace_name="/workspace" @@ -88,6 +78,9 @@ fi git show "${target_branch}":"${generation_config}" > "${baseline_generation_config}" config_diff=$(diff "${generation_config}" "${baseline_generation_config}" || true) +# parse image tag from the generation configuration. +image_tag=$(grep "gapic_generator_version" "${generation_config}" | cut -d ':' -f 2 | xargs) + # run hermetic code generation docker image. docker run \ --rm \ From 58c006118af58e4986d8ea0145a3bdbba10a502d Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Wed, 12 Jun 2024 17:18:32 +0000 Subject: [PATCH 11/21] correct workflow name --- .github/workflows/update_googleapis_committish.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_googleapis_committish.yaml b/.github/workflows/update_googleapis_committish.yaml index aac08d039..7cc9356f0 100644 --- a/.github/workflows/update_googleapis_committish.yaml +++ b/.github/workflows/update_googleapis_committish.yaml @@ -13,7 +13,7 @@ # limitations under the License. # GitHub action job to test core java library features on # downstream client libraries before they are released. -name: Update googleapis commit +name: Update googleapis committish on: schedule: - cron: '0 2 * * *' From 003e842a1e965e1e0027899f64656d9654b2343e Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Wed, 12 Jun 2024 17:45:22 +0000 Subject: [PATCH 12/21] update config scripts and yamls --- .../scripts}/hermetic_library_generation.sh | 0 .../scripts/update_generation_config.sh | 39 ++++++++++++++--- .../workflows/update_generation_config.yaml | 42 +++++++++++++++++++ 3 files changed, 76 insertions(+), 5 deletions(-) rename {generation => .github/scripts}/hermetic_library_generation.sh (100%) rename generation/update_googleapis_committish.sh => .github/scripts/update_generation_config.sh (59%) create mode 100644 .github/workflows/update_generation_config.yaml diff --git a/generation/hermetic_library_generation.sh b/.github/scripts/hermetic_library_generation.sh similarity index 100% rename from generation/hermetic_library_generation.sh rename to .github/scripts/hermetic_library_generation.sh diff --git a/generation/update_googleapis_committish.sh b/.github/scripts/update_generation_config.sh similarity index 59% rename from generation/update_googleapis_committish.sh rename to .github/scripts/update_generation_config.sh index 5dfcaba56..561a31304 100644 --- a/generation/update_googleapis_committish.sh +++ b/.github/scripts/update_generation_config.sh @@ -1,12 +1,32 @@ #!/bin/bash set -e # This script should be run at the root of the repository. -# This script is used to update googleapis committish to latest in generation -# configuration at the time of running and create a pull request. +# This script is used to update googleapis_commitish, gapic_generator_version, +# and libraries_bom_version in generation configuration at the time of running +# and create a pull request. # The following commands need to be installed before running the script: # 1. git # 2. gh +# 3. jq + +# Utility functions +# Get the latest released version of a Maven artifact. +function get_latest_released_version() { + local group_id=$1 + local artifact_id=$2 + latest=$(curl -s "https://search.maven.org/solrsearch/select?q=g:${group_id}+AND+a:${artifact_id}&core=gav&rows=500&wt=json" | jq -r '.response.docs[] | select(.v | test("^[0-9]+(\\.[0-9]+)*$")) | .v' | sort -V | tail -n 1) + echo "${latest}" +} + +# Update a key to a new value in the generation config. +function update_config() { + local key_word=$1 + local new_value=$2 + local file=$3 + echo "Update ${key_word} to ${new_value} in ${file}" + sed -i -e "s/^${key_word}.*$/${key_word}: ${new_value}/" "${file}" +} # The parameters of this script is: # 1. base_branch, the base branch of the result pull request. @@ -52,7 +72,7 @@ if [ -z "${generation_config}" ]; then fi current_branch="generate-libraries-${base_branch}" -title="chore: update googleapis committish at $(date)" +title="chore: Update generation configuration at $(date)" # try to find a open pull request associated with the branch pr_num=$(gh pr list -s open -H "${current_branch}" -q . --json number | jq ".[] | .number") @@ -72,12 +92,20 @@ git pull latest_commit=$(git rev-parse HEAD) popd rm -rf tmp-googleapis -sed -i -e "s/^googleapis_commitish.*$/googleapis_commitish: ${latest_commit}/" "${generation_config}" +update_config "googleapis_commitish" "${latest_commit}" "${generation_config}" + +# update gapic-generator-java version to the latest +latest_version=$(get_latest_released_version "com.google.api" "gapic-generator-java") +update_config "gapic_generator_version" "${latest_version}" "${generation_config}" + +# update libraries-bom version to the latest +latest_version=$(get_latest_released_version "com.google.cloud" "libraries-bom") +update_config "libraries_bom_version" "${latest_version}" "${generation_config}" git add "${generation_config}" changed_files=$(git diff --cached --name-only) if [[ "${changed_files}" == "" ]]; then - echo "The latest googleapis commit is not changed." + echo "The latest generation config is not changed." echo "Skip committing to the pull request." exit 0 fi @@ -89,4 +117,5 @@ if [ -z "${pr_num}" ]; then gh pr create --title "${title}" --head "${current_branch}" --body "${title}" --base "${base_branch}" else git push + gh pr edit "${pr_num}" --title "${title}" --body "${title}" fi diff --git a/.github/workflows/update_generation_config.yaml b/.github/workflows/update_generation_config.yaml new file mode 100644 index 000000000..70b513312 --- /dev/null +++ b/.github/workflows/update_generation_config.yaml @@ -0,0 +1,42 @@ +# Copyright 2024 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. +# GitHub action job to test core java library features on +# downstream client libraries before they are released. +name: Update generation configuration +on: + schedule: + - cron: '0 2 * * *' + workflow_dispatch: + +jobs: + update-generation-config: + runs-on: ubuntu-22.04 + env: + # the branch into which the pull request is merged + base_branch: main + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} + - name: Update params in generation config to latest + shell: bash + run: | + set -x + [ -z "$(git config user.email)" ] && git config --global user.email "cloud-java-bot@google.com" + [ -z "$(git config user.name)" ] && git config --global user.name "cloud-java-bot" + bash .github/scripts/update_generation_config.sh.sh \ + --base_branch "${base_branch}"\ + --repo ${{ github.repository }} + env: + GH_TOKEN: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} From c587f3e679feed433285366e428afadb408a0c68 Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Thu, 20 Jun 2024 20:41:54 +0000 Subject: [PATCH 13/21] remove old update_googleapis_committish workflow --- .../update_googleapis_committish.yaml | 42 ------------------- 1 file changed, 42 deletions(-) delete mode 100644 .github/workflows/update_googleapis_committish.yaml diff --git a/.github/workflows/update_googleapis_committish.yaml b/.github/workflows/update_googleapis_committish.yaml deleted file mode 100644 index 7cc9356f0..000000000 --- a/.github/workflows/update_googleapis_committish.yaml +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2024 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. -# GitHub action job to test core java library features on -# downstream client libraries before they are released. -name: Update googleapis committish -on: - schedule: - - cron: '0 2 * * *' - workflow_dispatch: - -jobs: - update-googleapis-committish: - runs-on: ubuntu-22.04 - env: - # the branch into which the pull request is merged - base_branch: main - steps: - - uses: actions/checkout@v4 - with: - token: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} - - name: Update googleapis committish to latest - shell: bash - run: | - set -x - [ -z "$(git config user.email)" ] && git config --global user.email "cloud-java-bot@google.com" - [ -z "$(git config user.name)" ] && git config --global user.name "cloud-java-bot" - bash generation/update_googleapis_committish.sh \ - --base_branch "${base_branch}"\ - --repo ${{ github.repository }} - env: - GH_TOKEN: ${{ secrets.CLOUD_JAVA_BOT_TOKEN }} From 8dc31f7de0e8e6d6266e13d0678ca9509076deb8 Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Thu, 20 Jun 2024 21:33:35 +0000 Subject: [PATCH 14/21] sync config structure with that of google-cloud-java --- generation_config.yaml | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/generation_config.yaml b/generation_config.yaml index 005cb01bb..e8517011d 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -1,20 +1,8 @@ gapic_generator_version: 2.41.0 -protoc_version: '25.2' googleapis_commitish: 6f289d775912966eb0cf04bda91e5e355c998d30 libraries_bom_version: 26.38.0 -template_excludes: - - 'README.md' - - '.github/release-please.yml' - - '.github/sync-repo-settings.yaml' - - '.github/blunderbuss.yml' - - '.kokoro/nightly/integration.cfg' - - '.kokoro/build.sh' - - '.kokoro/requirements.in' - - '.kokoro/requirements.txt' - - '.kokoro/presubmit/graalvm-native.cfg' - - '.kokoro/presubmit/graalvm-native-17.cfg' libraries: - - api_shortname: "spanner-jdbc" + - api_shortname: spanner-jdbc name_pretty: "Google Cloud Spanner JDBC" product_documentation: "https://cloud.google.com/spanner/docs/use-oss-jdbc" client_documentation: "https://cloud.google.com/java/docs/reference/google-cloud-spanner-jdbc/latest/history" From 22f5327763f430cd5be898f5178ee1480f3d2600 Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Tue, 25 Jun 2024 18:54:28 +0000 Subject: [PATCH 15/21] remove quotes from config yamls --- generation_config.yaml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/generation_config.yaml b/generation_config.yaml index e8517011d..f14125231 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -3,17 +3,17 @@ googleapis_commitish: 6f289d775912966eb0cf04bda91e5e355c998d30 libraries_bom_version: 26.38.0 libraries: - api_shortname: spanner-jdbc - name_pretty: "Google Cloud Spanner JDBC" - product_documentation: "https://cloud.google.com/spanner/docs/use-oss-jdbc" - client_documentation: "https://cloud.google.com/java/docs/reference/google-cloud-spanner-jdbc/latest/history" - release_level: "stable" - language: "java" + name_pretty: Google Cloud Spanner JDBC + product_documentation: https://cloud.google.com/spanner/docs/use-oss-jdbc + client_documentation: https://cloud.google.com/java/docs/reference/google-cloud-spanner-jdbc/latest/history + release_level: stable + language: java min_java_version: 8 - repo: "googleapis/java-spanner-jdbc" - repo_short: "java-spanner-jdbc" - distribution_name: "com.google.cloud:google-cloud-spanner-jdbc" - library_type: "OTHER" - codeowner_team: "@googleapis/api-spanner-java" - recommended_package: "com.google.cloud.spanner.jdbc" + repo: googleapis/java-spanner-jdbc + repo_short: java-spanner-jdbc + distribution_name: com.google.cloud:google-cloud-spanner-jdbc + library_type: OTHER + codeowner_team: @googleapis/api-spanner-java + recommended_package: com.google.cloud.spanner.jdbc GAPICs: - proto_path: google/api #we use a dummy path to produce a no-op From 18d3b49f503426ff2198d71b0b93bdbafbae2e8e Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Tue, 25 Jun 2024 20:20:14 +0000 Subject: [PATCH 16/21] fix typo in update_generation_config.yaml --- .github/workflows/update_generation_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update_generation_config.yaml b/.github/workflows/update_generation_config.yaml index 70b513312..3cf773992 100644 --- a/.github/workflows/update_generation_config.yaml +++ b/.github/workflows/update_generation_config.yaml @@ -35,7 +35,7 @@ jobs: set -x [ -z "$(git config user.email)" ] && git config --global user.email "cloud-java-bot@google.com" [ -z "$(git config user.name)" ] && git config --global user.name "cloud-java-bot" - bash .github/scripts/update_generation_config.sh.sh \ + bash .github/scripts/update_generation_config.sh \ --base_branch "${base_branch}"\ --repo ${{ github.repository }} env: From 327a181d637805fd66e0737ab014376bc2a0a80b Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Tue, 25 Jun 2024 20:26:10 +0000 Subject: [PATCH 17/21] correct --- .github/workflows/hermetic_library_generation.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml index 23385a1be..0c7a82a3c 100644 --- a/.github/workflows/hermetic_library_generation.yaml +++ b/.github/workflows/hermetic_library_generation.yaml @@ -31,7 +31,7 @@ jobs: set -x [ -z "$(git config user.email)" ] && git config --global user.email "cloud-java-bot@google.com" [ -z "$(git config user.name)" ] && git config --global user.name "cloud-java-bot" - bash generation/hermetic_library_generation.sh \ + bash .github/scriptes/hermetic_library_generation.sh \ --target_branch ${{ github.base_ref }} \ --current_branch ${{ github.head_ref }} env: From e3f77135e020587b14632ff5e84e3ddce554b182 Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Wed, 26 Jun 2024 20:47:19 +0000 Subject: [PATCH 18/21] quote codeowners_team in generation config --- generation_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generation_config.yaml b/generation_config.yaml index f14125231..839104a92 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -13,7 +13,7 @@ libraries: repo_short: java-spanner-jdbc distribution_name: com.google.cloud:google-cloud-spanner-jdbc library_type: OTHER - codeowner_team: @googleapis/api-spanner-java + codeowner_team: '@googleapis/api-spanner-java' recommended_package: com.google.cloud.spanner.jdbc GAPICs: - proto_path: google/api #we use a dummy path to produce a no-op From 31436cff5f00d749e1b945c24659e4222941c885 Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Wed, 26 Jun 2024 20:50:03 +0000 Subject: [PATCH 19/21] update generator version --- generation_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generation_config.yaml b/generation_config.yaml index 839104a92..0e157b64d 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -1,4 +1,4 @@ -gapic_generator_version: 2.41.0 +gapic_generator_version: 2.42.0 googleapis_commitish: 6f289d775912966eb0cf04bda91e5e355c998d30 libraries_bom_version: 26.38.0 libraries: From 47deb97cac0fd354c7db9bfdd24135a313dac09d Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Tue, 2 Jul 2024 15:29:22 +0000 Subject: [PATCH 20/21] fix path to hermetic_library_generation --- .github/workflows/hermetic_library_generation.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml index 0c7a82a3c..3ea9ae43e 100644 --- a/.github/workflows/hermetic_library_generation.yaml +++ b/.github/workflows/hermetic_library_generation.yaml @@ -31,7 +31,7 @@ jobs: set -x [ -z "$(git config user.email)" ] && git config --global user.email "cloud-java-bot@google.com" [ -z "$(git config user.name)" ] && git config --global user.name "cloud-java-bot" - bash .github/scriptes/hermetic_library_generation.sh \ + bash .github/scripts/hermetic_library_generation.sh \ --target_branch ${{ github.base_ref }} \ --current_branch ${{ github.head_ref }} env: From 38172e1be9f7b3a91269f74c53c62718967d8c02 Mon Sep 17 00:00:00 2001 From: diegomarquezp Date: Tue, 2 Jul 2024 23:39:16 +0000 Subject: [PATCH 21/21] fixes to hermetic_library_generation --- .github/workflows/hermetic_library_generation.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml index 3ea9ae43e..7146cc3dc 100644 --- a/.github/workflows/hermetic_library_generation.yaml +++ b/.github/workflows/hermetic_library_generation.yaml @@ -19,6 +19,8 @@ on: jobs: library_generation: + # skip pull requests coming from a forked repository + if: github.event.pull_request.head.repo.full_name == github.repository runs-on: ubuntu-latest steps: - uses: actions/checkout@v4