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