Skip to content

Commit 3287fca

Browse files
jbachorikclaude
andcommitted
ci: switch from Vault to SSM for Maven Central credentials
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent de0b972 commit 3287fca

2 files changed

Lines changed: 74 additions & 48 deletions

File tree

‎.gitlab-ci.yml‎

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ variables:
1010
BUILDER_IMAGE: "registry.ddbuild.io/images/mirror/dd-trace-java-docker-build:ci-base"
1111
# Route external Maven/Gradle resolution through Datadog's internal proxy.
1212
MAVEN_REPOSITORY_PROXY: "https://depot-read-api-java.us1.ddbuild.io/magicmirror/magicmirror/@current/"
13-
VAULT_ADDR: "https://vault.us1.ddbuild.io"
1413

1514
default:
1615
tags: ["arch:amd64"]
@@ -24,6 +23,10 @@ default:
2423
- export ORG_GRADLE_PROJECT_gradlePluginProxy=$MAVEN_REPOSITORY_PROXY
2524
- export GRADLE_ARGS="--no-daemon --stacktrace --parallel"
2625

26+
.publish_sa:
27+
variables:
28+
KUBERNETES_SERVICE_ACCOUNT_OVERWRITE: java-reggie
29+
2730
build:
2831
extends: .gradle_job
2932
stage: build
@@ -35,7 +38,9 @@ build:
3538
junit: "**/build/test-results/**/*.xml"
3639

3740
publish_to_maven_central:
38-
extends: .gradle_job
41+
extends:
42+
- .gradle_job
43+
- .publish_sa
3944
stage: publish
4045
rules:
4146
- if: '$CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+$/'
@@ -44,32 +49,40 @@ publish_to_maven_central:
4449
allow_failure: true
4550
# Maven Central credentials: written via scripts/update-maven-central-secrets.sh
4651
# GPG signing key: created via the create_key job below
47-
# Both are stored in Vault and read automatically by the CI runner.
52+
# Both are stored in AWS SSM and read via the java-reggie K8s service account IAM role.
4853
script:
49-
- export ORG_GRADLE_PROJECT_mavenCentralUsername=$(vault kv get -field=username kv/k8s/gitlab-runner/java-reggie/maven-central)
50-
- export ORG_GRADLE_PROJECT_mavenCentralPassword=$(vault kv get -field=password kv/k8s/gitlab-runner/java-reggie/maven-central)
51-
- export ORG_GRADLE_PROJECT_signingInMemoryKey=$(vault kv get -field=gpg_private_key kv/k8s/gitlab-runner/java-reggie/signing)
52-
- export ORG_GRADLE_PROJECT_signingInMemoryKeyId=$(vault kv get -field=gpg_key_id kv/k8s/gitlab-runner/java-reggie/signing)
53-
- export ORG_GRADLE_PROJECT_signingInMemoryKeyPassword=$(vault kv get -field=gpg_passphrase kv/k8s/gitlab-runner/java-reggie/signing)
54+
- ORG_GRADLE_PROJECT_mavenCentralUsername=$(aws ssm get-parameter --region us-east-1 --name ci.java-reggie.maven_central_username --with-decryption --query "Parameter.Value" --out text) || { echo "ERROR: SSM read failed for mavenCentralUsername"; exit 1; }
55+
- export ORG_GRADLE_PROJECT_mavenCentralUsername
56+
- ORG_GRADLE_PROJECT_mavenCentralPassword=$(aws ssm get-parameter --region us-east-1 --name ci.java-reggie.maven_central_password --with-decryption --query "Parameter.Value" --out text) || { echo "ERROR: SSM read failed for mavenCentralPassword"; exit 1; }
57+
- export ORG_GRADLE_PROJECT_mavenCentralPassword
58+
- ORG_GRADLE_PROJECT_signingInMemoryKey=$(aws ssm get-parameter --region us-east-1 --name ci.java-reggie.signing.gpg_private_key --with-decryption --query "Parameter.Value" --out text) || { echo "ERROR: SSM read failed for signingInMemoryKey"; exit 1; }
59+
- export ORG_GRADLE_PROJECT_signingInMemoryKey
60+
- ORG_GRADLE_PROJECT_signingInMemoryKeyId=$(aws ssm get-parameter --region us-east-1 --name ci.java-reggie.signing.gpg_key_id --with-decryption --query "Parameter.Value" --out text) || { echo "ERROR: SSM read failed for signingInMemoryKeyId"; exit 1; }
61+
- export ORG_GRADLE_PROJECT_signingInMemoryKeyId
62+
- ORG_GRADLE_PROJECT_signingInMemoryKeyPassword=$(aws ssm get-parameter --region us-east-1 --name ci.java-reggie.signing.gpg_passphrase --with-decryption --query "Parameter.Value" --out text) || { echo "ERROR: SSM read failed for signingInMemoryKeyPassword"; exit 1; }
63+
- export ORG_GRADLE_PROJECT_signingInMemoryKeyPassword
5464
- ./gradlew :reggie-runtime:publishAllPublicationsToMavenCentralRepository $GRADLE_ARGS
5565

