Skip to content

Refactored redirector script generation #88

Refactored redirector script generation

Refactored redirector script generation #88

name: "Update redirector yaml config"
# Trigger this workflow on a manual dispatch or a scheduled time
on:
push:
#schedule:
# - cron: '0 * * * *' # Run every hour
workflow_dispatch: # Manually triggered via GitHub Actions UI
env:
GEODB: "/scripts/redirect-config/GeoLite2-City.mmdb"
ASNDB: "/scripts/redirect-config/GeoLite2-ASN.mmdb"
DL_MAP: "/scripts/redirect-config/all-images.json"
SOURCE_OF_TRUTH: "[email protected]:/storage/www/"
concurrency:
group: redirector
cancel-in-progress: false
jobs:
Check:
name: "Check permissions"
runs-on: "ubuntu-24.04"
steps:
- name: "Check permissions"
uses: armbian/actions/team-check@main
with:
ORG_MEMBERS: ${{ secrets.ORG_MEMBERS }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TEAM: "Release manager"
- name: "Start log"
run: |
echo "# Test summary" >> $GITHUB_STEP_SUMMARY
build:
name: "Get source of truth"
runs-on: ubuntu-24.04
needs: Check
strategy:
fail-fast: true
matrix:
platform:
- beta
- apt
- dl
steps:
- name: "Install dependencies: lftp"
uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: lftp
version: 1.0
- name: "Download from ${{ env.SOURCE_OF_TRUTH }}${{ matrix.platform }}"
run: |
mkdir -p source destination
if [[ "${{ matrix.platform }}" == "dl" ]]; then
cd source ; lftp -e "mirror --include-glob=*/archive/*.torrent --parallel=64; exit" https://rsync.armbian.com/${{ matrix.platform }}
cd ..; find source/. -mindepth 3 -exec mv -i -- {} destination/ \;
else
cd destination; lftp -e "mirror --parallel=64; exit" https://rsync.armbian.com/${{ matrix.platform }}/dists
fi
- name: "Upload ${{ matrix.platform }} index"
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.platform }}
path: destination
compression-level: 0
retention-days: 2
Debs-beta-index:
name: "Compare beta deb mirrors"
needs: build
outputs:
matrix: ${{steps.json.outputs.JSON_CONTENT}}
runs-on: ubuntu-24.04
steps:
- name: "Get beta packages mirrors from database"
id: json
run: |
echo 'JSON_CONTENT<<EOF' >> $GITHUB_OUTPUT
curl -H "Authorization: Token ${{ secrets.NETBOX_TOKEN }}" -H "Accept: application/json; indent=4" \
"${{ secrets.NETBOX_API }}/virtualization/virtual-machines/?limit=500&name__empty=false&tag=debs-beta&status=active" \
| jq '.results[] | .name,.custom_fields["download_path_debs"],.id' | sed "s|null|beta|" | sed "s/\"//g" \
| xargs -n3 -d'\n' | sed -e 's/\s\+/\//' | sed "s/ /,/" | jq -cnR '[inputs | select(length>0)]' | jq >> $GITHUB_OUTPUT
echo 'EOF' >> $GITHUB_OUTPUT
Debs-stable-index:
name: "Compare stable deb mirrors"
needs: build
outputs:
matrix: ${{steps.json.outputs.JSON_CONTENT}}
runs-on: ubuntu-24.04
steps:
- name: "Get beta packages mirrors from database"
id: json
run: |
echo 'JSON_CONTENT<<EOF' >> $GITHUB_OUTPUT
curl -H "Authorization: Token ${{ secrets.NETBOX_TOKEN }}" -H "Accept: application/json; indent=4" \
"${{ secrets.NETBOX_API }}/virtualization/virtual-machines/?limit=500&name__empty=false&tag=debs&status=active" \
| jq '.results[] | .name,.custom_fields["download_path_debs"],.id' | sed "s|null|apt|" | sed "s/\"//g" \
| xargs -n3 -d'\n' | sed -e 's/\s\+/\//' | sed "s/ /,/" | jq -cnR '[inputs | select(length>0)]' | jq >> $GITHUB_OUTPUT
echo 'EOF' >> $GITHUB_OUTPUT
Images-index:
name: "Compare stable images mirrors"
needs: build
outputs:
matrix: ${{steps.json.outputs.JSON_CONTENT}}
runs-on: ubuntu-24.04
steps:
- name: "Get stable images mirrors from database"
id: json
run: |
echo 'JSON_CONTENT<<EOF' >> $GITHUB_OUTPUT
curl -H "Authorization: Token ${{ secrets.NETBOX_TOKEN }}" -H "Accept: application/json; indent=4" \
"${{ secrets.NETBOX_API }}/virtualization/virtual-machines/?limit=500&name__empty=false&tag=images&status=active" \
| jq '.results[] | .name,.custom_fields["download_path_debs"],.id' | sed "s|null|apt|" | sed "s/\"//g" \
| xargs -n3 -d'\n' | sed -e 's/\s\+/\//' | sed "s/ /,/" | jq -cnR '[inputs | select(length>0)]' | jq >> $GITHUB_OUTPUT
echo 'EOF' >> $GITHUB_OUTPUT
Debs-beta:
name: "B"
runs-on: ubuntu-24.04
needs: [ Debs-beta-index ]
outputs:
matrix: ${{needs.Debs-beta-index.outputs.matrix}}
if: ${{ needs.Debs-beta-index.outputs.matrix != '[]' && needs.Debs-beta-index.outputs.matrix != '' }}
timeout-minutes: 6
strategy:
fail-fast: false
matrix:
node: ${{fromJson(needs.Debs-beta-index.outputs.matrix)}}
steps:
- uses: actions/download-artifact@v4
with:
name: beta
path: debs-beta
- name: "Install dependencies"
uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: lftp
version: 1.0
- name: "Check ${{ matrix.node }} "
run: |
SERVER_URL=$(echo "${{ matrix.node }}" | cut -d"," -f1)
SERVER_ID=$(echo "${{ matrix.node }}" | cut -d"," -f2)
echo "SERVER_ID=${SERVER_ID}" >> $GITHUB_ENV
mkdir -p compare; cd compare
if curl --output /dev/null --silent --head --fail "https://${SERVER_URL}/dists/"; then
timeout 5m lftp -e "mirror --parallel=16; exit" https://${SERVER_URL}/dists/ || true
fi
cd ..
OUT=$(diff -rq compare debs || true)
mkdir -p status
if [[ -z "${OUT}" ]]; then
echo "true" >> status/${SERVER_ID}
echo "STATUS=true" >> $GITHUB_ENV
elif [[ "${exit_status}" -eq 0 ]]; then
echo "not_in_sync" >> status/${SERVER_ID}
echo "STATUS=not_in_sync" >> $GITHUB_ENV
elif [[ "${exit_status}" -eq 124 ]]; then
echo "timeout" >> status/${SERVER_ID}
echo "STATUS=not_in_sync" >> $GITHUB_ENV
fi
- name: Upload ${{ env.STATUS }} for ${{ matrix.node }}
uses: actions/upload-artifact@v4
with:
name: debs-beta-${{ env.SERVER_ID }}
path: status
if-no-files-found: ignore
Debs-stable:
name: "S"
runs-on: ubuntu-24.04
needs: [ Debs-stable-index ]
outputs:
matrix: ${{needs.Debs-stable-index.outputs.matrix}}
if: ${{ needs.Debs-stable-index.outputs.matrix != '[]' && needs.Debs-stable-index.outputs.matrix != '' }}
timeout-minutes: 12
strategy:
fail-fast: false
matrix:
node: ${{fromJson(needs.Debs-stable-index.outputs.matrix)}}
steps:
- uses: actions/download-artifact@v4
with:
name: apt
path: debs
- name: "Install dependencies"
uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: lftp
version: 1.0
- name: "Check ${{ matrix.node }} "
run: |
SERVER_URL=$(echo "${{ matrix.node }}" | cut -d"," -f1)
SERVER_ID=$(echo "${{ matrix.node }}" | cut -d"," -f2)
echo "SERVER_ID=${SERVER_ID}" >> $GITHUB_ENV
mkdir -p compare; cd compare
if curl --output /dev/null --silent --head --fail "https://${SERVER_URL}/dists/"; then
timeout 11m lftp -e "mirror --parallel=16; exit" https://${SERVER_URL}/dists/ || exit_status=$?
fi
cd ..
OUT=$(diff -rq compare debs || true)
mkdir -p status
if [[ -z "${OUT}" ]]; then
echo "true" >> status/${SERVER_ID}
echo "STATUS=true" >> $GITHUB_ENV
elif [[ "${exit_status}" -eq 0 ]]; then
echo "not_in_sync" >> status/${SERVER_ID}
echo "STATUS=not_in_sync" >> $GITHUB_ENV
elif [[ "${exit_status}" -eq 124 ]]; then
echo "timeout" >> status/${SERVER_ID}
echo "STATUS=not_in_sync" >> $GITHUB_ENV
fi
- name: Upload ${{ env.STATUS }} for ${{ matrix.node }}
uses: actions/upload-artifact@v4
with:
name: debs-${{ env.SERVER_ID }}
path: status
if-no-files-found: ignore
Images-stable:
name: "I"
runs-on: ubuntu-24.04
needs: [ Images-stable-index ]

