AeThex-OS/script/gitlab-download-artifacts.sh
MrPiglr cee14d232e new file: README.txt
new file:   aethex-desktop.service
2025-12-28 02:53:08 +00:00

90 lines
2.6 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
GITLAB_HOST="${GITLAB_HOST:-https://gitlab.com}"
API_BASE="$GITLAB_HOST/api/v4"
PROJECT_PATH="${PROJECT_PATH:-}"
REF="${REF:-main}"
JOB_NAME="${JOB_NAME:-build_iso}"
PIPELINE_ID="${PIPELINE_ID:-}"
OUT_DIR="${OUT_DIR:-artifacts}"
if [[ -z "${GITLAB_TOKEN:-}" ]]; then
if [[ -n "${GITLAB_TOKEN_FILE:-}" && -r "$GITLAB_TOKEN_FILE" ]]; then
GITLAB_TOKEN=$(cat "$GITLAB_TOKEN_FILE")
else
echo "GITLAB_TOKEN is required. Set GITLAB_TOKEN or GITLAB_TOKEN_FILE." >&2
echo "Example: export GITLAB_TOKEN=... or export GITLAB_TOKEN_FILE=~/gitlab.token" >&2
exit 1
fi
fi
if [[ -z "$PROJECT_PATH" ]]; then
echo "PROJECT_PATH is required (e.g., AeThex-Corporation/AeThex-OS)" >&2
exit 1
fi
mkdir -p "$OUT_DIR"
urlencode_project() {
echo -n "$PROJECT_PATH" | sed -e 's/\//%2F/g'
}
PROJECT_ENC="$(urlencode_project)"
auth() {
echo "PRIVATE-TOKEN: $GITLAB_TOKEN"
}
get_json() {
local url="$1"
curl -sS -H "$(auth)" "$url"
}
require_jq() {
if ! command -v jq >/dev/null 2>&1; then
echo "jq is required. Install with: sudo apt-get update && sudo apt-get install -y jq" >&2
exit 1
fi
}
require_jq
if [[ -z "$PIPELINE_ID" ]]; then
PIPELINE_ID=$(get_json "$API_BASE/projects/$PROJECT_ENC/pipelines?ref=$REF&status=success&order_by=updated_at&sort=desc&per_page=1" | jq -r '.[0].id')
if [[ -z "$PIPELINE_ID" || "$PIPELINE_ID" == "null" ]]; then
echo "No successful pipeline found for ref=$REF" >&2
exit 1
fi
fi
JOBS_JSON=$(get_json "$API_BASE/projects/$PROJECT_ENC/pipelines/$PIPELINE_ID/jobs?scope=success")
JOB_ID=$(echo "$JOBS_JSON" | jq -r --arg name "$JOB_NAME" '[.[] | select(.name == $name and .artifacts_file and (.artifacts_file.filename != null))][0].id')
if [[ -z "$JOB_ID" || "$JOB_ID" == "null" ]]; then
echo "No job with artifacts found matching name=$JOB_NAME in pipeline=$PIPELINE_ID" >&2
echo "Available job names:" >&2
echo "$JOBS_JSON" | jq -r '.[].name' >&2
exit 1
fi
ART_ZIP="$OUT_DIR/${PIPELINE_ID}-${JOB_NAME}.zip"
echo "Downloading artifacts from job $JOB_ID to $ART_ZIP"
curl -fSL -H "$(auth)" "$API_BASE/projects/$PROJECT_ENC/jobs/$JOB_ID/artifacts" -o "$ART_ZIP"
echo "Extracting $ART_ZIP"
unzip -o "$ART_ZIP" -d "$OUT_DIR" >/dev/null
ISO_PATH=$(find "$OUT_DIR" -type f -name '*.iso' | head -n 1 || true)
if [[ -n "$ISO_PATH" ]]; then
echo "Found ISO: $ISO_PATH"
if command -v sha256sum >/dev/null 2>&1; then
sha256sum "$ISO_PATH" | tee "$ISO_PATH.sha256.txt"
fi
else
echo "No ISO file found in artifacts. Contents:" >&2
find "$OUT_DIR" -maxdepth 2 -type f -printf '%p\n' >&2
fi
echo "Done. Artifacts in $OUT_DIR"