5666
publish_snapshot:
57-
extends: .gradle_job
67+
extends:
68+
- .gradle_job
69+
- .publish_sa
5870
stage: publish
5971
rules:
6072
- if: '$CI_COMMIT_BRANCH == "main"'
6173
when: on_success
6274
script:
63-
- SONATYPE_USERNAME=$(vault kv get -field=username kv/k8s/gitlab-runner/java-reggie/maven-central) || { echo "ERROR: vault read failed for username"; exit 1; }
64-
- SONATYPE_PASSWORD=$(vault kv get -field=password kv/k8s/gitlab-runner/java-reggie/maven-central) || { echo "ERROR: vault read failed for password"; exit 1; }
75+
- SONATYPE_USERNAME=$(aws ssm get-parameter --region us-east-1 --name ci.java-reggie.maven_central_username --with-decryption --query "Parameter.Value" --out text) || { echo "ERROR: SSM read failed for username"; exit 1; }
76+
- SONATYPE_PASSWORD=$(aws ssm get-parameter --region us-east-1 --name ci.java-reggie.maven_central_password --with-decryption --query "Parameter.Value" --out text) || { echo "ERROR: SSM read failed for password"; exit 1; }
6577
- '[[ -n "$SONATYPE_USERNAME" ]] || { echo "ERROR: SONATYPE_USERNAME is empty"; exit 1; }'
6678
- '[[ -n "$SONATYPE_PASSWORD" ]] || { echo "ERROR: SONATYPE_PASSWORD is empty"; exit 1; }'
67-
- echo "Vault credentials loaded (username length=${#SONATYPE_USERNAME}, password length=${#SONATYPE_PASSWORD})"
6879
- export SONATYPE_USERNAME SONATYPE_PASSWORD
69-
- ORG_GRADLE_PROJECT_signingInMemoryKey=$(vault kv get -field=gpg_private_key kv/k8s/gitlab-runner/java-reggie/signing) || { echo "ERROR: vault read failed for signing key"; exit 1; }
70-
- ORG_GRADLE_PROJECT_signingInMemoryKeyId=$(vault kv get -field=gpg_key_id kv/k8s/gitlab-runner/java-reggie/signing) || { echo "ERROR: vault read failed for signing key id"; exit 1; }
71-
- ORG_GRADLE_PROJECT_signingInMemoryKeyPassword=$(vault kv get -field=gpg_passphrase kv/k8s/gitlab-runner/java-reggie/signing) || { echo "ERROR: vault read failed for signing passphrase"; exit 1; }
72-
- export ORG_GRADLE_PROJECT_signingInMemoryKey ORG_GRADLE_PROJECT_signingInMemoryKeyId ORG_GRADLE_PROJECT_signingInMemoryKeyPassword
80+
- ORG_GRADLE_PROJECT_signingInMemoryKey=$(aws ssm get-parameter --region us-east-1 --name ci.java-reggie.signing.gpg_private_key --with-decryption --query "Parameter.Value" --out text) || { echo "ERROR: SSM read failed for signingInMemoryKey"; exit 1; }
81+
- export ORG_GRADLE_PROJECT_signingInMemoryKey
82+
- ORG_GRADLE_PROJECT_signingInMemoryKeyId=$(aws ssm get-parameter --region us-east-1 --name ci.java-reggie.signing.gpg_key_id --with-decryption --query "Parameter.Value" --out text) || { echo "ERROR: SSM read failed for signingInMemoryKeyId"; exit 1; }
83+
- export ORG_GRADLE_PROJECT_signingInMemoryKeyId
84+
- ORG_GRADLE_PROJECT_signingInMemoryKeyPassword=$(aws ssm get-parameter --region us-east-1 --name ci.java-reggie.signing.gpg_passphrase --with-decryption --query "Parameter.Value" --out text) || { echo "ERROR: SSM read failed for signingInMemoryKeyPassword"; exit 1; }
85+
- export ORG_GRADLE_PROJECT_signingInMemoryKeyPassword
7386
- ./gradlew :reggie-runtime:publishToSonatype $GRADLE_ARGS
7487

