Skip to content

Commit 287b7f3

Browse files
authored
chore: tools to check repository release readiness (#6982)
* chore: tools to check repository release readiness
1 parent 25025a3 commit 287b7f3

3 files changed

Lines changed: 194 additions & 0 deletions

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# Repository Readiness for Releases
2+
3+
This tool helps release managers to assess the readiness of the ~14 upstream GitHub
4+
repositories for the libraries-bom, such as the java-bigtable and google-cloud-java repositories.
5+
6+
## clone_repositories.sh
7+
8+
`clone_repositories.sh` clones the upstream repositories in your /tmp directory. You run this after the sdk-platform-java release for your release cycle is available.
9+
10+
```
11+
cd tests/release-repository-readiness
12+
./clone_repositories.sh v2.55.1
13+
...
14+
Updating files: 100% (93964/93964), done.
15+
/tmp/release-readiness/google-cloud-java ~/java-cloud-bom/tests/release-repository-readiness
16+
~/java-cloud-bom/tests/release-repository-readiness
17+
```
18+
19+
## check_status.sh:
20+
21+
`check_status.sh` fetches the latest information of each upstream repository
22+
using the cloned repositories, and displays the status of the main branch and
23+
the latest released source tree.
24+
25+
A status consists of the shared dependencies BOM version (`shared dep` column)
26+
and hermetic build code generation (`code gen` column).
27+
28+
During the handwritten libraries phase in your release cycle, you run this
29+
occasionally to find actions needed for the repositories.
30+
31+
```
32+
suztomo@suztomo2:~/java-cloud-bom/tests/release-repository-readiness$ ./check_status.sh
33+
Expected google-cloud-shared-dependencies BOM version: 3.45.1
34+
Expected GAPIC generator Java version: 2.55.1
35+
| main | released |
36+
repository |shared dep|code gen |shared dep|code gen |
37+
google-cloud-java |OK |OK |OK |OK |
38+
java-bigquerystorage|OK |OK |OK |OK |
39+
java-bigquery |! 3.44.0 |N/A |! 3.44.0 |N/A |
40+
java-bigtable |OK |OK |OK |OK |
41+
java-datastore |OK |OK |OK |OK |
42+
java-firestore |OK |OK |! 3.44.0 |! 2.54.0 |
43+
java-logging |OK |OK |OK |OK |
44+
java-logging-logback|OK |N/A |OK |N/A |
45+
java-pubsub |OK |OK |OK |OK |
46+
java-pubsublite |OK |OK |OK |OK |
47+
java-spanner |! 3.44.0 |! 2.54.0 |! 3.44.0 |! 2.54.0 |
48+
java-spanner-jdbc |OK |N/A |OK |N/A |
49+
java-storage |OK |OK |OK |OK |
50+
java-storage-nio |OK |N/A |OK |N/A |
51+
```
52+
53+
- In this example output above, you can see:
54+
- The java-bigquery and java-spanner repositories need to merge pull requests
55+
for the sdk-platform-java-config and hermetic code generation.
56+
- java-firestore repository has merged the changes in the main branch but
57+
it hasn't made a release with the changes.
58+
- The rest of the repositories show the changes are already in the latest release.
59+
- "N/A" means that there's no hermetic code generation in the repository.
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Given the repositories are checked out in the WORK_DIR below
2+
# find the shared dependencies BOM version in current release
3+
# and find any missing updates.
4+
5+
set -ef
6+
7+
WORK_DIR=/tmp/release-readiness
8+
9+
if [[ ! -d "${WORK_DIR}/sdk-platform-java" ]]; then
10+
echo "The repositories are missing in ${WORK_DIR}. Please use clone_repositories.sh first"
11+
exit 1
12+
fi
13+
14+
cd "${WORK_DIR}/sdk-platform-java"
15+
expected_shared_deps_version=$(mvn -pl java-shared-dependencies help:evaluate -Dexpression=project.version -q -DforceStdout)
16+
expected_generator_version=$(mvn -pl gapic-generator-java help:evaluate -Dexpression=project.version -q -DforceStdout)
17+
echo "Expected google-cloud-shared-dependencies BOM version: ${expected_shared_deps_version}"
18+
echo "Expected GAPIC generator Java version: ${expected_generator_version}"
19+
20+
21+
function check_shared_dependency_status() {
22+
local project=$1
23+
local actual_shared_deps_version=$(mvn -pl ${project} help:evaluate -Dexpression=google-cloud-shared-dependencies.version -q -DforceStdout)
24+
if [[ "${expected_shared_deps_version}" != "${actual_shared_deps_version}" ]]; then
25+
local shared_deps_status="! ${actual_shared_deps_version}"
26+
else
27+
local shared_deps_status="OK"
28+
fi
29+
echo "${shared_deps_status}"
30+
}
31+
32+
function check_generated_code_status() {
33+
if [ -r "generation_config.yaml" ]; then
34+
local actual_generator_version=$(perl -nle 'print $1 if m/gapic_generator_version:\s*(.+)/' generation_config.yaml)
35+
if [[ "${expected_generator_version}" != "${actual_generator_version}" ]]; then
36+
local generator_status="! ${actual_generator_version}"
37+
else
38+
local generator_status="OK"
39+
fi
40+
else
41+
local generator_status="N/A"
42+
fi
43+
echo "${generator_status}"
44+
}
45+
echo ", main, released" |\
46+
awk -F',' '{printf "%-20s|%-21s|%-21s|\n", $1, $2, $3}'
47+
48+
echo " repository,shared dep,code gen,shared dep,code gen" |\
49+
awk -F',' '{printf "%-20s|%-10s|%-10s|%-10s|%-10s|\n", $1, $2, $3, $4, $5}'
50+
51+
repositories=$(find "${WORK_DIR}" -mindepth 1 -maxdepth 1 -type d -not -name "sdk-platform-java")
52+
for repo_folder in $repositories; do
53+
cd "${repo_folder}"
54+
repo=$(basename "${repo_folder}")
55+
git fetch -q origin main > /dev/null
56+
git checkout -q main > /dev/null
57+
git pull -q origin main > /dev/null
58+
if [[ "$repo" == "google-cloud-java" ]]; then
59+
# In google-cloud-java repository, the parent pom module
60+
# inherits the property.
61+
project=google-cloud-pom-parent
62+
else
63+
# In normal handwritten libraries, the root project receives the property.
64+
project=.
65+
fi
66+
shared_deps_status_main=$(check_shared_dependency_status "${project}")
67+
generated_code_status_main=$(check_generated_code_status)
68+
69+
last_release_tag=$(gh release list --limit 1 --order desc --json 'tagName' --jq '.[].tagName')
70+
git fetch -q origin tag ${last_release_tag} --no-tags > /dev/null
71+
git checkout -q ${last_release_tag} > /dev/null
72+
shared_deps_status_last_release=$(check_shared_dependency_status "${project}")
73+
generated_code_status_last_release=$(check_generated_code_status)
74+
75+
echo "${repo},${shared_deps_status_main},${generated_code_status_main},\
76+
${shared_deps_status_last_release},${generated_code_status_last_release}" | \
77+
awk -F',' '{printf "%-20s|%-10s|%-10s|%-10s|%-10s|\n", $1, $2, $3, $4, $5}'
78+
done
79+
80+
81+
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#!/bin/bash
2+
3+
# Clones the repositories we check in the workspace directory
4+
# (/tmp/release-readiness). It's convenient to separate the data
5+
# retrieval part (this script) and the logic (check_readiness.sh)
6+
# separated, so that the maitnainers can iterate the logic without
7+
# needing cloning the repositories.
8+
9+
set -ef
10+
11+
WORK_DIR=/tmp/release-readiness
12+
mkdir -p ${WORK_DIR}
13+
14+
function clone_repository() {
15+
# e.g., "java-bigtable"
16+
repo_name=$1
17+
# e.g., "v2.55.1" or left empty
18+
revision=$2
19+
20+
repo_dir="${WORK_DIR}/${repo_name}"
21+
if [ ! -d "${repo_dir}" ]; then
22+
repo_url="https://github.com/googleapis/${repo_name}"
23+
git clone ${repo_url} ${repo_dir}
24+
fi
25+
pushd "${repo_dir}"
26+
if [ -n "${revision}" ]; then
27+
git fetch origin
28+
git checkout "${revision}"
29+
else
30+
# There may be new updates since last run
31+
git pull
32+
fi
33+
popd
34+
}
35+
36+
37+
# sdk-platform-java release
38+
# https://github.com/googleapis/sdk-platform-java/releases
39+
sdk_platform_java_version=$1
40+
if [ -z "$sdk_platform_java_version" ]; then
41+
echo "Specify sdk-platform-java release tag. Example: v2.55.1"
42+
exit 1
43+
fi
44+
45+
# This requires to checkout the specific release version
46+
clone_repository "sdk-platform-java" "${sdk_platform_java_version}"
47+
48+
repos=("java-storage-nio" "java-storage" "java-spanner-jdbc" "java-spanner" \
49+
"java-pubsublite" "java-pubsub" "java-logging-logback" "java-logging" \
50+
"java-firestore" "java-datastore" "java-bigtable" "java-bigquery" \
51+
"java-bigquerystorage" "google-cloud-java")
52+
for repo in ${repos[@]}; do
53+
clone_repository "${repo}"
54+
done

0 commit comments

Comments
 (0)