Skip to content

Build installers

Build installers #208

name: Build installers
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.stepversion.outputs.version }}
cleanversion: ${{ steps.stepcleanversion.outputs.version }}
steps:
- uses: actions/checkout@v3
- name: Set up JDK for compilation
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '21-ea'
cache: 'maven'
- name: Build with Maven
shell: bash
run: |
mvn -B clean install
mvn -B -P compressXZ -f weasis-distributions clean package
- name: Retrieve version
shell: bash
run: |
FVERSION=$(awk -F'[<>]' '/<revision>/{print $3}' weasis-parent/pom.xml)$(awk -F'[<>]' '/<changelist>/{print $3}' weasis-parent/pom.xml)
echo "WEASIS_VERSION=${FVERSION}" >> $GITHUB_ENV
- name: Set compatible version
shell: bash
run: |
CVERSION=$(echo $WEASIS_VERSION | sed -e 's/"//g' -e 's/-.*//')
echo "WEASIS_CLEAN_VERSION=${CVERSION}" >> $GITHUB_ENV
- id: stepversion
run: echo ::set-output name=version::${{ env.WEASIS_VERSION }}
- id: stepcleanversion
run: echo ::set-output name=version::${{ env.WEASIS_CLEAN_VERSION }}
- name: Upload the weasis package for building the native distribution
uses: actions/upload-artifact@v3
with:
name: weasis-native-${{ env.WEASIS_VERSION }}
path: weasis-distributions/target/native-dist/weasis-native.zip
- name: Upload the weasis web distribution
uses: actions/upload-artifact@v3
with:
name: weasis-web-${{ env.WEASIS_VERSION }}
path: weasis-distributions/target/web-dist/weasis.war
jpackage:
env:
JDK_MODULES: "java.base,java.compiler,java.datatransfer,java.net.http,java.desktop,java.logging,java.management,java.prefs,java.xml,jdk.localedata,jdk.charsets,jdk.crypto.ec,jdk.crypto.cryptoki,jdk.unsupported,jdk.jdwp.agent"
NAME: "Weasis"
IDENTIFIER: "org.weasis.launcher"
WEASIS_INPUT: "native-dist/weasis-native/bin-dist"
WEASIS_OUTPUT: "output-dist"
WEASIS_INPUT_BIN: "native-dist/weasis-native/bin-dist/weasis"
runs-on: ${{ matrix.os }}
needs: build
strategy:
fail-fast: false
matrix:
include:
- { os: ubuntu-latest, platform: x64, wsystem: linux, warc: x86-64 }
- { os: macos-latest, platform: x64, wsystem: macosx, warc: x86-64 }
# - { os: windows-latest, platform: x86, wsystem: windows, warc: x86 }
- { os: windows-latest, platform: x64, wsystem: windows, warc: x86-64 }
steps:
- name: Set output version from build
shell: bash
run: |
echo ${{needs.build.outputs.version}}
echo ${{needs.build.outputs.cleanversion}}
echo "WEASIS_VERSION=${{needs.build.outputs.version}}" >> $GITHUB_ENV
echo "WEASIS_CLEAN_VERSION=${{needs.build.outputs.cleanversion}}" >> $GITHUB_ENV
- name: Set up JDK
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '21-ea'
- name: Download weasis-native
uses: actions/download-artifact@v3
with:
name: weasis-native-${{ env.WEASIS_VERSION }}
path: native-dist
- name: Unzip the native package version
shell: bash
run: |
unzip -o "native-dist/weasis-native.zip" -d "native-dist/weasis-native"
- name: Remove binaries not related to the current architecture
shell: bash
run: |
# Remove pack jar for launcher
rm -f ${{ env.WEASIS_INPUT_BIN }}/*.jar.pack.gz
# Remove the unrelated native packages
find ${{ env.WEASIS_INPUT_BIN }}/bundle/weasis-opencv-core-* -type f ! -name *weasis-opencv-core-${{ matrix.wsystem }}-${{ matrix.warc }}-* -exec rm -f {} \;
# Special case with 32-bit architecture, remove 64-bit lib
if [ "${{ matrix.warc }}" = "x86" ] ; then
rm -f ${{ env.WEASIS_INPUT_BIN }}/bundle/weasis-opencv-core-${{ matrix.wsystem }}-x86-64-*
fi
echo "$(ls ${{ env.WEASIS_INPUT_BIN }}/bundle/)"
- name: Import Developer Certificate
uses: apple-actions/import-codesign-certs@v1
if: matrix.wsystem == 'macosx'
id: cert
with:
p12-file-base64: ${{ secrets.MACOS_CERTIFICATE_DEVELOPMENT }}
p12-password: ${{ secrets.MACOS_CERTIFICATE_PWD }}
- name: Import Installer Certificate
uses: apple-actions/import-codesign-certs@v1
if: matrix.wsystem == 'macosx'
with:
create-keychain: "false"
keychain-password: ${{ steps.cert.outputs.keychain-password }}
p12-file-base64: ${{ secrets.MACOS_CERTIFICATE_INSTALLER }}
p12-password: ${{ secrets.MACOS_CERTIFICATE_PWD }}
- name: Build app binary with jpackage
shell: bash
env:
RES: "native-dist/weasis-native/build/script/resources/${{ matrix.wsystem }}"
run: |
machine=${{ matrix.wsystem }}
if [ "$machine" = "macosx" ] ; then
declare -a customOptions=("--java-options" "-splash:\$APPDIR/resources/images/about-round.png" "--java-options" "-Dapple.laf.useScreenMenuBar=true" "--java-options" "-Dapple.awt.application.appearance=NSAppearanceNameDarkAqua")
declare -a signArgs=("--mac-package-identifier" "${{ env.IDENTIFIER }}" "--mac-signing-keychain" "$HOME/Library/Keychains/signing_temp.keychain-db" "--mac-sign")
elif [ "$machine" = "windows" ] ; then
declare -a customOptions=("--java-options" "-splash:\$APPDIR\resources\images\about-round.png" )
declare -a signArgs=()
else
declare -a customOptions=("--java-options" "-splash:\$APPDIR/resources/images/about-round.png" )
declare -a signArgs=()
fi
declare -a commonOptions=("--java-options" "-Dgosh.port=17179" \
"--java-options" "-Djavax.accessibility.assistive_technologies=org.weasis.launcher.EmptyAccessibilityProvider" \
"--java-options" "-Djavax.accessibility.screen_magnifier_present=false" "--java-options" "--enable-preview" \
"--java-options" "--add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED" "--java-options" "--add-exports=java.base/sun.net.www.protocol.file=ALL-UNNAMED" \
"--java-options" "--add-exports=java.base/sun.net.www.protocol.https=ALL-UNNAMED" "--java-options" "--add-exports=java.base/sun.net.www.protocol.ftp=ALL-UNNAMED" \
"--java-options" "--add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED" "--java-options" "--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED" \
"--java-options" "--add-opens=java.base/java.net=ALL-UNNAMED" "--java-options" "--add-opens=java.base/java.lang=ALL-UNNAMED" \
"--java-options" "--add-opens=java.base/java.security=ALL-UNNAMED" "--java-options" "--add-opens=java.base/java.io=ALL-UNNAMED" \
"--java-options" "--add-opens=java.desktop/javax.imageio.stream=ALL-UNNAMED" "--java-options" "--add-opens=java.desktop/javax.imageio=ALL-UNNAMED" \
"--java-options" "--add-opens=java.desktop/com.sun.awt=ALL-UNNAMED" )
jpackage --type app-image --input "${{ env.WEASIS_INPUT_BIN }}" --dest "${{ env.WEASIS_OUTPUT }}" --name "${{ env.NAME }}" \
--main-jar weasis-launcher.jar --main-class org.weasis.launcher.AppLauncher --add-modules "${{ env.JDK_MODULES }}" \
--resource-dir "${{ env.RES }}" --app-version "${{ env.WEASIS_CLEAN_VERSION }}" --add-launcher "Dicomizer=${{ env.RES }}/dicomizer-launcher.properties" \
"${signArgs[@]}" "${customOptions[@]}" "${commonOptions[@]}"
if [ "$machine" = "macosx" ] ; then
codesign --timestamp --entitlements "${{ env.RES }}/uri-launcher.entitlements" --options runtime --force -vvv --keychain "$HOME/Library/Keychains/signing_temp.keychain-db" --sign "${{ secrets.MACOS__DEVELOPER_ID }}" "${{ env.RES }}/weasis-url-handler.app"
cp -Rf "${{ env.RES }}/weasis-url-handler.app" "${{ env.WEASIS_OUTPUT }}/${{ env.NAME }}.app/Contents/MacOS/"
codesign --timestamp --entitlements "${{ env.RES }}/uri-launcher.entitlements" --options runtime --force -vvv --keychain "$HOME/Library/Keychains/signing_temp.keychain-db" --sign "${{ secrets.MACOS__DEVELOPER_ID }}" "${{ env.WEASIS_OUTPUT }}/${{ env.NAME }}.app"
fi
echo "$(ls -la ${{ env.WEASIS_OUTPUT }})"
- name: Build package with jpackage
shell: bash
env:
RES: "native-dist/weasis-native/build/script/resources/${{ matrix.wsystem }}"
FILE_ASSOC: "native-dist/weasis-native/build/script/file-associations.properties"
VENDOR: "Weasis Team"
COPYRIGHT: "© 2009-2023 Weasis Team"
run: |
mkdir -p final-dist
machine=${{ matrix.wsystem }}
ARC_NAME=${{ matrix.warc }}
if [ "$machine" = "windows" ] ; then
[ "$ARC_NAME" = "x86" ] && UPGRADE_UID="3aedc24e-48a8-4623-ab39-0c3c01c7383b" || UPGRADE_UID="3aedc24e-48a8-4623-ab39-0c3c01c7383a"
jpackage --type "msi" --app-image "${{ env.WEASIS_OUTPUT }}/${{ env.NAME }}" --dest "${{ env.WEASIS_OUTPUT }}" --name "${{ env.NAME }}" --resource-dir "${{ env.RES }}/msi/${ARC_NAME}" \
--license-file "${{ env.WEASIS_INPUT }}/Licence.txt" --description "Weasis DICOM viewer" --win-upgrade-uuid "$UPGRADE_UID" \
--win-menu --win-menu-group "${{ env.NAME }}" --copyright "${{ env.COPYRIGHT }}" --app-version "${{ env.WEASIS_CLEAN_VERSION }}" \
--vendor "${{ env.VENDOR }}" --file-associations "${{ env.FILE_ASSOC }}" --verbose
cp ${{ env.WEASIS_OUTPUT }}/*.msi final-dist/${{ env.NAME }}-${{ env.WEASIS_CLEAN_VERSION }}-${ARC_NAME}.msi
elif [ "$machine" = "linux" ] ; then
if [ "${ARC_NAME}" = "x86" ] ; then
declare -a installerTypes=("deb")
else
declare -a installerTypes=("deb" "rpm")
fi
for installerType in ${installerTypes[@]}; do
jpackage --type "${installerType}" --app-image "${{ env.WEASIS_OUTPUT }}/${{ env.NAME }}" --dest "${{ env.WEASIS_OUTPUT }}" --name "${{ env.NAME }}" --resource-dir "${{ env.RES }}" \
--license-file "${{ env.WEASIS_INPUT }}/Licence.txt" --description "Weasis DICOM viewer" --vendor "${{ env.VENDOR }}" \
--copyright "${{ env.COPYRIGHT }}" --app-version "${{ env.WEASIS_CLEAN_VERSION }}" --file-associations "${{ env.FILE_ASSOC }}" \
--linux-app-release "1" --linux-package-name "weasis" --linux-deb-maintainer "Nicolas Roduit" --linux-rpm-license-type "EPL-2.0" \
--linux-menu-group "Viewer;MedicalSoftware;Graphics;" --linux-app-category "science" --linux-package-deps "libstdc++6, libgcc1" --linux-shortcut --verbose
cp ${{ env.WEASIS_OUTPUT }}/*.${installerType} final-dist
done
elif [ "$machine" = "macosx" ] ; then
# Do not set verbose for public build
jpackage --type "pkg" --app-image "${{ env.WEASIS_OUTPUT }}/${{ env.NAME }}.app" --dest "${{ env.WEASIS_OUTPUT }}" --name "${{ env.NAME }}" --resource-dir "${{ env.RES }}" \
--license-file "${{ env.WEASIS_INPUT }}/Licence.txt" --copyright "${{ env.COPYRIGHT }}" --app-version "${{ env.WEASIS_CLEAN_VERSION }}" --mac-package-identifier "${{ env.IDENTIFIER }}" \
--mac-signing-keychain "$HOME/Library/Keychains/signing_temp.keychain-db" --mac-sign
cp ${{ env.WEASIS_OUTPUT }}/*.pkg final-dist/${{ env.NAME }}-${{ env.WEASIS_CLEAN_VERSION }}-${ARC_NAME}.pkg
fi
echo "APP_ARTIFACT=weasis-${machine}-${ARC_NAME}-${{ env.WEASIS_CLEAN_VERSION }}" >> $GITHUB_ENV
- name: Notarize Build
shell: bash
if: matrix.wsystem == 'macosx'
run: |
BUNDLE_PKG="final-dist/${{ env.NAME }}-${{ env.WEASIS_CLEAN_VERSION }}-${{ matrix.warc }}.pkg"
# create temporary files
NOTARIZE_APP_LOG=$(mktemp -t notarize-app)
NOTARIZE_INFO_LOG=$(mktemp -t notarize-info)
# delete temporary files on exit
function finish {
rm "$NOTARIZE_APP_LOG" "$NOTARIZE_INFO_LOG"
}
trap finish EXIT
# submit app for notarization
if xcrun altool --notarize-app --primary-bundle-id "org.test.${{ env.NAME }}" --username "${{ secrets.MACOS_NOTARIZATION_USER}}" --password "${{ secrets.MACOS_NOTARIZATION_PWD }}" -f "$BUNDLE_PKG" > "$NOTARIZE_APP_LOG" 2>&1; then
cat "$NOTARIZE_APP_LOG"
RequestUUID=$(awk -F ' = ' '/RequestUUID/ {print $2}' "$NOTARIZE_APP_LOG")
# check status periodically
while sleep 60 && date; do
# check notarization status
if xcrun altool --notarization-info "$RequestUUID" --username "${{ secrets.MACOS_NOTARIZATION_USER}}" --password "${{ secrets.MACOS_NOTARIZATION_PWD }}" > "$NOTARIZE_INFO_LOG" 2>&1; then
cat "$NOTARIZE_INFO_LOG"
# once notarization is complete, run stapler and exit
if ! grep -q "Status: in progress" "$NOTARIZE_INFO_LOG"; then
xcrun stapler staple "$BUNDLE_PKG"
exit $?
fi
else
cat "$NOTARIZE_INFO_LOG" 1>&2
exit 1
fi
done
else
cat "$NOTARIZE_APP_LOG" 1>&2
exit 1
fi
- name: Upload the installer
uses: actions/upload-artifact@v3
with:
name: ${{ env.APP_ARTIFACT }}
path: final-dist