summaryrefslogtreecommitdiff
path: root/.github/actions/meshmc/package/windows/action.yml
blob: 212d6e11fd181430c9228d5f6f55ab3d1205203d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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: meshmc/build
        INSTALL_DIR: meshmc/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: meshmc/build
        INSTALL_DIR: meshmc/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: meshmc/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 ${{ github.workspace }}/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: meshmc/build
        INSTALL_DIR: meshmc/install
        INSTALL_PORTABLE_DIR: meshmc/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: meshmc/build
        INSTALL_DIR: meshmc/install
        INSTALL_PORTABLE_DIR: meshmc/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: meshmc/build
        INSTALL_DIR: meshmc/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/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: meshmc/install/**

    - name: Upload portable zip
      uses: actions/upload-artifact@v5
      with:
        name: MeshMC-${{ inputs.artifact-name }}-Portable-${{ inputs.version }}-${{ inputs.build-type }}
        path: meshmc/install-portable/**

    - name: Upload installer
      uses: actions/upload-artifact@v5
      with:
        name: MeshMC-${{ inputs.artifact-name }}-Setup-${{ inputs.version }}-${{ inputs.build-type }}
        path: meshmc/MeshMC-Setup.exe