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 valid user repositories id: fetch_repos run: | page=1 per_page=50 valid_repos_file=$(mktemp) 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') [ "$users_count" -eq 0 ] && break 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") readme_json=$(curl -sSL -H "Authorization: token ${{ secrets.TOKEN }}" "${{ env.GITEA_API }}/repos/$owner/$repo/contents/README.md" || echo "{}") content=$(echo "$readme_json" | jq -r .content 2>/dev/null | base64 -d 2>/dev/null || echo "") if echo "$content" | grep -qE "^---$" && \ echo "$content" | grep -q "^gitea: none" && \ echo "$content" | grep -q "^include_toc: true" && \ echo "$content" | grep -q "^# Skins"; then echo "$owner/$repo" >> "$valid_repos_file" fi done done page=$((page + 1)) done echo "valid_repos_file=$valid_repos_file" >> "$GITHUB_OUTPUT" - name: Update user repositories run: | valid_repos_file="${{ steps.fetch_repos.outputs.valid_repos_file }}" while read -r repo_full; do owner=$(echo "$repo_full" | cut -d'/' -f1) repo=$(echo "$repo_full" | cut -d'/' -f2) echo "[Processing repository: ${owner}/${repo}]" tmpdir=$(mktemp -d) git clone --quiet "https://${{ secrets.TOKEN }}@${{ vars.CONTAINER_REGISTRY }}/${owner}/${repo}.git" --depth 1 "$tmpdir" cd "$tmpdir" mkdir -p .gitea/workflows cp "/workspace/template-repo/${{ env.TEMPLATE_REL_PATH }}" .gitea/workflows/ci.yml git config user.email "arlind@sulej.ch" git config user.name "ci-bot" git add .gitea/workflows/ci.yml if ! git diff --cached --quiet; then git commit -m "Update CI" git push origin HEAD:main fi cd - >/dev/null rm -rf "$tmpdir" echo "[Completed ${owner}/${repo}]" done < "$valid_repos_file" rm "$valid_repos_file" echo "[Sync CI Complete]"