From 1a5b754a304f16ae786a4f895fcf9802631d061e Mon Sep 17 00:00:00 2001 From: Fred Feng Date: Sun, 18 Oct 2026 14:14:31 +1100 Subject: [PATCH] feat: add app installation --- .github/workflows/build.yml | 46 ++++++++++++++---- docs/assets/login.png | Bin 69559 -> 69777 bytes .../github/sqljam/face/view/LoginView.java | 10 +++- src/packaging/package.sh | 25 +++++++++- 4 files changed, 69 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 86d6b89..e8f68dd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,20 +1,23 @@ # Builds SqlJam. Database servers are not available here: the ci environment runs the integration tests of H2, # SQLite and DuckDB only, the others are skipped. # -# check pull requests and master: one Linux build with all tests, the check of merging -# platforms master, tags and manual runs: Windows, macOS and Linux build, start the runnable jar and take -# screenshots, packages for download (src/packaging/package.sh); it does not hold up pull requests -# release tags v*: a GitHub release with the packages of every platform +# check pull requests: one Linux build with all tests, the check of merging +# platforms tags v* and manual runs (Actions > build > Run workflow): Windows, macOS and Linux build, start the +# runnable jar and take screenshots, packages for download (src/packaging/package.sh) +# release tags v*: a GitHub release with the packages of every platform and their SHA-256 checksums +# Merging into master builds nothing, the pull request is checked already. name: build on: push: - branches: [master] tags: ['v*'] - paths-ignore: ['docs/**', '**/*.md', 'change_logs/**'] pull_request: paths-ignore: ['docs/**', '**/*.md', 'change_logs/**'] workflow_dispatch: + inputs: + version: + description: Version of the packages, e.g. 1.0.0 to try the msi installer (the version of pom.xml if empty) + required: false # A newer commit of the same branch or pull request cancels the running build concurrency: @@ -23,6 +26,7 @@ concurrency: jobs: check: + if: github.event_name == 'pull_request' runs-on: ubuntu-latest timeout-minutes: 30 steps: @@ -102,11 +106,25 @@ jobs: grep -q ":: SqlJam ::" run.log if grep -E "Exception|ERROR" run.log; then exit 1; fi - # Packages of a tag are named by it (v1.0.0-rc1: SqlJam-1.0.0-rc1-...), others by the version of pom.xml + # jpackage builds the msi installer with the WiX Toolset 3, the binaries are used without installing them + - name: Install the WiX Toolset for the msi installer + if: runner.os == 'Windows' + shell: pwsh + run: | + $wix = Join-Path $env:RUNNER_TEMP "wix" + Invoke-WebRequest -Uri "https://github.com/wixtoolset/wix3/releases/download/wix3141rtm/wix314-binaries.zip" ` + -OutFile "$wix.zip" + Expand-Archive -Path "$wix.zip" -DestinationPath $wix + $wix | Out-File -FilePath $env:GITHUB_PATH -Append -Encoding utf8 + + # Packages of a tag are named by it (v1.0.0-rc1: SqlJam-1.0.0-rc1-...), of a manual run by its version input, + # others by the version of pom.xml. Pre-releases have no msi installer. - name: Package for download shell: bash + env: + INPUT_VERSION: ${{ github.event.inputs.version }} run: | - VERSION="" + VERSION="$INPUT_VERSION" case "$GITHUB_REF" in refs/tags/v*) VERSION="${GITHUB_REF_NAME#v}" ;; esac sh src/packaging/package.sh ${{ matrix.platform }} $VERSION @@ -131,6 +149,16 @@ jobs: with: path: artifacts + # The packages of every platform in one directory with their SHA-256 checksums, verified by downloaders with + # sha256sum -c SHA256SUMS.txt --ignore-missing (shasum -a 256 -c on macOS) + - name: Collect the packages and their checksums + run: | + mkdir release + find artifacts -type f \( -name 'SqlJam-*' -o -name 'sqljam_*.deb' \) -exec cp {} release/ \; + cd release + sha256sum * > SHA256SUMS.txt + cat SHA256SUMS.txt + - name: Create the release with the packages env: GH_TOKEN: ${{ github.token }} @@ -139,4 +167,4 @@ jobs: PRERELEASE="" case "$GITHUB_REF_NAME" in *-*) PRERELEASE="--prerelease" ;; esac gh release create "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --title "SqlJam $GITHUB_REF_NAME" \ - $PRERELEASE --generate-notes $(find artifacts -name 'SqlJam-*' -o -name 'sqljam_*.deb') + $PRERELEASE --generate-notes release/* diff --git a/docs/assets/login.png b/docs/assets/login.png index 21c6cb444f6f31129c724f41b4fc530978d82a80..7e629d0e10a8de98a3a749caf4f79dd07ee130e0 100644 GIT binary patch delta 20572 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 delta 20439 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 v{rYL>MHW5hFcYw`!13VPxO>yh1sL5#98(h onLogin) { } }); VBox.setVgrow(profileList, Priority.ALWAYS); - Button newButton = new Button(Messages.get("login.new"), Icons.of(Icons.ADD)); + // Icons of the list like DBeaver and DataGrip, the names are their tooltips; texts are never cut off + Button newButton = new Button(null, Icons.of(Icons.ADD)); newButton.setId("newButton"); + newButton.setTooltip(new Tooltip(Messages.get("login.new"))); + newButton.setAccessibleText(Messages.get("login.new")); newButton.setOnAction(event -> { profileList.getSelectionModel().clearSelection(); connectionForm.setProfile(new ConnectionProfile(), true); connectionForm.focusFirstField(); }); - Button deleteButton = new Button(Messages.get("login.delete"), Icons.of(Icons.DELETE)); + Button deleteButton = new Button(null, Icons.of(Icons.DELETE)); deleteButton.setId("deleteButton"); + deleteButton.setTooltip(new Tooltip(Messages.get("login.delete"))); + deleteButton.setAccessibleText(Messages.get("login.delete")); deleteButton.disableProperty().bind(profileList.getSelectionModel().selectedItemProperty().isNull()); deleteButton.setOnAction(event -> deleteSelected()); // The example database comes back after the user removed it @@ -111,6 +116,7 @@ public LoginView(AppContext context, Consumer onLogin) { .ifPresent(profileList.getSelectionModel()::select); })); HBox listButtons = new HBox(8, newButton, deleteButton, exampleButton); + listButtons.getChildren().forEach(button -> ((Button) button).setMinWidth(Region.USE_PREF_SIZE)); Label savedLabel = new Label(Messages.get("login.savedConnections")); savedLabel.getStyleClass().add("section-title"); VBox left = new VBox(10, savedLabel, searchField, profileList, listButtons); diff --git a/src/packaging/package.sh b/src/packaging/package.sh index 0001399..6678af4 100755 --- a/src/packaging/package.sh +++ b/src/packaging/package.sh @@ -8,7 +8,8 @@ # The version names the packages, e.g. 1.0.0-rc1 of the tag v1.0.0-rc1; the version of pom.xml by default. # # mac-aarch64, mac SqlJam.app in SqlJam--.dmg -# win SqlJam--win.zip, SqlJam\SqlJam.exe without installing +# win SqlJam--win.zip, SqlJam\SqlJam.exe without installing, and SqlJam--win.msi +# of releases (not of pre-releases like 1.0.0-rc1) when the WiX Toolset 3 is on the path # linux SqlJam--linux.tar.gz (SqlJam/bin/SqlJam) and sqljam__amd64.deb # every platform SqlJam---jar.zip, the runnable jar with its launch scripts (Java 17+) # @@ -103,6 +104,28 @@ case "$PLATFORM" in win) rm -f "$OUT/SqlJam-$VERSION-win.zip" (cd "$WORK" && jar --create --no-manifest --file "$OUT/SqlJam-$VERSION-win.zip" SqlJam) + # An installer with a directory chooser, Start menu and desktop shortcuts. The upgrade code is the same + # for every version, a newer version replaces the installed one. Versions of msi are numbers only, a + # pre-release (1.0.0-rc1, 1.0.0-SNAPSHOT) would be the same version as its release and would not be + # replaced by it, pre-releases have the zip only. + case "$VERSION" in + *-*) + echo "Pre-release $VERSION, the msi installer is skipped" >&2 + ;; + *) + if command -v candle >/dev/null 2>&1 || command -v candle.exe >/dev/null 2>&1; then + jpackage --type msi --dest "$WORK" --app-image "$WORK/SqlJam" --name SqlJam \ + --app-version "$APP_VERSION" --vendor "Fred Feng" \ + --description "Import and export tool for relational and OLAP databases" \ + --win-dir-chooser --win-menu --win-menu-group SqlJam --win-shortcut \ + --win-upgrade-uuid 494b38a3-8f4d-457f-bd03-4b48948608e5 + rm -f "$OUT/SqlJam-$VERSION-win.msi" + mv "$WORK"/SqlJam-*.msi "$OUT/SqlJam-$VERSION-win.msi" + else + echo "WiX Toolset 3 not found, the msi installer is skipped" >&2 + fi + ;; + esac ;; linux) rm -f "$OUT/SqlJam-$VERSION-linux.tar.gz"