Check failure on line 251 in .github/workflows/generate-redirector-config.yml

View workflow run for this annotation

GitHub Actions / Update redirector yaml config

Invalid workflow file

The workflow is not valid. .github/workflows/generate-redirector-config.yml (Line: 251, Col: 14): Job 'Images-stable' depends on unknown job 'Images-stable-index'. .github/workflows/generate-redirector-config.yml (Line: 309, Col: 36): Job 'download' depends on job 'Images-stable' which creates a cycle in the dependency graph.
outputs:
matrix: ${{needs.Images-stable-index.outputs.matrix}}
if: ${{ needs.Images-stable-index.outputs.matrix != '[]' && needs.Images-stable-index.outputs.matrix != '' }}
timeout-minutes: 12
strategy:
fail-fast: false
matrix:
node: ${{fromJson(needs.Images-stable-index.outputs.matrix)}}
steps:
- uses: actions/download-artifact@v4
with:
name: dl
path: dl
- name: "Install dependencies"
uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: lftp
version: 1.0
- name: "Check ${{ matrix.node }} "
run: |
SERVER_URL=$(echo "${{ matrix.node }}" | cut -d"," -f1)
SERVER_ID=$(echo "${{ matrix.node }}" | cut -d"," -f2)
echo "SERVER_ID=${SERVER_ID}" >> $GITHUB_ENV
mkdir -p compare source; cd compare
if curl --output /dev/null --silent --head --fail "https://${SERVER_URL}"; then
cd source
timeout 11m lftp -e "mirror --include-glob=*/archive/*.torrent --parallel=64; exit" https://${SERVER_URL} || exit_status=$?
cd ..
find source/. -mindepth 3 -exec mv -i -- {} compare/ \;
fi
cd ..
OUT=$(diff -rq compare dl || true)
mkdir -p status
if [[ -z "${OUT}" ]]; then
echo "true" >> status/${SERVER_ID}
echo "STATUS=true" >> $GITHUB_ENV
elif [[ "${exit_status}" -eq 0 ]]; then
echo "not_in_sync" >> status/${SERVER_ID}
echo "STATUS=not_in_sync" >> $GITHUB_ENV
elif [[ "${exit_status}" -eq 124 ]]; then
echo "timeout" >> status/${SERVER_ID}
echo "STATUS=not_in_sync" >> $GITHUB_ENV
fi
- name: Upload ${{ env.STATUS }} for ${{ matrix.node }}
uses: actions/upload-artifact@v4
with:
name: debs-${{ env.SERVER_ID }}
path: status
if-no-files-found: ignore
download:
needs: [ Debs-beta,Debs-stable,Images-stable ]
runs-on: ubuntu-24.04
steps:
- name: Download All Artifacts
uses: actions/download-artifact@v4
with:
path: status
pattern: debs-beta-*
merge-multiple: true
- name: "Grep only those that are in sync"
run: |
echo "# Not in sync" >> $GITHUB_STEP_SUMMARY
echo "$(grep not_in_sync status/* | cut -d":" -f1 | cut -d"/" -f2 | sed ':a; N; s/\n/ /; ta') " >> $GITHUB_STEP_SUMMARY
echo "# Timeouts" >> $GITHUB_STEP_SUMMARY
echo "$(grep timeout status/* | cut -d":" -f1 | cut -d"/" -f2 | sed ':a; N; s/\n/ /; ta') " >> $GITHUB_STEP_SUMMARY
echo "failoverserver=$(grep true status/* | cut -d":" -f1 | cut -d"/" -f2 | sed ':a; N; s/\n/ /; ta') " >> $GITHUB_ENV
echo "reloadKey=$(openssl rand -hex 16)" >> $GITHUB_ENV
- name: Test debs
uses: armbian/actions/make-yaml-redirector@redirector
with:
variant: debs-beta
failoverserver: "${{ env.failoverserver }}"
port: 8083
geodb: "${{ env.GEODB }}"
asndb: "${{ env.ASNDB }}"
dl_map: "${{ env.DL_MAP }}"
reloadKey: ${{ env.reloadKey }}
netbox: ${{ secrets.NETBOX_TOKEN }}
- name: Download All Artifacts
uses: actions/download-artifact@v4
with:
path: status
pattern: debs*
merge-multiple: true
- name: "Grep only those that are in sync"
run: |
echo "# Not in sync" >> $GITHUB_STEP_SUMMARY
echo "$(grep not_in_sync status/* | cut -d":" -f1 | cut -d"/" -f2 | sed ':a; N; s/\n/ /; ta') " >> $GITHUB_STEP_SUMMARY
echo "# Timeouts" >> $GITHUB_STEP_SUMMARY
echo "$(grep timeout status/* | cut -d":" -f1 | cut -d"/" -f2 | sed ':a; N; s/\n/ /; ta') " >> $GITHUB_STEP_SUMMARY
echo "failoverserver=$(grep true status/* | cut -d":" -f1 | cut -d"/" -f2 | sed ':a; N; s/\n/ /; ta') " >> $GITHUB_ENV
echo "reloadKey=$(openssl rand -hex 16)" >> $GITHUB_ENV
- name: Test debs
uses: armbian/actions/make-yaml-redirector@redirector
with:
variant: debs
failoverserver: "${{ env.failoverserver }}"
port: 8083
geodb: "${{ env.GEODB }}"
asndb: "${{ env.ASNDB }}"
dl_map: "${{ env.DL_MAP }}"
reloadKey: ${{ env.reloadKey }}
netbox: ${{ secrets.NETBOX_TOKEN }}
Close:
needs: [ download ]
runs-on: ubuntu-24.04
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
path: armbian.github.io
- uses: robinraju/[email protected]
with:
repository: "P3TERX/GeoLite.mmdb"
tag: '2024.12.10'
fileName: "*.mmdb"
- name: Download All Artifacts
uses: actions/download-artifact@v4
with:
path: status
pattern: config-*
merge-multiple: true
- name: "Check"
run: |
ls -l status
echo "-"
ls -l ${{ github.workspace }}/
- name: Commit changes if any
run: |
cd armbian.github.io
git checkout data
mkdir -p data/
cp ${{ github.workspace }}/status/*.yaml data/
cp ${{ github.workspace }}/*.mmdb data/
git config --global user.name "github-actions"
git config --global user.email "[email protected]"
git add data/.
git diff --cached --quiet || git commit -m "Update Redirector YAML configuration"
git push
- uses: geekyeggo/delete-artifact@v5
with:
name: |
debs-*
apt
beta
dl