diff --git a/.github/workflows/packer.yml b/.github/workflows/packer.yml index 47a27ee2571c..064ff23b5049 100644 --- a/.github/workflows/packer.yml +++ b/.github/workflows/packer.yml @@ -4,21 +4,20 @@ on: workflow_dispatch: push: branches: [ main ] - paths: + paths: - 'src/**' - 'config/packer/**' - 'projects/**' - + jobs: build-packer: - if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' name: Build / Cache Packer runs-on: windows-latest steps: - uses: actions/checkout@v4 - with: + with: fetch-depth: 1 sparse-checkout: src @@ -45,7 +44,7 @@ jobs: # runs-on: windows-latest # steps: # - uses: actions/checkout@v4 - # with: + # with: # fetch-depth: 1 # sparse-checkout: src @@ -65,16 +64,15 @@ jobs: # run: dotnet publish .\src\Uploader\Uploader.csproj -o ./ -r win-x64 -p:PublishSingeFile=true initialize-release: - if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' name: Initialize Release runs-on: windows-latest steps: - name: Create timestamp id: create_timestamp - run: echo "::set-output name=timestamp::$(date '+%Y%m%d%H%M%s')" + run: echo "timestamp=$(date '+%Y%m%d%H%M%s')" >> $GITHUB_OUTPUT shell: bash - + # Create the release: https://github.com/actions/create-release - name: Create release id: create_release @@ -88,10 +86,10 @@ jobs: prerelease: false outputs: upload-url: ${{ steps.create_release.outputs.upload_url }} + tag-name: Snapshot-${{ steps.create_timestamp.outputs.timestamp }} pack: - if: github.repository == 'CFPAOrg/Minecraft-Mod-Language-Package' name: Pack Resources and Upload Artifacts/Releases needs: [ build-packer, initialize-release ] # 显然,需要存在打包程序,才能打包。 strategy: @@ -101,11 +99,23 @@ jobs: # 如需添加新版本,在这里添加即可。 version: [ "1.12.2", "1.16", "1.16-fabric", "1.18", "1.18-fabric", "1.19", "1.20", "1.20-fabric", "1.21", "1.21-fabric" ] runs-on: windows-latest + outputs: + # 为每个版本创建独立的输出变量 + updated_versions_1_12_2: ${{ steps.collect-updated.outputs.version_1_12_2 }} + updated_versions_1_16: ${{ steps.collect-updated.outputs.version_1_16 }} + updated_versions_1_16_fabric: ${{ steps.collect-updated.outputs.version_1_16_fabric }} + updated_versions_1_18: ${{ steps.collect-updated.outputs.version_1_18 }} + updated_versions_1_18_fabric: ${{ steps.collect-updated.outputs.version_1_18_fabric }} + updated_versions_1_19: ${{ steps.collect-updated.outputs.version_1_19 }} + updated_versions_1_20: ${{ steps.collect-updated.outputs.version_1_20 }} + updated_versions_1_20_fabric: ${{ steps.collect-updated.outputs.version_1_20_fabric }} + updated_versions_1_21: ${{ steps.collect-updated.outputs.version_1_21 }} + updated_versions_1_21_fabric: ${{ steps.collect-updated.outputs.version_1_21_fabric }} steps: - uses: actions/checkout@v2 with: fetch-depth: 20 # 显然,需要有提交历史才能比较提交。20这个数是任意的。 - + # 由于Github的限制,这里需要重新拉取打包程序。 - name: Restore Packer id: cache-restore @@ -137,25 +147,139 @@ jobs: - name: Upload Artifact for ${{ matrix.version }} uses: actions/upload-artifact@v4 with: - name: Minecraft-Mod-Language-Package-${{ matrix.version }} + name: Minecraft-Mod-Language-Modpack-${{ matrix.version }} path: | - Minecraft-Mod-Language-Package-${{ matrix.version }}.zip + Minecraft-Mod-Language-Modpack-${{ matrix.version }}.zip ${{ matrix.version }}.md5 if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - # Upload release asset: https://github.com/actions/upload-release-asset - - name: Update release asset for ${{ matrix.version }} - id: upload-release-asset - if: steps.check-changes.outputs.changed == 'true' || github.event_name == 'workflow_dispatch' - uses: actions/upload-release-asset@v1 + - name: Collect updated versions + id: collect-updated + run: | + if [ "${{ steps.check-changes.outputs.changed }}" == "true" ] || [ "${{ github.event_name }}" == "workflow_dispatch" ]; then + # Replace all periods and hyphens with underscores + # 将.转换为_,适配变量名 + output_key=$(echo "${{ matrix.version }}" | sed 's/[\.-]/_/g') + echo "version_$output_key=${{ matrix.version }}" >> $GITHUB_OUTPUT + fi + shell: bash + continue-on-error: true + + upload-release-assets: + name: Upload Release Assets + needs: [ pack, initialize-release ] + runs-on: windows-latest + steps: + - name: Download all Artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts/ + + - name: Upload Release Assets env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Get the upload URL from the previous job + $upload_url = "${{ needs.initialize-release.outputs.upload-url }}" + + # Clean up the URL by removing the template part {?name,label} + $clean_upload_url = $upload_url.Split('{')[0] + + # Iterate through downloaded artifact directories + Get-ChildItem -Path "artifacts" -Directory | ForEach-Object { + $artifact_dir_name = $_.Name + $version_tag = ($artifact_dir_name -split '-Modpack-')[1] + + # Generate the correct asset names + if ($version_tag -eq '1.12.2') { + $zip_asset_name = "Minecraft-Mod-Language-Modpack.zip" + } else { + $formatted_version = $version_tag -replace '\.', '-' + $formatted_version = $formatted_version -replace 'fabric', 'Fabric' + $zip_asset_name = "Minecraft-Mod-Language-Modpack-$formatted_version.zip" + } + + # Build file paths using sub-expression operator + $zip_path = "$(Join-Path -Path $_.FullName -ChildPath ($artifact_dir_name + '.zip'))" + $md5_path = "$(Join-Path -Path $_.FullName -ChildPath ($version_tag + '.md5'))" + + # Build the full URL using the format operator -f + $zip_upload_url = "{0}?name={1}" -f $clean_upload_url, $zip_asset_name + $md5_upload_url = "{0}?name={1}" -f $clean_upload_url, ($version_tag + ".md5") + + # Upload ZIP file + echo "Uploading ZIP: $zip_path as $zip_asset_name" + curl.exe -X POST ` + -H "Authorization: token $env:GITHUB_TOKEN" ` + -H "Content-Type: application/zip" ` + --data-binary "@$zip_path" ` + $zip_upload_url + + # Upload MD5 file + echo "Uploading MD5: $md5_path as $version_tag.md5" + $md5_content = Get-Content -Path "$md5_path" + curl.exe -X POST ` + -H "Authorization: token $env:GITHUB_TOKEN" ` + -H "Content-Type: text/plain" ` + --data-raw "$md5_content" ` + $md5_upload_url + } + shell: pwsh + + update-index: + name: Update Version Index (Optional) + needs: [pack, initialize-release] + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 with: - upload_url: ${{ needs.initialize-release.outputs.upload-url }} - asset_path: Minecraft-Mod-Language-Package-${{ matrix.version }}.zip - asset_name: Minecraft-Mod-Language-Package-${{ matrix.version }}.zip - asset_content_type: application/zip - + fetch-depth: 1 + + - name: Set up index branch + run: | + git fetch origin index + git checkout index || git checkout -b index + + - name: Download existing index.json + run: | + if [ ! -f version-index.json ]; then + echo "{}" > version-index.json + fi + + - name: Update index.json + env: + RELEASE_TAG: ${{ needs.initialize-release.outputs.tag-name }} + PACK_OUTPUTS: ${{ toJSON(needs.pack.outputs) }} + run: | + python3 - <