7588
# Run once manually to generate the GPG signing key and store it in AWS SSM

‎scripts/update-maven-central-secrets.sh‎

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/env bash
2-
# Writes Maven Central credentials to Vault at kv/k8s/gitlab-runner/java-reggie/maven-central.
3-
# The GitLab CI runner reads them automatically from that path via its K8s service account.
2+
# Writes Maven Central credentials to AWS SSM Parameter Store.
3+
# The GitLab CI runner reads them via the java-reggie K8s service account IAM role.
44
#
55
# Credentials are resolved in order:
66
# 1. 1Password item "Maven Central Portal Token" (vault: Shared-Public-Software-Repositories)
@@ -9,16 +9,15 @@
99
#
1010
# Usage: ./scripts/update-maven-central-secrets.sh [--dry-run]
1111
#
12-
# Prerequisites:
13-
# - ddtool (for Vault OIDC login)
14-
# - vault CLI
15-
# - op (1Password CLI) — optional but recommended
12+
# AWS credentials are obtained automatically via aws-vault (sso-build-stable-developer).
13+
# 1Password CLI (op) is optional but recommended.
1614

1715
set -euo pipefail
1816

17+
AWS_PROFILE="sso-build-stable-developer"
1918
DRY_RUN=0
20-
VAULT_ADDR_DEFAULT="https://vault.us1.ddbuild.io"
21-
VAULT_PATH="kv/k8s/gitlab-runner/java-reggie/maven-central"
19+
AWS_REGION="us-east-1"
20+
SSM_PREFIX="ci.java-reggie"
2221
KEYCHAIN_SERVICE="java-reggie-maven-central"
2322
OP_ITEM_NAME="Maven Central Portal Token"
2423
OP_VAULT="Shared-Public-Software-Repositories"
@@ -34,7 +33,13 @@ for arg in "$@"; do
3433
esac
3534
done
3635

37-
export VAULT_ADDR="${VAULT_ADDR:-$VAULT_ADDR_DEFAULT}"
36+
# ── Re-exec via aws-vault if not already running inside it ────────────────────
37+
38+
if [[ -z "${AWS_VAULT:-}" ]]; then
39+
command -v aws-vault >/dev/null 2>&1 || { echo "ERROR: aws-vault is required"; exit 1; }
40+
echo "Re-executing via aws-vault ($AWS_PROFILE)..."
41+
exec aws-vault exec "$AWS_PROFILE" -- "$0" "$@"
42+
fi
3843

3944
# ── Platform detection ────────────────────────────────────────────────────────
4045

@@ -43,9 +48,7 @@ IS_MACOS=0
4348

4449
# ── Prerequisites ─────────────────────────────────────────────────────────────
4550

46-
for cmd in vault ddtool; do
47-
command -v "$cmd" >/dev/null 2>&1 || { echo "ERROR: $cmd is required"; exit 1; }
48-
done
51+
command -v aws >/dev/null 2>&1 || { echo "ERROR: aws CLI is required"; exit 1; }
4952

