Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
e54995c
IONOS(ci): add concurrency group to cancel superseded runs
printminion-co May 12, 2026
e41cb5b
IONOS(ci): add prepare-matrix preflight summary for remote trigger
printminion-co May 12, 2026
595725a
IONOS(ci): add gh cache list visibility step to prepare-matrix
printminion-co May 12, 2026
1f1ad58
IONOS(ci): add secrets preflight and upload retry to artifactory upload
printminion-co May 12, 2026
fac0286
IONOS(ci): verify JFrog upload landed for each app build
printminion-co May 12, 2026
6bbebaa
IONOS(ci): add get-job-data composite action
printminion-co May 12, 2026
5119659
IONOS(ci): use JFrog props arrays and embed job.html_url
printminion-co May 12, 2026
d1c0780
IONOS(ci): bypass npm cache when force_rebuild is set
printminion-co May 12, 2026
7a4cacb
IONOS(ci): pin PHP version to 8.3 explicitly
printminion-co May 12, 2026
c44e224
IONOS(ci): add per-app build completion summary
printminion-co May 12, 2026
b3ee48b
IONOS(ci): validate appinfo/info.xml after app restore
printminion-co May 12, 2026
e36a8a4
IONOS(ci): detect-app-cache.sh — continue on missing submodule
printminion-co May 12, 2026
f6efcee
IONOS(ci): upload per-app build artifacts for debugging
printminion-co May 12, 2026
bd09855
IONOS(ci): rename trigger-remote-dev-worflow → trigger-remote-dev-wor…
printminion-co May 12, 2026
f739b4c
IONOS(ci): bump actions/checkout to v5.0.1
printminion-co May 13, 2026
a775cca
IONOS(ci): bump actions/setup-node to v6.4.0
printminion-co May 13, 2026
0a72a9f
IONOS(ci): bump actions/download-artifact to v5.0.0
printminion-co May 13, 2026
01e79eb
IONOS(ci): bump docker/login-action to v3.7.0
printminion-co May 13, 2026
03ee446
IONOS(ci): bump docker/metadata-action to v5.10.0
printminion-co May 13, 2026
4e58bb7
IONOS(ci): build rc/** and */dev/* branches on push
printminion-co May 12, 2026
9ca579f
IONOS(ci): route rc/* and */dev/* artifacts to nested JFrog paths
printminion-co May 12, 2026
fb0f7f9
IONOS(ci): trigger remote workflow for rc/* and */dev/* branches
printminion-co May 12, 2026
076a365
IONOS(ci): nest JFrog artifact path by NC_VERSION and short SHA
printminion-co May 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 93 additions & 0 deletions .github/actions/get-job-data/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
name: 'Get Job Data from GitHub Actions'
description: 'Fetches the GitHub Actions job data from the GitHub API'
inputs:
job-name:
description: 'The name of the job to find'
required: true
github-token:
description: 'GitHub token for API authentication'
required: true
repository:
description: 'Repository in owner/repo format'
required: true
run-id:
description: 'GitHub Actions run ID'
required: true
outputs:
job_html_url:
description: 'The HTML URL of the job'
value: ${{ steps.get_url.outputs.job_html_url }}
runs:
using: 'composite'
steps:
- name: Fetch job URL from GitHub API
id: get_url
shell: bash
run: |
# Fetch the numeric job ID from GitHub API
CURL_ERROR_FILE=$(mktemp)
NETRC_FILE=$(mktemp)

# Write GitHub API credentials to a temporary netrc file to avoid
# passing the token directly on the curl command line.
printf '%s\n' \
'machine api.github.com' \
' login x-access-token' \
" password ${{ inputs.github-token }}" \
> "$NETRC_FILE"
chmod 600 "$NETRC_FILE"

# Ensure temporary file cleanup on exit
cleanup() {
if [ -n "$CURL_ERROR_FILE" ] && [ -f "$CURL_ERROR_FILE" ]; then
rm -f "$CURL_ERROR_FILE"
fi
if [ -n "$NETRC_FILE" ] && [ -f "$NETRC_FILE" ]; then
rm -f "$NETRC_FILE"
fi
}
trap cleanup EXIT

API_RESPONSE=$(curl -sS -w "\n%{http_code}" \
--netrc-file "$NETRC_FILE" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/${{ inputs.repository }}/actions/runs/${{ inputs.run-id }}/jobs" 2>"$CURL_ERROR_FILE")

CURL_EXIT_CODE=$?
if [ $CURL_EXIT_CODE -ne 0 ]; then
echo "❌ ERROR: curl request to GitHub API failed with exit code $CURL_EXIT_CODE"
if [ -s "$CURL_ERROR_FILE" ]; then
echo "curl error output:"
cat "$CURL_ERROR_FILE"
fi
echo "job_html_url=" >> "$GITHUB_OUTPUT"
exit 0
fi

HTTP_CODE=$(echo "$API_RESPONSE" | tail -n1)
RESPONSE_BODY=$(echo "$API_RESPONSE" | sed '$d')

if [ "$HTTP_CODE" != "200" ]; then
echo "⚠️ WARNING: GitHub API request failed with $HTTP_CODE"
echo "job_html_url=" >> "$GITHUB_OUTPUT"
exit 0
fi

EXPECTED_JOB_NAME="${{ inputs.job-name }}"
JOB_URL=$(echo "$RESPONSE_BODY" | jq -r \
--arg job_name "$EXPECTED_JOB_NAME" \
'.jobs[] | select(.name == $job_name) | .html_url')

if [ -z "$JOB_URL" ] || [ "$JOB_URL" = "null" ]; then
echo "⚠️ WARNING: Failed to extract job URL from response for job name '$EXPECTED_JOB_NAME'."
echo "Possible causes:"
echo " - The job name does not match exactly (including spaces and case)."
echo " - The job has not started yet at the time this action ran."
echo " - The GitHub API response format was unexpected."
echo "Please verify that the job has started before this action runs and double-check the exact job name in the GitHub Actions UI."
echo "job_html_url=" >> "$GITHUB_OUTPUT"
exit 0
fi

echo "job_html_url=$JOB_URL" >> "$GITHUB_OUTPUT"
echo "Job URL: $JOB_URL"
26 changes: 20 additions & 6 deletions .github/scripts/detect-app-cache.sh
Original file line number Diff line number Diff line change
Expand Up @@ -141,15 +141,29 @@ while IFS= read -r app_json; do
if [ -d "$APP_PATH" ]; then
CURRENT_SHA=$(git -C "$APP_PATH" rev-parse HEAD 2>/dev/null || echo "")
else
echo "ERROR: $APP_NAME - directory not found at '$APP_PATH'. Submodule not initialised?"
echo "| $APP_NAME | N/A | N/A | ❌ Directory not found |" >> "$GITHUB_STEP_SUMMARY"
exit 1
echo "⊘ $APP_NAME - directory not found at '$APP_PATH' (submodule not initialised?), will build"
echo "| $APP_NAME | N/A | N/A | ⊘ Directory not found — will build |" >> "$GITHUB_STEP_SUMMARY"
UNKNOWN_SUFFIX="unknown"
APPS_TO_BUILD=$(echo "$APPS_TO_BUILD" | jq -c \
--arg app "$APP_NAME" --arg sha "$UNKNOWN_SUFFIX" \
--arg archive_name "${APP_NAME}-${UNKNOWN_SUFFIX}.tar.gz" \
--arg jfrog_path "${ARTIFACTORY_REPOSITORY_SNAPSHOT}/apps/${CACHE_VERSION}/${APP_NAME}/${APP_NAME}-${UNKNOWN_SUFFIX}.tar.gz" \
'. + [{name: $app, sha: $sha, archive_name: $archive_name, jfrog_path: $jfrog_path}]')
APPS_TO_BUILD_COUNT=$((APPS_TO_BUILD_COUNT + 1))
continue
fi

if [ -z "$CURRENT_SHA" ]; then
echo "ERROR: $APP_NAME - '$APP_PATH' exists but is not a git repo (cannot determine SHA)."
echo "| $APP_NAME | N/A | N/A | ❌ Not a git repo |" >> "$GITHUB_STEP_SUMMARY"
exit 1
echo "⊘ $APP_NAME - '$APP_PATH' exists but is not a git repo, will build"
echo "| $APP_NAME | N/A | N/A | ⊘ Not a git repo — will build |" >> "$GITHUB_STEP_SUMMARY"
UNKNOWN_SUFFIX="unknown"
APPS_TO_BUILD=$(echo "$APPS_TO_BUILD" | jq -c \
--arg app "$APP_NAME" --arg sha "$UNKNOWN_SUFFIX" \
--arg archive_name "${APP_NAME}-${UNKNOWN_SUFFIX}.tar.gz" \
--arg jfrog_path "${ARTIFACTORY_REPOSITORY_SNAPSHOT}/apps/${CACHE_VERSION}/${APP_NAME}/${APP_NAME}-${UNKNOWN_SUFFIX}.tar.gz" \
'. + [{name: $app, sha: $sha, archive_name: $archive_name, jfrog_path: $jfrog_path}]')
APPS_TO_BUILD_COUNT=$((APPS_TO_BUILD_COUNT + 1))
continue
fi

# Add SHA to the map for all apps (regardless of cache status)
Expand Down
Loading
Loading