-
Notifications
You must be signed in to change notification settings - Fork 133
IEP-1475: Signing Windows Executable #1228
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 5 commits
826dfc7
200eee5
914f938
543756a
5c69473
8116925
f10e08f
47bcd01
70b422f
cdfaf07
baeea69
ff20f32
09a227b
e1ae050
94b1f30
c27f9ba
e8d43f4
9a8b624
f1aead4
c7a227e
eb83701
6b008a8
38f2739
6a0e72f
7024921
28fd1f0
b018315
40e11f5
c7097fe
a292776
8a7b021
4327e23
b17abfe
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,203 @@ | ||||||||||||||||||||||||||||||||||||||
| name: Espressif-IDE Cross-platform Release | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| on: | ||||||||||||||||||||||||||||||||||||||
| push: | ||||||||||||||||||||||||||||||||||||||
| branches: [master] | ||||||||||||||||||||||||||||||||||||||
| tags: | ||||||||||||||||||||||||||||||||||||||
| - "v[0-9]+.[0-9]+.[0-9]+" | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
| pull_request: | ||||||||||||||||||||||||||||||||||||||
| branches: [master] | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| env: | ||||||||||||||||||||||||||||||||||||||
| ARCHIVE_PREFIX: com.espressif.idf.update- | ||||||||||||||||||||||||||||||||||||||
| ARCHIVE_SUFFIX: -SNAPSHOT.zip | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| jobs: | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| macos-build: | ||||||||||||||||||||||||||||||||||||||
| runs-on: macos-latest | ||||||||||||||||||||||||||||||||||||||
| outputs: | ||||||||||||||||||||||||||||||||||||||
| version: ${{ steps.get_version.outputs.version }} | ||||||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||||||
| - uses: actions/checkout@v3 | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
| - name: Set up JDK 17 | ||||||||||||||||||||||||||||||||||||||
| uses: actions/setup-java@v3 | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||
| java-version: '17' | ||||||||||||||||||||||||||||||||||||||
| distribution: 'temurin' | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
| - name: Get version from tag | ||||||||||||||||||||||||||||||||||||||
| id: get_version | ||||||||||||||||||||||||||||||||||||||
| run: echo "version=${GITHUB_REF##*/v}" >> $GITHUB_OUTPUT | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| - name: Decode keystore and build with Maven | ||||||||||||||||||||||||||||||||||||||
| env: | ||||||||||||||||||||||||||||||||||||||
| JARSIGNER_KEYSTORE_B64: ${{ secrets.JARSIGNER_REL_KEYSTORE_B64 }} | ||||||||||||||||||||||||||||||||||||||
| JARSIGNER_STOREPASS: ${{ secrets.JARSIGNER_REL_STOREPASS }} | ||||||||||||||||||||||||||||||||||||||
| JARSIGNER_ALIAS: ${{ secrets.JARSIGNER_REL_ALIAS }} | ||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||
| KEYSTORE_FILE="${PWD}/{{secrets.JARSIGNER_KEYSTORE}}" | ||||||||||||||||||||||||||||||||||||||
| echo "${KEYSTORE_FILE}" | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
| printf "%s" "${JARSIGNER_KEYSTORE_B64}" | base64 -d > "${KEYSTORE_FILE}" | ||||||||||||||||||||||||||||||||||||||
| mvn -e -X clean install -Djarsigner.keystore="${KEYSTORE_FILE}" -Djarsigner.alias="${JARSIGNER_ALIAS}" -Djarsigner.storepass="${JARSIGNER_STOREPASS}" -DskipTests=true | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
| rm -v "${KEYSTORE_FILE}" | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| - name: Code sign and notarize macOS apps and DMGs | ||||||||||||||||||||||||||||||||||||||
| env: | ||||||||||||||||||||||||||||||||||||||
| MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }} | ||||||||||||||||||||||||||||||||||||||
| MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }} | ||||||||||||||||||||||||||||||||||||||
| NOTARIZATION_USERNAME: ${{ secrets.NOTARIZATION_USERNAME }} | ||||||||||||||||||||||||||||||||||||||
| NOTARIZATION_PASSWORD: ${{ secrets.NOTARIZATION_PASSWORD }} | ||||||||||||||||||||||||||||||||||||||
| NOTARIZATION_TEAM_ID: ${{ secrets.NOTARIZATION_TEAM_ID }} | ||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||
| echo "$MACOS_CERTIFICATE" | base64 -d > certificate.p12 | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| # Set up keychain | ||||||||||||||||||||||||||||||||||||||
| security create-keychain -p espressif build.keychain | ||||||||||||||||||||||||||||||||||||||
| security default-keychain -s build.keychain | ||||||||||||||||||||||||||||||||||||||
| security unlock-keychain -p espressif build.keychain | ||||||||||||||||||||||||||||||||||||||
| security import certificate.p12 -k build.keychain -P "$MACOS_CERTIFICATE_PWD" -T /usr/bin/codesign | ||||||||||||||||||||||||||||||||||||||
| security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k espressif build.keychain | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| # Codesign | ||||||||||||||||||||||||||||||||||||||
| for arch in x86_64 aarch64; do | ||||||||||||||||||||||||||||||||||||||
| app=releng/com.espressif.idf.product/target/products/com.espressif.idf.product/macosx/cocoa/$arch/Espressif-IDE.app | ||||||||||||||||||||||||||||||||||||||
| codesign --entitlements releng/com.espressif.idf.product/entitlements/espressif-ide.entitlement --options runtime --force -s "ESPRESSIF SYSTEMS (SHANGHAI) CO., LTD. (QWXF6GB4AV)" "$app" | ||||||||||||||||||||||||||||||||||||||
| codesign -v --deep "$app" | ||||||||||||||||||||||||||||||||||||||
| done | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| # Create and sign DMGs | ||||||||||||||||||||||||||||||||||||||
| releng/ide-dmg-builder/ide-dmg-builder.sh | ||||||||||||||||||||||||||||||||||||||
| releng/ide-dmg-builder/ide-dmg-builder-aarch64.sh | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| for arch in x86_64 aarch64; do | ||||||||||||||||||||||||||||||||||||||
| dmg="releng/ide-dmg-builder/Espressif-IDE-macosx-cocoa-${arch}.dmg" | ||||||||||||||||||||||||||||||||||||||
| codesign --entitlements releng/com.espressif.idf.product/entitlements/espressif-ide.entitlement --options runtime --force -s "ESPRESSIF SYSTEMS (SHANGHAI) CO., LTD. (QWXF6GB4AV)" "$dmg" | ||||||||||||||||||||||||||||||||||||||
| codesign -v --deep "$dmg" | ||||||||||||||||||||||||||||||||||||||
| done | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| # Notarization | ||||||||||||||||||||||||||||||||||||||
| security create-keychain -p espressif notary.keychain | ||||||||||||||||||||||||||||||||||||||
| security default-keychain -s notary.keychain | ||||||||||||||||||||||||||||||||||||||
| security unlock-keychain -p espressif notary.keychain | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| xcrun notarytool store-credentials "ide-notarytool-profile" --apple-id "$NOTARIZATION_USERNAME" --team-id "$NOTARIZATION_TEAM_ID" --password "$NOTARIZATION_PASSWORD" | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| for arch in x86_64 aarch64; do | ||||||||||||||||||||||||||||||||||||||
| dmg="releng/ide-dmg-builder/Espressif-IDE-macosx-cocoa-${arch}.dmg" | ||||||||||||||||||||||||||||||||||||||
| xcrun notarytool submit "$dmg" --keychain-profile "ide-notarytool-profile" --wait | ||||||||||||||||||||||||||||||||||||||
| xcrun stapler staple "$dmg" | ||||||||||||||||||||||||||||||||||||||
| done | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| - name: Upload macOS DMGs and other artifacts | ||||||||||||||||||||||||||||||||||||||
| uses: actions/upload-artifact@v4 | ||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||
| name: release-artifacts | ||||||||||||||||||||||||||||||||||||||
| path: | | ||||||||||||||||||||||||||||||||||||||
| releng/ide-dmg-builder/Espressif-IDE-macosx-cocoa-*.dmg | ||||||||||||||||||||||||||||||||||||||
| releng/com.espressif.idf.update/target/repository | ||||||||||||||||||||||||||||||||||||||
| releng/com.espressif.idf.product/target/products/Espressif-IDE-*-win32.win32.x86_64.zip | ||||||||||||||||||||||||||||||||||||||
| releng/com.espressif.idf.product/target/products/Espressif-IDE-*-linux.gtk.x86_64.tar.gz | ||||||||||||||||||||||||||||||||||||||
| releng/com.espressif.idf.update/target/com.espressif.idf.update-*.zip | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
| windows-sign: | ||||||||||||||||||||||||||||||||||||||
| runs-on: windows-latest | ||||||||||||||||||||||||||||||||||||||
| needs: macos-build | ||||||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||||||
| - uses: actions/checkout@v3 | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
| - name: Download built artifacts | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
| uses: actions/download-artifact@v4 | ||||||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||||||
| name: release-artifacts | ||||||||||||||||||||||||||||||||||||||
| path: artifacts | ||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
| - name: Download built artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: release-artifacts | |
| path: artifacts | |
| - name: Download built artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: espressif-ide-win32 | |
| path: artifacts |
🤖 Prompt for AI Agents
In .github/workflows/win_exe_sign_test.yml around lines 143 to 148, the download
step uses the artifact name 'release-artifacts', but the macOS build uploads the
Windows ZIP artifact under the name 'espressif-ide-win32'. To fix this, either
change the upload artifact name in the macOS build job to 'release-artifacts' to
match this download step, or update the download step here to use the artifact
name 'espressif-ide-win32' so it correctly downloads the uploaded artifact.
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Install and configure Java on Windows runner
You invoke keytool.exe via $env:JAVA_HOME, but no JDK is installed or JAVA_HOME set on the Windows runner. Add a setup step before this block:
- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '11'🤖 Prompt for AI Agents
In .github/workflows/win_exe_sign_test.yml around lines 153 to 159, the workflow
uses keytool.exe via $env:JAVA_HOME but does not install Java or set JAVA_HOME
on the Windows runner. To fix this, add a step before this block that uses
actions/setup-java@v4 to install Java 11 from the Temurin distribution and set
JAVA_HOME properly.
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consistent artifact naming for Windows ZIP upload
The step repacks and uploads the signed Windows ZIP under release-artifacts, which conflicts with the original upload naming. Unify artifact names across jobs. For instance, to continue using espressif-ide-win32:
- - name: Upload Signed Windows ZIP
- uses: actions/upload-artifact@v4
+ - name: Upload Signed Windows ZIP
+ uses: actions/upload-artifact@v4
with:
- name: release-artifacts
+ name: espressif-ide-win32
path: artifacts/Espressif-IDE-win32.win32.x86_64.zip📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - name: Repack signed Windows ZIP | |
| run: | | |
| Compress-Archive -Path extracted\* -DestinationPath artifacts/Espressif-IDE-win32.win32.x86_64.zip -Force | |
| - name: Upload Signed Windows ZIP | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: release-artifacts | |
| path: artifacts/Espressif-IDE-win32.win32.x86_64.zip | |
| - name: Repack signed Windows ZIP | |
| run: | | |
| Compress-Archive -Path extracted\* -DestinationPath artifacts/Espressif-IDE-win32.win32.x86_64.zip -Force | |
| - name: Upload Signed Windows ZIP | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: espressif-ide-win32 | |
| path: artifacts/Espressif-IDE-win32.win32.x86_64.zip |
🤖 Prompt for AI Agents
In .github/workflows/win_exe_sign_test.yml around lines 182 to 191, the artifact
name used for uploading the signed Windows ZIP is set to "release-artifacts,"
which is inconsistent with the original artifact naming convention. To fix this,
change the artifact name in the upload step to match the original naming, such
as "espressif-ide-win32," ensuring consistent artifact names across all jobs.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Replace regex tag filter with glob pattern
GitHub Actions tag filters do not support regex syntax. Update the pattern from:
to a shell-style glob, for example:
This ensures your workflow triggers correctly on version tags.
🤖 Prompt for AI Agents