Skip to content

atr-dist-tooling-ntb-test-268063b8-3c4c-4f00-a3ca-1cf2a318db14 #55

atr-dist-tooling-ntb-test-268063b8-3c4c-4f00-a3ca-1cf2a318db14

atr-dist-tooling-ntb-test-268063b8-3c4c-4f00-a3ca-1cf2a318db14 #55

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
name: Distribute from ATR to RAO Maven Staging
run-name: "${{ inputs.atr-id }}"
on:
workflow_dispatch:
inputs:
atr-id:
description: 'Run ID (from ATR)'
required: true
asf-uid:
description: 'Originating user ID'
required: true
project:
description: 'Project in ATR to pull files from'
required: true
version:
description: 'Version in ATR to pull files from'
required: true
phase:
description: 'Expected release phase in ATR'
required: true
distribution-owner-namespace:
description: "Owner namespace"
required: true
distribution-package:
description: 'Package/project name in ATR'
required: true
distribution-version:
description: 'Distribution version'
required: true
atr-host:
description: 'ATR host (for testing purposes)'
required: false
default: 'release-test.apache.org'
ssh-port:
description: 'SSH port for ATR (for testing purposes)'
required: false
default: '2222'
jobs:
distribute:
permissions:
id-token: write
contents: read
runs-on: ubuntu-latest
env:
ATR_HOST: ${{ inputs.atr-host }}
SSH_PORT: ${{ inputs.ssh-port }}
WORKFLOW: distribute-maven-stg.yml
NJORD_STORE: atr-deployment-${{ inputs.distribution-package }}-${{ inputs.distribution-version }}
RAO_USERNAME: ${{ secrets.RAO_USERNAME }}
RAO_PASSWORD: ${{ secrets.RAO_PASSWORD }}
TAG_NAME: "${{ inputs.distribution-owner-namespace }}-${{ inputs.distribution-package }}-${{ inputs.distribution-version }}"
steps:
- name: Sleep for 5 seconds
run: sleep 5s
shell: bash
- name: Create settings.xml
run: |
mkdir -p ~/.m2
cat > ~/.m2/settings.xml << EOF
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<pluginGroups>
<pluginGroup>eu.maveniverse.maven.plugins</pluginGroup>
</pluginGroups>
<servers>
<server>
<id>rao3</id>
<username>${RAO_USERNAME}</username>
<password>${RAO_PASSWORD}</password>
<configuration>
<njord.publisher>sonatype-nx3</njord.publisher>
<njord.publisher.sonatype-nx3.baseUrl>https://repository.apache.org:4443/</njord.publisher.sonatype-nx3.baseUrl>
</configuration>
</server>
</servers>
</settings>
EOF
- name: Set up JDK 17
uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e
with:
java-version: '17'
distribution: 'temurin'
overwrite-settings: false
- name: Set up Maven 3.9+
uses: stCarolas/setup-maven@d6af6abeda15e98926a57b5aa970a96bb37f97d1
with:
maven-version: 3.9.12
- name: Create a GitHub OIDC JWT
id: create-github-jwt
shell: bash
run: |
set -euo pipefail
url="${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=atr-test-v1"
jwt="$(curl -sS --fail-with-body -H "Authorization: bearer ${ACTIONS_ID_TOKEN_REQUEST_TOKEN}" "$url" | jq -r .value)"
echo "::add-mask::$jwt"
echo "jwt=$jwt" >> "$GITHUB_OUTPUT"
- name: Generate an ephemeral SSH key
id: generate-ssh-key
shell: bash
run: |
set -euxo pipefail
ssh-keygen -t ed25519 -N "" -f "$RUNNER_TEMP/ssh_key"
echo "ssh_private_key_path=$RUNNER_TEMP/ssh_key" >> "$GITHUB_OUTPUT"
echo "ssh_public_key=$(cat "$RUNNER_TEMP/ssh_key.pub")" >> "$GITHUB_OUTPUT"
- name: Register the ephemeral SSH key with ATR
shell: bash
run: |
set -euxo pipefail
case "${ATR_HOST}" in
*.apache.org) ;;
*) echo "atr-host must match *.apache.org"; exit 1;;
esac
jq -n --arg publisher github \
--arg jwt "$JWT" \
--arg key "$SSH_PUBLIC_KEY" \
--arg uid "$INPUTS_ASF_UID" \
--arg phase "$INPUTS_PHASE" \
--arg project_name "$INPUTS_PROJECT" \
--arg version "$INPUTS_VERSION" \
'{publisher:$publisher, jwt:$jwt, ssh_key:$key, asf_uid:$uid, project_name:$project_name, phase:$phase, version:$version}' |
curl -sS --fail-with-body -X POST -H 'Content-Type: application/json' -d @- \
"https://${ATR_HOST}/api/distribute/ssh/register"
env:
JWT: ${{ steps.create-github-jwt.outputs.jwt }}
SSH_PUBLIC_KEY: ${{ steps.generate-ssh-key.outputs.ssh_public_key }}
INPUTS_PROJECT: ${{ inputs.project }}
INPUTS_VERSION: ${{ inputs.version }}
INPUTS_PHASE: ${{ inputs.phase }}
INPUTS_ASF_UID: ${{ inputs.asf-uid }}
- name: Report status back to ATR
shell: bash
run: |
set -euxo pipefail
jq -n --arg publisher github \
--arg jwt "$JWT" \
--arg workflow "$WORKFLOW" \
--arg run_id $RUN_ID \
--arg project_name "$INPUTS_PROJECT" \
'{publisher:$publisher, jwt:$jwt, workflow:$workflow, run_id:$run_id, project_name:$project_name, status:"in_progress", message:"Compiling distribution"}' |
curl -sS --fail-with-body -X POST -H 'Content-Type: application/json' -d @- \
"https://${ATR_HOST}/api/distribute/task/status"
env:
JWT: ${{ steps.create-github-jwt.outputs.jwt }}
RUN_ID: ${{ github.run_id }}
INPUTS_PROJECT: ${{ inputs.project }}
- name: Download from ATR using rsync
shell: bash
run: |
set -euxo pipefail
if ! [[ "${SSH_PORT}" =~ ^[0-9]+$ ]]
then
echo "::error::ssh-port must be an integer"
exit 1
fi
: "${INPUTS_DISTRIBUTION_PACKAGE:?package is required}"
: "${INPUTS_VERSION:?version is required}"
command -v rsync > /dev/null || { sudo apt-get update -y && sudo apt-get install -y rsync; }
mkdir stg
rsync -av \
-e "ssh -p 2222 -i $SSH_PRIVATE_KEY_PATH -o StrictHostKeyChecking=accept-new" \
-- \
"github@${ATR_HOST}:/${INPUTS_PROJECT}/${INPUTS_VERSION}/maven/" ./stg/
env:
INPUTS_PROJECT: ${{ inputs.project }}
INPUTS_VERSION: ${{ inputs.version }}
INPUTS_DISTRIBUTION_OWNER_NAMESPACE: ${{ inputs.distribution-owner-namespace }}
INPUTS_DISTRIBUTION_PACKAGE: ${{ inputs.distribution-package }}
# INPUTS_DETAILS: ${{ inputs.details }}
SSH_PRIVATE_KEY_PATH: ${{ steps.generate-ssh-key.outputs.ssh_private_key_path }}
- name: Create staging tag
run: |
curl -X POST -u "$RAO_USERNAME:$RAO_PASSWORD" \
"https://repository.apache.org:4443/service/rest/v1/tags" \
-H "Content-Type: application/json" \
-d "{\"name\": \"$TAG_NAME\"}"
- name: Get store ID and publish
shell: bash
run: |
set -euxo pipefail
echo "Importing Njord bundle"
mvn njord:import-all -Dnjord.dir=./stg
echo "Validating store: $INPUTS_DISTRIBUTION_PACKAGE-00001"
mvn njord:validate -Dnjord.store=$INPUTS_DISTRIBUTION_PACKAGE-00001 -Dnjord.publisher=sonatype-cp -Dnjord.details=true -q | sed -n '/Central Requirements/,/ArtifactStore.*failed validation/{/ArtifactStore.*failed validation/!s/^\[ERROR\] *//p}' | tee .err
echo "Publishing store: $INPUTS_DISTRIBUTION_PACKAGE-00001"
mvn njord:publish -Dnjord.store=$INPUTS_DISTRIBUTION_PACKAGE-00001
mvn njord:drop -Dnjord.store=$INPUTS_DISTRIBUTION_PACKAGE-00001
env:
INPUTS_DISTRIBUTION_OWNER_NAMESPACE: ${{ inputs.distribution-owner-namespace }}
INPUTS_DISTRIBUTION_PACKAGE: ${{ inputs.distribution-package }}
INPUTS_DISTRIBUTION_VERSION: ${{ inputs.distribution-version }}
- name: Report status back to ATR
shell: bash
run: |
set -euxo pipefail
jq -n --arg publisher github \
--arg jwt "$JWT" \
--arg workflow "$WORKFLOW" \
--arg run_id $RUN_ID \
--arg project_name "$INPUTS_PROJECT" \
'{publisher:$publisher, jwt:$jwt, workflow:$workflow, run_id:$run_id, project_name:$project_name, status:"in_progress", message:"Recording distribution"}' |
curl -sS --fail-with-body -X POST -H 'Content-Type: application/json' -d @- \
"https://${ATR_HOST}/api/distribute/task/status"
env:
JWT: ${{ steps.create-github-jwt.outputs.jwt }}
RUN_ID: ${{ github.run_id }}
INPUTS_PROJECT: ${{ inputs.project }}
- name: Record distribution on ATR
shell: bash
run: |
set -euxo pipefail
DETAILS_JSON=false
[ "${INPUTS_DETAILS}" = "true" ] && DETAILS_JSON=true
jq -n --arg publisher github \
--arg jwt "$JWT" \
--arg uid "$INPUTS_ASF_UID" \
--arg project "$INPUTS_PROJECT" \
--arg version "$INPUTS_VERSION" \
--arg phase "$INPUTS_PHASE" \
--arg platform "MAVEN" \
--arg distribution_owner_namespace "$INPUTS_DISTRIBUTION_OWNER_NAMESPACE" \
--arg distribution_package "$INPUTS_DISTRIBUTION_PACKAGE" \
--arg distribution_version "$INPUTS_DISTRIBUTION_VERSION" \
--argjson details "$DETAILS_JSON" \
'{publisher:$publisher, jwt:$jwt, asf_uid:$uid, project:$project, version:$version, phase:$phase, platform:$platform, distribution_owner_namespace:$distribution_owner_namespace, distribution_package:$distribution_package, distribution_version:$distribution_version, staging:true, details:$details}' |
curl -sS --fail-with-body -X POST -H 'Content-Type: application/json' -d @- \
"https://${ATR_HOST}/api/distribute/record_from_workflow"
env:
INPUTS_PROJECT: ${{ inputs.project }}
INPUTS_VERSION: ${{ inputs.version }}
INPUTS_PHASE: ${{ inputs.phase }}
INPUTS_ASF_UID: ${{ inputs.asf-uid }}
INPUTS_DISTRIBUTION_OWNER_NAMESPACE: ${{ inputs.distribution-owner-namespace }}
INPUTS_DISTRIBUTION_PACKAGE: ${{ inputs.distribution-package }}
INPUTS_DISTRIBUTION_VERSION: ${{ inputs.distribution-version }}
INPUTS_DETAILS: "false"
JWT: ${{ steps.create-github-jwt.outputs.jwt }}
- name: Report status back to ATR
shell: bash
if: failure()
run: |
set -euxo pipefail
jq -n --arg publisher github \
--arg jwt "$JWT" \
--arg workflow "$WORKFLOW" \
--arg run_id $RUN_ID \
--arg project_name "$INPUTS_PROJECT" \
--arg err "$([ -f .err ] && [ -s .err ] && echo "Build failed: $(cat .err)" || echo "Github workflow failed")" \
--arg status "failed" \
'{publisher:$publisher, jwt:$jwt, workflow:$workflow, run_id:$run_id, project_name:$project_name, status:$status, message:$err}' |
curl -sS --fail-with-body -X POST -H 'Content-Type: application/json' -d @- \
"https://${ATR_HOST}/api/distribute/task/status"
env:
JWT: ${{ steps.create-github-jwt.outputs.jwt }}
RUN_ID: ${{ github.run_id }}
STATUS: ${{ job.status }}
INPUTS_PROJECT: ${{ inputs.project }}
- name: Report status back to ATR
shell: bash
if: success()
run: |
set -euxo pipefail
jq -n --arg publisher github \
--arg jwt "$JWT" \
--arg workflow "$WORKFLOW" \
--arg run_id $RUN_ID \
--arg project_name "$INPUTS_PROJECT" \
--arg status "success" \
'{publisher:$publisher, jwt:$jwt, workflow:$workflow, run_id:$run_id, project_name:$project_name, status:$status, message:"GitHub workflow succeeded"}' |
curl -sS --fail-with-body -X POST -H 'Content-Type: application/json' -d @- \
"https://${ATR_HOST}/api/distribute/task/status"
env:
JWT: ${{ steps.create-github-jwt.outputs.jwt }}
RUN_ID: ${{ github.run_id }}
STATUS: ${{ job.status }}
INPUTS_PROJECT: ${{ inputs.project }}