Skip to content

Commit f01db6e

Browse files
authored
Refactored release process (#1434)
Signed-off-by: dhoard <doug.hoard@gmail.com>
1 parent f613c73 commit f01db6e

File tree

5 files changed

+719
-803
lines changed

5 files changed

+719
-803
lines changed

MAINTAINER_NOTES.md

Lines changed: 0 additions & 78 deletions
This file was deleted.

RELEASING.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# Releasing
2+
3+
## Prerequisites
4+
5+
- `gpg` (for artifact signing)
6+
- `sha256sum` (for checksums)
7+
- `~/.m2/settings.xml` with credentials for Maven Central
8+
- Clean git working directory on `main`/`master` branch
9+
10+
## Usage
11+
12+
```shell
13+
./release.sh <VERSION>
14+
15+
# With specific GPG key
16+
./release.sh <VERSION> --gpg-key <KEY_ID>
17+
18+
# Show help
19+
./release.sh --help
20+
```
21+
22+
## Examples
23+
24+
```shell
25+
# Release version 1.6.0
26+
./release.sh 1.6.0
27+
28+
# Release with specific GPG key
29+
./release.sh 1.6.0 --gpg-key ABC123DEF
30+
```
31+
32+
## What the Release Script Does
33+
34+
1. Validates prerequisites (mvnw, maven settings, gpg, git, sha256sum)
35+
2. Validates git state (clean worktree, on main/master branch)
36+
3. Checks no existing release branch or tag exists
37+
4. Creates release branch: `release-{VERSION}`
38+
5. Updates version across all Maven modules
39+
6. Builds and verifies all modules
40+
7. Deploys `collector` module to Maven Central
41+
8. Assembles release artifacts in `RELEASE/` directory:
42+
- Copies javaagent, isolator_javaagent, and standalone jars
43+
- Signs each jar with GPG
44+
- Generates SHA256 checksums
45+
9. Commits release on release branch
46+
10. Creates annotated tag: `v{VERSION}`
47+
11. Pushes release branch and tag to remote
48+
12. Switches back to main branch
49+
13. Sets post-release version: `{VERSION}-POST`
50+
14. Commits and pushes post-release version
51+
52+
## Release Artifacts
53+
54+
Release artifacts will be located in the `RELEASE` directory:
55+
56+
- `jmx_prometheus_javaagent-<VERSION>.jar`
57+
- `jmx_prometheus_javaagent-<VERSION>.jar.asc`
58+
- `jmx_prometheus_javaagent-<VERSION>.jar.sha256`
59+
- `jmx_prometheus_isolator_javaagent-<VERSION>.jar`
60+
- `jmx_prometheus_isolator_javaagent-<VERSION>.jar.asc`
61+
- `jmx_prometheus_isolator_javaagent-<VERSION>.jar.sha256`
62+
- `jmx_prometheus_standalone-<VERSION>.jar`
63+
- `jmx_prometheus_standalone-<VERSION>.jar.asc`
64+
- `jmx_prometheus_standalone-<VERSION>.jar.sha256`
65+
66+
Attach all files to the GitHub release.

build.sh

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
#!/usr/bin/env bash
2+
3+
#
4+
# Copyright (C) The Prometheus jmx_exporter Authors
5+
#
6+
# Licensed under the Apache License, Version 2.0 (the "License");
7+
# you may not use this file except in compliance with the License.
8+
# You may obtain a copy of the License at
9+
#
10+
# https://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing, software
13+
# distributed under the License is distributed on an "AS IS" BASIS,
14+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
# See the License for the specific language governing permissions and
16+
# limitations under the License.
17+
#
18+
19+
set -euo pipefail
20+
21+
readonly RELEASE_DIR='RELEASE'
22+
23+
ARTIFACTS=(
24+
"jmx_prometheus_javaagent/target/jmx_prometheus_javaagent-{version}.jar"
25+
"jmx_prometheus_isolator_javaagent/target/jmx_prometheus_isolator_javaagent-{version}.jar"
26+
"jmx_prometheus_standalone/target/jmx_prometheus_standalone-{version}.jar"
27+
)
28+
29+
gpg_key_id=""
30+
31+
log_info() {
32+
echo "> $*"
33+
}
34+
35+
log_error() {
36+
echo "! $*" >&2
37+
}
38+
39+
usage() {
40+
cat <<EOF
41+
Usage: $(basename "$0") [options]
42+
43+
Options:
44+
--gpg-key <key-id> GPG key ID for signing (uses default key if not specified)
45+
-h, --help Show this help message
46+
47+
Description:
48+
Build the JMX Exporter and create release artifacts in the RELEASE/ directory.
49+
Version is automatically detected from pom.xml.
50+
51+
Examples:
52+
$(basename "$0")
53+
$(basename "$0") --gpg-key ABC123DEF
54+
55+
Requirements:
56+
- mvnw in current directory
57+
- gpg (for artifact signing)
58+
- sha256sum (for checksums)
59+
EOF
60+
}
61+
62+
check_prerequisites() {
63+
log_info "Checking prerequisites"
64+
65+
if [[ ! -f "mvnw" ]]; then
66+
log_error "mvnw not found in current directory"
67+
exit 1
68+
fi
69+
70+
if ! command -v gpg &>/dev/null; then
71+
log_error "GPG not found - required for artifact signing"
72+
exit 1
73+
fi
74+
75+
if ! command -v sha256sum &>/dev/null; then
76+
log_error "sha256sum not found"
77+
exit 1
78+
fi
79+
80+
if ! command -v sed &>/dev/null; then
81+
log_error "sed not found"
82+
exit 1
83+
fi
84+
85+
if ! command -v awk &>/dev/null; then
86+
log_error "awk not found"
87+
exit 1
88+
fi
89+
90+
if ! command -v column &>/dev/null; then
91+
log_error "column not found"
92+
exit 1
93+
fi
94+
95+
if [[ -n "${gpg_key_id}" ]]; then
96+
if ! gpg --list-secret-keys "${gpg_key_id}" &>/dev/null; then
97+
log_error "GPG secret key not found: ${gpg_key_id}"
98+
exit 1
99+
fi
100+
log_info "Using GPG key: ${gpg_key_id}"
101+
else
102+
log_info "Using default GPG key"
103+
fi
104+
105+
log_info "All prerequisites satisfied"
106+
}
107+
108+
get_version() {
109+
local version
110+
111+
version=$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout 2>/dev/null | head -n 1)
112+
113+
if [[ -z "${version}" || "${version}" == *"@"* ]]; then
114+
log_error "Could not determine version from pom.xml"
115+
exit 1
116+
fi
117+
118+
echo "${version}"
119+
}
120+
121+
build_and_verify() {
122+
log_info "Building and verifying"
123+
124+
./mvnw -B clean verify
125+
126+
log_info "Build and verification completed"
127+
}
128+
129+
assemble_artifacts() {
130+
local ver="$1"
131+
132+
log_info "Assembling release artifacts"
133+
134+
rm -rf "${RELEASE_DIR}"
135+
mkdir -p "${RELEASE_DIR}"
136+
137+
local artifact_path
138+
for template in "${ARTIFACTS[@]}"; do
139+
artifact_path="${template//\{version\}/${ver}}"
140+
if [[ ! -f "${artifact_path}" ]]; then
141+
log_error "Artifact not found: ${artifact_path}"
142+
exit 1
143+
fi
144+
cp "${artifact_path}" "${RELEASE_DIR}/"
145+
log_info "Copied: ${artifact_path}"
146+
done
147+
148+
log_info "Artifacts copied to ${RELEASE_DIR}/"
149+
150+
pushd "${RELEASE_DIR}" >/dev/null
151+
152+
local gpg_opts=("gpg")
153+
if [[ -n "${gpg_key_id}" ]]; then
154+
gpg_opts+=("--default-key" "${gpg_key_id}")
155+
fi
156+
157+
local filename
158+
for filename in *.jar; do
159+
if [[ -f "${filename}" ]]; then
160+
"${gpg_opts[@]}" --armor --detach-sign "${filename}"
161+
log_info "Signed: ${filename}.asc"
162+
163+
sha256sum "${filename}" > "${filename}.sha256"
164+
log_info "Checksum: ${filename}.sha256"
165+
fi
166+
done
167+
168+
popd >/dev/null
169+
170+
log_info "Signatures and checksums generated"
171+
log_info "Build artifacts:"
172+
ls -l "${RELEASE_DIR}/" | tail -n +2 | awk '{$1=$2=$3=$4=""; sub(/^[ \t]+/, ""); print}' | column -t | sed 's/^/> /'
173+
}
174+
175+
main() {
176+
while [[ $# -gt 0 ]]; do
177+
case "$1" in
178+
--gpg-key)
179+
gpg_key_id="$2"
180+
shift 2
181+
;;
182+
-h|--help)
183+
usage
184+
exit 0
185+
;;
186+
-*)
187+
log_error "Unknown option: $1"
188+
usage
189+
exit 1
190+
;;
191+
*)
192+
log_error "Unexpected argument: $1"
193+
usage
194+
exit 1
195+
;;
196+
esac
197+
done
198+
199+
echo "> Prometheus JMX Exporter Build"
200+
log_info "GPG key: ${gpg_key_id:-default}"
201+
202+
check_prerequisites
203+
204+
local version
205+
version=$(get_version)
206+
log_info "Version: ${version}"
207+
208+
build_and_verify
209+
assemble_artifacts "${version}"
210+
211+
log_info "Build completed successfully!"
212+
}
213+
214+
main "$@"

0 commit comments

Comments
 (0)