| #!/usr/bin/env bash |
| # 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. |
| |
| # ============================================================================= |
| # Apache Hamilton Sub-Package Release Candidate Validation Script |
| # |
| # Validates sub-package release candidates by: |
| # 1. Downloading artifacts from Apache SVN |
| # 2. Verifying GPG signatures and SHA512 checksums |
| # 3. Checking Apache license headers with Apache RAT |
| # 4. Building from source tarballs |
| # 5. Running functional verification for each package |
| # |
| # Prerequisites: svn, gpg, java (for RAT), uv, curl, flit |
| # |
| # Usage: |
| # ./verification-sub-packages.sh <rc> |
| # ./verification-sub-packages.sh 0 # validate RC0 |
| # ============================================================================= |
| |
| set -euo pipefail |
| |
| RC="${1:-0}" |
| |
| SDK_VERSION="0.9.0" |
| UI_VERSION="0.0.18" |
| LSP_VERSION="0.2.0" |
| CONTRIB_VERSION="0.0.9" |
| |
| SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" |
| WORK_DIR="hamilton-subpkgs-rc${RC}-validation" |
| SVN_BASE="https://dist.apache.org/repos/dist/dev/incubator/hamilton" |
| |
| GREEN='\033[0;32m' |
| RED='\033[0;31m' |
| NC='\033[0m' |
| |
| section() { echo -e "\n${GREEN}==============================================================================${NC}"; echo -e " $1"; echo -e "${GREEN}==============================================================================${NC}\n"; } |
| |
| declare -A PKG_VERSIONS=( |
| ["sdk"]="$SDK_VERSION" |
| ["ui"]="$UI_VERSION" |
| ["lsp"]="$LSP_VERSION" |
| ["contrib"]="$CONTRIB_VERSION" |
| ) |
| |
| declare -A PKG_NAMES=( |
| ["sdk"]="apache-hamilton-sdk" |
| ["ui"]="apache-hamilton-ui" |
| ["lsp"]="apache-hamilton-lsp" |
| ["contrib"]="apache-hamilton-contrib" |
| ) |
| |
| # ============================================================================= |
| section "Step 1: Downloading Artifacts from SVN" |
| # ============================================================================= |
| |
| if [ -d "$WORK_DIR" ]; then |
| rm -rf "$WORK_DIR" |
| fi |
| mkdir -p "$WORK_DIR" |
| |
| for key in sdk ui lsp contrib; do |
| name="${PKG_NAMES[$key]}" |
| version="${PKG_VERSIONS[$key]}" |
| echo "Downloading ${name} ${version}-RC${RC}..." |
| svn export -q "${SVN_BASE}/${name}/${version}-RC${RC}/" "${WORK_DIR}/${key}/" |
| done |
| |
| # ============================================================================= |
| section "Step 2: Verifying GPG Signatures and SHA512 Checksums" |
| # ============================================================================= |
| |
| curl -sO https://downloads.apache.org/incubator/hamilton/KEYS |
| gpg --import KEYS 2>&1 | tail -1 |
| |
| for key in sdk ui lsp contrib; do |
| echo "" |
| echo "--- ${PKG_NAMES[$key]} ---" |
| for artifact in ${WORK_DIR}/${key}/*.tar.gz ${WORK_DIR}/${key}/*.whl; do |
| [ -f "$artifact" ] || continue |
| gpg --verify "${artifact}.asc" "$artifact" 2>&1 | grep -E "Good signature|BAD" |
| expected=$(cat "${artifact}.sha512") |
| actual=$(shasum -a 512 "$artifact" | awk '{print $1}') |
| if [ "$expected" = "$actual" ]; then |
| echo " ✓ SHA512 OK: $(basename "$artifact")" |
| else |
| echo " ✗ SHA512 MISMATCH: $(basename "$artifact")" |
| exit 1 |
| fi |
| done |
| done |
| |
| # ============================================================================= |
| section "Step 3: Checking License Headers (Apache RAT)" |
| # ============================================================================= |
| |
| if [ ! -f "apache-rat-0.15.jar" ]; then |
| curl -sO https://repo1.maven.org/maven2/org/apache/rat/apache-rat/0.15/apache-rat-0.15.jar |
| fi |
| |
| for key in sdk ui lsp contrib; do |
| src_tar=$(ls ${WORK_DIR}/${key}/*-src.tar.gz 2>/dev/null | head -1) |
| echo "--- ${PKG_NAMES[$key]} ---" |
| extract_dir="/tmp/rat-$$-${key}" |
| mkdir -p "$extract_dir" |
| tar xzf "$src_tar" -C "$extract_dir" |
| unknown=$(java -jar apache-rat-0.15.jar -d "$extract_dir" 2>&1 | grep -c "!?????" || true) |
| if [ "$unknown" -eq 0 ]; then |
| echo " ✓ All files have approved licenses" |
| else |
| echo " ✗ ${unknown} file(s) missing license headers" |
| java -jar apache-rat-0.15.jar -d "$extract_dir" 2>&1 | grep "!?????" |
| exit 1 |
| fi |
| rm -rf "$extract_dir" |
| done |
| |
| # ============================================================================= |
| section "Step 4: Building from Source" |
| # ============================================================================= |
| |
| for key in sdk ui lsp contrib; do |
| src_tar=$(ls ${WORK_DIR}/${key}/*-src.tar.gz 2>/dev/null | head -1) |
| echo "--- ${PKG_NAMES[$key]} ---" |
| extract_dir="/tmp/build-$$-${key}" |
| mkdir -p "$extract_dir" |
| tar xzf "$src_tar" -C "$extract_dir" |
| build_dir=$(ls -d ${extract_dir}/*/ | head -1) |
| if (cd "$build_dir" && flit build --no-use-vcs) 2>&1 | grep -q "Built wheel"; then |
| echo " ✓ Built from source" |
| else |
| echo " ✗ Build failed" |
| exit 1 |
| fi |
| rm -rf "$extract_dir" |
| done |
| |
| # ============================================================================= |
| section "Step 5: Functional Verification" |
| # ============================================================================= |
| |
| echo "Running individual package verification scripts..." |
| echo "" |
| |
| bash "${SCRIPT_DIR}/verify-sub-packages/verify_sdk.sh" "$SDK_VERSION" "${WORK_DIR}/sdk" |
| echo "" |
| bash "${SCRIPT_DIR}/verify-sub-packages/verify_ui.sh" "$UI_VERSION" "${WORK_DIR}/ui" |
| echo "" |
| bash "${SCRIPT_DIR}/verify-sub-packages/verify_lsp.sh" "$LSP_VERSION" "${WORK_DIR}/lsp" |
| echo "" |
| bash "${SCRIPT_DIR}/verify-sub-packages/verify_contrib.sh" "$CONTRIB_VERSION" "${WORK_DIR}/contrib" |
| |
| # ============================================================================= |
| section "All Checks Passed!" |
| # ============================================================================= |
| |
| echo -e "${GREEN}All sub-package RCs validated successfully.${NC}" |
| echo "" |
| echo "Packages verified:" |
| echo " apache-hamilton-sdk ${SDK_VERSION}-RC${RC}" |
| echo " apache-hamilton-ui ${UI_VERSION}-RC${RC}" |
| echo " apache-hamilton-lsp ${LSP_VERSION}-RC${RC}" |
| echo " apache-hamilton-contrib ${CONTRIB_VERSION}-RC${RC}" |