diff --git a/.github/workflows/sync-release-to-gitcode.yml b/.github/workflows/sync-release-to-gitcode.yml index ddf9f5c1..58f5d8dc 100644 --- a/.github/workflows/sync-release-to-gitcode.yml +++ b/.github/workflows/sync-release-to-gitcode.yml @@ -30,6 +30,8 @@ jobs: release_tag: ${{ steps.release.outputs.tag }} release_body: ${{ steps.release.outputs.body }} release_prerelease: ${{ steps.release.outputs.prerelease }} + bootstrap_asset: ${{ steps.release.outputs.bootstrap_asset }} + release_asset_matrix: ${{ steps.release.outputs.asset_matrix }} steps: - name: Wait for GitHub release workflows if: ${{ github.event_name == 'push' }} @@ -107,11 +109,39 @@ jobs: exit 1 fi + while IFS= read -r -d '' file; do + directory="$(dirname "$file")" + filename="$(basename "$file")" + safe_filename="$(sed 's/[^A-Za-z0-9._+-]/-/g' <<< "$filename")" + if [[ "$filename" != "$safe_filename" ]]; then + if [[ -e "$directory/$safe_filename" ]]; then + echo "::error::Asset filename collision after normalization: $safe_filename" + exit 1 + fi + mv -- "$file" "$directory/$safe_filename" + fi + done < <(find release-assets -maxdepth 1 -type f -print0) + find release-assets -maxdepth 1 -type f -print | sort + bootstrap_asset="$( + find release-assets -maxdepth 1 -type f -printf '%s\t%f\n' \ + | sort -n -k1,1 \ + | head -n 1 \ + | cut -f2- + )" + asset_matrix="$( + find release-assets -maxdepth 1 -type f -printf '%f\n' \ + | sort \ + | jq -Rsc --arg bootstrap "$bootstrap_asset" \ + 'split("\n") | map(select(length > 0 and . != $bootstrap))' + )" + delimiter="release-body-$(openssl rand -hex 16)" { echo "tag=$RELEASE_TAG" + echo "bootstrap_asset=$bootstrap_asset" + echo "asset_matrix=$asset_matrix" echo "body<<$delimiter" # sync_to_gitcode embeds this input in a single-quoted shell string. # Replace ASCII apostrophes so release notes cannot break its script. @@ -128,8 +158,8 @@ jobs: if-no-files-found: error retention-days: 1 - gitcode-release: - name: Publish GitCode release + gitcode-release-metadata: + name: Publish GitCode release metadata needs: prepare-release-assets if: ${{ vars.GITCODE_REPOSITORY != '' }} uses: nvdacn/sync_to_gitcode/.github/workflows/CreateReleaseOnGitCode.yaml@18b70112d0e62260bc54085028e5510bbc6323b2 @@ -140,6 +170,29 @@ jobs: tag_name: ${{ needs.prepare-release-assets.outputs.release_tag }} body: ${{ needs.prepare-release-assets.outputs.release_body }} prerelease: ${{ needs.prepare-release-assets.outputs.release_prerelease == 'true' }} - file_name: '*' + file_name: ${{ needs.prepare-release-assets.outputs.bootstrap_asset }} + secrets: + GITCODE_TOKEN: ${{ secrets.GITCODE_TOKEN }} + + gitcode-release-assets: + name: Publish GitCode asset (${{ matrix.file_name }}) + needs: + - prepare-release-assets + - gitcode-release-metadata + if: ${{ vars.GITCODE_REPOSITORY != '' }} + strategy: + fail-fast: false + max-parallel: 4 + matrix: + file_name: ${{ fromJSON(needs.prepare-release-assets.outputs.release_asset_matrix) }} + uses: nvdacn/sync_to_gitcode/.github/workflows/CreateReleaseOnGitCode.yaml@18b70112d0e62260bc54085028e5510bbc6323b2 + with: + artifact_name: gitcode-release-assets + gitcode_repository: ${{ vars.GITCODE_REPOSITORY }} + default_branch: main + tag_name: ${{ needs.prepare-release-assets.outputs.release_tag }} + body: ${{ needs.prepare-release-assets.outputs.release_body }} + prerelease: ${{ needs.prepare-release-assets.outputs.release_prerelease == 'true' }} + file_name: ${{ matrix.file_name }} secrets: GITCODE_TOKEN: ${{ secrets.GITCODE_TOKEN }}