name: Sync CI from skins-template to Every User Repository on: workflow_dispatch: env: TEMPLATE_REPO_URL: https://${{ secrets.TOKEN }}@${{ vars.CONTAINER_REGISTRY }}/osc/skins-template.git TEMPLATE_REL_PATH: .gitea/workflows/ci.yml GITEA_API: https://${{ vars.CONTAINER_REGISTRY }}/api/v1 jobs: sync-all: runs-on: ubuntu-latest container: image: ${{ vars.CONTAINER_REGISTRY }}/arlind/skins:latest steps: - name: Clone skins-template run: | echo "[Sync CI Started]" git clone --quiet "${{ env.TEMPLATE_REPO_URL }}" --depth 1 template-repo cd template-repo git checkout --quiet HEAD -- "${{ env.TEMPLATE_REL_PATH }}" - name: Fetch and update every user repository run: | page=1 per_page=50 while :; do users_json=$( curl -sSL -H "Authorization: token ${{ secrets.TOKEN }}" \ "${{ env.GITEA_API }}/admin/users?limit=$per_page&page=$page" ) users_count=$(echo "$users_json" | jq 'length') if [ "$users_count" -eq 0 ]; then break fi for i in $(seq 0 $((users_count - 1))); do user_login=$(echo "$users_json" | jq -r ".[$i].login") repos_json=$( curl -sSL -H "Authorization: token ${{ secrets.TOKEN }}" \ "${{ env.GITEA_API }}/users/${user_login}/repos" ) repo_count=$(echo "$repos_json" | jq 'length') for j in $(seq 0 $((repo_count - 1))); do owner=$(echo "$repos_json" | jq -r ".[$j].owner.login") repo=$(echo "$repos_json" | jq -r ".[$j].name") ( set -e echo "" echo "[Processing repository: ${owner}/${repo}]" echo " Checking README.md content" readme_json=$(curl -sSL -H "Authorization: token ${{ secrets.TOKEN }}" \ "${{ env.GITEA_API }}/repos/${owner}/${repo}/contents/README.md" || echo "{}") if ! echo "$readme_json" | jq -e '.content' >/dev/null 2>&1; then echo " → No README.md found or inaccessible, skipping ${owner}/${repo}" exit 0 fi content=$(echo "$readme_json" | jq -r .content | base64 -d 2>/dev/null || echo "") if ! echo "$content" | head -n 20 | grep -q "^---$"; then echo " → Missing YAML front matter (---), skipping ${owner}/${repo}" exit 0 fi if ! ( echo "$content" | grep -q "^gitea: none" \ && echo "$content" | grep -q "^include_toc: true" \ && echo "$content" | grep -q "^# Skins" ); then echo " → README.md does not match required headers, skipping ${owner}/${repo}" exit 0 fi echo " ✓ README.md matches expected format; proceeding" echo " Cloning ${owner}/${repo}..." tmpdir=$(mktemp -d) git clone --quiet "https://${{ secrets.TOKEN }}@${{ vars.CONTAINER_REGISTRY }}/${owner}/${repo}.git" \ --depth 1 "$tmpdir" cd "$tmpdir" echo " Configuring commit identity" git config user.email "arlind@sulej.ch" git config user.name "ci-bot" echo " Copying CI file into .gitea/workflows/ci.yml" mkdir -p .gitea/workflows cp "/workspace/osc/skins/template-repo/${{ env.TEMPLATE_REL_PATH }}" \ ".gitea/workflows/ci.yml" git add ".gitea/workflows/ci.yml" echo " Checking for staged changes" if git diff --cached --quiet; then echo " → No changes detected, skipping update for ${owner}/${repo}" else echo " ✓ Changes detected" echo " Committing update" git commit -m "Update CI" echo " Pushing to main branch" git push origin HEAD:main echo " ✓ Update pushed" fi cd - >/dev/null rm -rf "$tmpdir" echo "[Completed ${owner}/${repo}]" ) || { echo "⚠ Skipping ${owner}/${repo} due to an error." } done done page=$((page + 1)) done echo "" echo "[Sync CI Complete]"