5053
# ── Helpers ───────────────────────────────────────────────────────────────────
5154

@@ -54,8 +57,16 @@ op_read() {
5457
op item get "$OP_ITEM_NAME" --vault "$OP_VAULT" --field "$field" --reveal 2>/dev/null || true
5558
}
5659

57-
op_available() {
58-
command -v op >/dev/null 2>&1 && op whoami &>/dev/null
60+
op_signin() {
61+
if ! command -v op >/dev/null 2>&1; then
62+
return 1
63+
fi
64+
if op whoami &>/dev/null; then
65+
return 0
66+
fi
67+
echo "1Password CLI found but not signed in — signing in..."
68+
eval "$(op signin)" || return 1
69+
op whoami &>/dev/null
5970
}
6071

6172
keychain_read() {
@@ -82,14 +93,24 @@ prompt_secret() {
8293
printf '%s' "$value"
8394
}
8495

96+
ssm_put() {
97+
local name="$1" value="$2"
98+
aws ssm put-parameter \
99+
--region "$AWS_REGION" \
100+
--name "$name" \
101+
--value "$value" \
102+
--type SecureString \
103+
--overwrite
104+
}
105+
85106
# ── Resolve credentials ───────────────────────────────────────────────────────
86107

87108
USERNAME=""
88109
PASSWORD=""
89110
SOURCE=""
90111

91112
# 1. Try 1Password
92-
if op_available; then
113+
if op_signin; then
93114
echo "Reading from 1Password (\"$OP_ITEM_NAME\" in $OP_VAULT)..."
94115
USERNAME=$(op_read "username")
95116
PASSWORD=$(op_read "password")
@@ -99,8 +120,6 @@ if op_available; then
99120
else
100121
echo " Item not found or missing fields — falling back"
101122
fi
102-
else
103-
command -v op >/dev/null 2>&1 && echo "1Password CLI found but not signed in (run: op signin). Falling back..."
104123
fi
105124

106125
# 2. Try macOS Keychain
@@ -130,24 +149,18 @@ fi
130149

131150
[ -n "$SOURCE" ] || SOURCE="prompt"
132151

133-
# ── Vault login (skip if already authenticated) ───────────────────────────────
134-
135-
echo ""
136-
if vault token lookup &>/dev/null; then
137-
echo "Already authenticated to Vault ($VAULT_ADDR)"
138-
else
139-
echo "Authenticating to Vault ($VAULT_ADDR)..."
140-
ddtool auth login
141-
fi
142-
143-
# ── Write to Vault ────────────────────────────────────────────────────────────
152+
# ── Write to SSM ──────────────────────────────────────────────────────────────
144153

145154
echo ""
146155
if [ $DRY_RUN -eq 1 ]; then
147-
echo "[dry-run] would write: vault kv put $VAULT_PATH username=<...> password=<...>"
156+
echo "[dry-run] would write:"
157+
echo " ${SSM_PREFIX}.maven_central_username"
158+
echo " ${SSM_PREFIX}.maven_central_password"
148159
else
149-
vault kv put "$VAULT_PATH" username="$USERNAME" password="$PASSWORD"
150-
echo " ✓ $VAULT_PATH"
160+
ssm_put "${SSM_PREFIX}.maven_central_username" "$USERNAME"
161+
echo " ✓ ${SSM_PREFIX}.maven_central_username"
162+
ssm_put "${SSM_PREFIX}.maven_central_password" "$PASSWORD"
163+
echo " ✓ ${SSM_PREFIX}.maven_central_password"
151164
fi
152165

153166
# ── Offer to save to Keychain if values came from a prompt ───────────────────
@@ -163,4 +176,4 @@ if [ "$SOURCE" = "prompt" ] && [ $IS_MACOS -eq 1 ] && [ $DRY_RUN -eq 0 ]; then
163176
fi
164177

165178
echo ""
166-
echo "Done. GitLab CI reads from: $VAULT_PATH"
179+
echo "Done. GitLab CI reads from: ${SSM_PREFIX}.maven_central_{username,password}"

0 commit comments

Comments
 (0)