summaryrefslogtreecommitdiff
path: root/meshmc/.github/actions/package/windows/action.yml
diff options
context:
space:
mode:
Diffstat (limited to 'meshmc/.github/actions/package/windows/action.yml')
-rw-r--r--meshmc/.github/actions/package/windows/action.yml142
1 files changed, 142 insertions, 0 deletions
diff --git a/meshmc/.github/actions/package/windows/action.yml b/meshmc/.github/actions/package/windows/action.yml
new file mode 100644
index 0000000000..33e3d42718
--- /dev/null
+++ b/meshmc/.github/actions/package/windows/action.yml
@@ -0,0 +1,142 @@
+name: Package for Windows
+description: Create a Windows package for MeshMC
+
+inputs:
+ version:
+ description: Launcher version
+ required: true
+ build-type:
+ description: Type for the build
+ required: true
+ default: Debug
+ artifact-name:
+ description: Name of the uploaded artifact
+ required: true
+ msystem:
+ description: MSYS2 subsystem to use
+ required: false
+ windows-codesign-cert:
+ description: Certificate for signing Windows builds
+ required: false
+ windows-codesign-password:
+ description: Password for signing Windows builds
+ required: false
+
+runs:
+ using: composite
+
+ steps:
+ - name: Package (MinGW)
+ if: ${{ inputs.msystem != '' }}
+ shell: msys2 {0}
+ env:
+ BUILD_DIR: build
+ INSTALL_DIR: install
+ run: |
+ cmake --install ${{ env.BUILD_DIR }} --config ${{ inputs.build-type }}
+ touch ${{ env.INSTALL_DIR }}/manifest.txt
+ for l in $(find ${{ env.INSTALL_DIR }} -type f); do l=$(cygpath -u $l); l=${l#$(pwd)/}; l=${l#${{ env.INSTALL_DIR }}/}; l=${l#./}; echo $l; done >> ${{ env.INSTALL_DIR }}/manifest.txt
+
+ - name: Package (MSVC)
+ if: ${{ inputs.msystem == '' }}
+ shell: pwsh
+ env:
+ BUILD_DIR: build
+ INSTALL_DIR: install
+ run: |
+ cmake --install ${{ env.BUILD_DIR }} --config ${{ inputs.build-type }}
+
+ cd ${{ github.workspace }}
+
+ Get-ChildItem ${{ env.INSTALL_DIR }} -Recurse | ForEach FullName | Resolve-Path -Relative | %{ $_.TrimStart('.\') } | %{ $_.TrimStart('${{ env.INSTALL_DIR }}') } | %{ $_.TrimStart('\') } | Out-File -FilePath ${{ env.INSTALL_DIR }}/manifest.txt
+
+ - name: Fetch codesign certificate
+ shell: bash # yes, we are not using MSYS2 or PowerShell here
+ run: |
+ echo '${{ inputs.windows-codesign-cert }}' | base64 --decode > codesign.pfx
+
+ - name: Sign executable
+ shell: pwsh
+ env:
+ INSTALL_DIR: install
+ run: |
+ if (Get-Content ./codesign.pfx){
+ cd ${{ env.INSTALL_DIR }}
+ # We ship the exact same executable for portable and non-portable editions, so signing just once is fine
+ SignTool sign /fd sha256 /td sha256 /f ../codesign.pfx /p '${{ inputs.windows-codesign-password }}' /tr http://timestamp.digicert.com meshmc.exe
+ } else {
+ ":warning: Skipped code signing for Windows, as certificate was not present." >> $env:GITHUB_STEP_SUMMARY
+ }
+
+ - name: Package (MinGW, portable)
+ if: ${{ inputs.msystem != '' }}
+ shell: msys2 {0}
+ env:
+ BUILD_DIR: build
+ INSTALL_DIR: install
+ INSTALL_PORTABLE_DIR: install-portable
+ run: |
+ cp -r ${{ env.INSTALL_DIR }} ${{ env.INSTALL_PORTABLE_DIR }} # cmake install on Windows is slow, let's just copy instead
+ cmake --install ${{ env.BUILD_DIR }} --config ${{ inputs.build-type }} --prefix ${{ env.INSTALL_PORTABLE_DIR }} --component portable
+ for l in $(find ${{ env.INSTALL_PORTABLE_DIR }} -type f); do l=$(cygpath -u $l); l=${l#$(pwd)/}; l=${l#${{ env.INSTALL_PORTABLE_DIR }}/}; l=${l#./}; echo $l; done >> ${{ env.INSTALL_PORTABLE_DIR }}/manifest.txt
+
+ - name: Package (MSVC, portable)
+ if: ${{ inputs.msystem == '' }}
+ shell: pwsh
+ env:
+ BUILD_DIR: build
+ INSTALL_DIR: install
+ INSTALL_PORTABLE_DIR: install-portable
+ run: |
+ cp -r ${{ env.INSTALL_DIR }} ${{ env.INSTALL_PORTABLE_DIR }} # cmake install on Windows is slow, let's just copy instead
+ cmake --install ${{ env.BUILD_DIR }} --config ${{ inputs.build-type }} --prefix ${{ env.INSTALL_PORTABLE_DIR }} --component portable
+
+ Get-ChildItem ${{ env.INSTALL_PORTABLE_DIR }} -Recurse | ForEach FullName | Resolve-Path -Relative | %{ $_.TrimStart('.\') } | %{ $_.TrimStart('${{ env.INSTALL_PORTABLE_DIR }}') } | %{ $_.TrimStart('\') } | Out-File -FilePath ${{ env.INSTALL_DIR }}/manifest.txt
+
+ - name: Package (installer)
+ shell: pwsh
+ env:
+ BUILD_DIR: build
+ INSTALL_DIR: install
+
+ NSCURL_VERSION: "v24.9.26.122"
+ NSCURL_SHA256: "AEE6C4BE3CB6455858E9C1EE4B3AFE0DB9960FA03FE99CCDEDC28390D57CCBB0"
+ run: |
+ New-Item -Name NSISPlugins -ItemType Directory
+ Invoke-Webrequest https://github.com/negrutiu/nsis-nscurl/releases/download/"${{ env.NSCURL_VERSION }}"/NScurl.zip -OutFile NSISPlugins\NScurl.zip
+ $nscurl_hash = Get-FileHash NSISPlugins\NScurl.zip -Algorithm Sha256 | Select-Object -ExpandProperty Hash
+ if ( $nscurl_hash -ne "${{ env.nscurl_sha256 }}") {
+ echo "::error:: NSCurl.zip sha256 mismatch"
+ exit 1
+ }
+ Expand-Archive -Path NSISPlugins\NScurl.zip -DestinationPath NSISPlugins\NScurl
+
+ cd ${{ env.INSTALL_DIR }}
+ makensis -NOCD "${{ github.workspace }}/${{ env.BUILD_DIR }}/win_install.nsi"
+
+ - name: Sign installer
+ shell: pwsh
+ run: |
+ if (Get-Content ./codesign.pfx){
+ SignTool sign /fd sha256 /td sha256 /f codesign.pfx /p '${{ inputs.windows-codesign-password }}' /tr http://timestamp.digicert.com MeshMC-Setup.exe
+ } else {
+ ":warning: Skipped code signing for Windows, as certificate was not present." >> $env:GITHUB_STEP_SUMMARY
+ }
+
+ - name: Upload binary zip
+ uses: actions/upload-artifact@v5
+ with:
+ name: MeshMC-${{ inputs.artifact-name }}-${{ inputs.version }}-${{ inputs.build-type }}
+ path: install/**
+
+ - name: Upload portable zip
+ uses: actions/upload-artifact@v5
+ with:
+ name: MeshMC-${{ inputs.artifact-name }}-Portable-${{ inputs.version }}-${{ inputs.build-type }}
+ path: install-portable/**
+
+ - name: Upload installer
+ uses: actions/upload-artifact@v5
+ with:
+ name: MeshMC-${{ inputs.artifact-name }}-Setup-${{ inputs.version }}-${{ inputs.build-type }}
+ path: MeshMC-Setup.exe