Files
itsmemac--Packwright/.github/workflows/release.yml
T
Mac 0e0d51920a Packwright 1.0.0
A cross-platform (Windows, Linux, macOS) manager for PS5 dumps, images and
packages, grown out of PS5 PKG Tool by pearlxcore (GPL-3.0).

- Library of dumps, packages and images (cards or list), search language,
  grouping, saved views, health report and export (CSV, JSON, web page)
- Edit and autofill details (including region, IDs, versions, features and
  icon), in the library or written into the file; optional Title ID lookup
- Convert, build, extract, verify, repair and edit exFAT, FFPKG, FFPFSC and
  ZArchive images and debug packages, with presets
- Send to console over FTP or by URL on the local network
- Command-line mode
- Installers for Windows, macOS and Linux, and an opt-in update check

See README.md and THIRD_PARTY_NOTICES.md for credits, licenses and the list
of changes made to the original project.
2026-10-02 01:36:32 +05:30

223 lines
9.9 KiB
YAML

name: Release
# Every push to main builds the app for Windows, Linux and macOS and publishes (or refreshes) a GitHub
# release named after the <Version> in src/Packwright.App/Packwright.App.csproj. To cut a new
# release, bump that version and push.
on:
push:
branches: [main]
paths-ignore:
- '**.md'
- 'LICENSE'
workflow_dispatch:
permissions:
contents: write
concurrency:
group: release
cancel-in-progress: false
env:
PROJECT: src/Packwright.App/Packwright.App.csproj
APP: Packwright
jobs:
version:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.read.outputs.version }}
steps:
- uses: actions/checkout@v4
- id: read
run: |
version=$(sed -n 's:.*<Version>\(.*\)</Version>.*:\1:p' "$PROJECT" | head -n1)
if [ -z "$version" ]; then echo "No <Version> found in $PROJECT" >&2; exit 1; fi
echo "version=$version" >> "$GITHUB_OUTPUT"
build-linux:
needs: version
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x
- name: Publish
run: dotnet publish "$PROJECT" -c Release -r linux-x64 --self-contained true -o publish
- name: Add the licenses
run: |
cp LICENSE THIRD_PARTY_NOTICES.md publish/
mkdir -p publish/licenses
cp third-party/ProsperoPkgTool/LICENSE publish/licenses/ProsperoPkgTool-LICENSE
cp third-party/LibProsperoPkg12/LICENSE publish/licenses/LibProsperoPkg-LICENSE
cp third-party/LibProsperoPkg12/NOTICE publish/licenses/LibProsperoPkg-NOTICE
cp src/Packwright.Ufs2/LICENSE publish/licenses/UFS2Tool-LICENSE
cp third-party/licenses/* publish/licenses/
- name: Build the .deb and .rpm
run: |
sudo apt-get update -qq
sudo apt-get install -y -qq rpm
bash installer/linux/build-packages.sh "${{ needs.version.outputs.version }}" publish dist
- uses: actions/upload-artifact@v4
with:
name: release-linux-packages
path: dist/*
build-windows-installer:
needs: version
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x
- name: Publish
shell: bash
run: dotnet publish "$PROJECT" -c Release -r win-x64 --self-contained true -o publish
- name: Add the licenses
shell: bash
run: |
cp LICENSE THIRD_PARTY_NOTICES.md publish/
mkdir -p publish/licenses
cp third-party/ProsperoPkgTool/LICENSE publish/licenses/ProsperoPkgTool-LICENSE
cp third-party/LibProsperoPkg12/LICENSE publish/licenses/LibProsperoPkg-LICENSE
cp third-party/LibProsperoPkg12/NOTICE publish/licenses/LibProsperoPkg-NOTICE
cp src/Packwright.Ufs2/LICENSE publish/licenses/UFS2Tool-LICENSE
cp third-party/licenses/* publish/licenses/
- name: Install Inno Setup
run: choco install innosetup -y --no-progress
- name: Build the installer
shell: pwsh
run: |
New-Item -ItemType Directory -Force dist | Out-Null
$iscc = Join-Path ${env:ProgramFiles(x86)} 'Inno Setup 6\ISCC.exe'
& $iscc "/DAppVersion=${{ needs.version.outputs.version }}" "/DSourceDir=$env:GITHUB_WORKSPACE\publish" "/O$env:GITHUB_WORKSPACE\dist" installer\Packwright.iss
if ($LASTEXITCODE -ne 0) { throw "Inno Setup failed ($LASTEXITCODE)" }
- uses: actions/upload-artifact@v4
with:
name: release-windows-installer
path: dist/*.exe
build-macos:
needs: version
runs-on: macos-latest
strategy:
fail-fast: true
matrix:
include:
- { rid: osx-arm64, label: macos-arm64 }
- { rid: osx-x64, label: macos-x64 }
steps:
- uses: actions/checkout@v4
- uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x
- name: Publish
run: dotnet publish "$PROJECT" -c Release -r ${{ matrix.rid }} --self-contained true -o publish
- name: Create the app bundle
run: |
version="${{ needs.version.outputs.version }}"
bundle="Packwright.app"
mkdir -p "$bundle/Contents/MacOS" "$bundle/Contents/Resources"
cp -R publish/. "$bundle/Contents/MacOS/"
chmod +x "$bundle/Contents/MacOS/$APP"
cp LICENSE THIRD_PARTY_NOTICES.md "$bundle/Contents/Resources/"
mkdir -p "$bundle/Contents/Resources/licenses"
cp third-party/ProsperoPkgTool/LICENSE "$bundle/Contents/Resources/licenses/ProsperoPkgTool-LICENSE"
cp src/Packwright.Ufs2/LICENSE "$bundle/Contents/Resources/licenses/UFS2Tool-LICENSE"
cp third-party/licenses/* "$bundle/Contents/Resources/licenses/"
# Icon: build an .icns from the PNG
iconset=icon.iconset
mkdir "$iconset"
for size in 16 32 128 256 512; do
double=$((size * 2))
sips -z $size $size src/Packwright.App/Assets/icon.png --out "$iconset/icon_${size}x${size}.png" > /dev/null
sips -z $double $double src/Packwright.App/Assets/icon.png --out "$iconset/icon_${size}x${size}@2x.png" > /dev/null
done
iconutil -c icns "$iconset" -o "$bundle/Contents/Resources/icon.icns"
cat > "$bundle/Contents/Info.plist" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key><string>Packwright</string>
<key>CFBundleDisplayName</key><string>Packwright</string>
<key>CFBundleIdentifier</key><string>io.github.itsmemac.packwright</string>
<key>CFBundleVersion</key><string>${version}</string>
<key>CFBundleShortVersionString</key><string>${version}</string>
<key>CFBundleExecutable</key><string>${APP}</string>
<key>CFBundleIconFile</key><string>icon</string>
<key>CFBundlePackageType</key><string>APPL</string>
<key>LSMinimumSystemVersion</key><string>13.0</string>
<key>NSHighResolutionCapable</key><true/>
</dict>
</plist>
PLIST
- name: Sign ad hoc
# Apple Silicon refuses to start unsigned code. An ad-hoc signature is enough to run locally;
# the app is not notarized, so the first launch still needs right click, then Open.
run: codesign --force --deep --sign - "Packwright.app"
- name: Build the disk image
# The disk image holds the app and a shortcut to Applications: open it and drag the app across.
run: |
mkdir dist dmgroot
name="$APP-v${{ needs.version.outputs.version }}-${{ matrix.label }}"
ditto "Packwright.app" "dmgroot/Packwright.app"
ln -s /Applications dmgroot/Applications
hdiutil create -volname "Packwright" -srcfolder dmgroot -ov -format UDZO "dist/$name.dmg"
- uses: actions/upload-artifact@v4
with:
name: release-${{ matrix.label }}
path: dist/*
release:
needs: [version, build-linux, build-windows-installer, build-macos]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
pattern: release-*
merge-multiple: true
path: dist
- name: Checksums and notes
run: |
version="${{ needs.version.outputs.version }}"
(cd dist && sha256sum * > SHA256SUMS.txt)
cat > notes.md <<NOTES
## Packwright v${version}
Pick the installer for your system. Everything is self-contained, nothing else needs to be installed.
| System | Download |
| --- | --- |
| Windows 10/11 (64-bit) | \`$APP-Setup-v${version}-windows-x64.exe\` |
| macOS, Apple silicon | \`$APP-v${version}-macos-arm64.dmg\` |
| macOS, Intel | \`$APP-v${version}-macos-x64.dmg\` |
| Linux (64-bit), Debian, Ubuntu, Mint | \`$APP-v${version}-linux-x64.deb\` |
| Linux (64-bit), Fedora, openSUSE, RHEL | \`$APP-v${version}-linux-x64.rpm\` |
- **Windows:** run the installer. It installs for you without administrator rights, adds an uninstaller (Settings, Apps) and lets Packwright update itself. Windows may warn that the publisher is unknown because it is not code-signed.
- **macOS:** open the disk image and drag **Packwright** onto **Applications**. The app is not notarized, so the first time you open it go to **System Settings, Privacy & Security** and click **Open Anyway** (step by step in the README under *macOS help*). To uninstall, delete it from Applications.
- **Linux:** install with your software installer, or \`sudo apt install ./<file>.deb\` / \`sudo dnf install ./<file>.rpm\`. It adds a menu entry and a \`packwright\` command, and is removed with your package manager.
Verify a download with \`SHA256SUMS.txt\`.
**License and source:** GPL-3.0, with no warranty. Packwright grew out of PS5 PKG Tool by pearlxcore (GPL-3.0), whose engines still power parts of it; the changes and every bundled component are listed in THIRD_PARTY_NOTICES.md, and the license texts are in the \`licenses\` folder of the installed app. The source for this release is the \`v${version}\` tag of this repository.
NOTES
- name: Publish the release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
tag="v${{ needs.version.outputs.version }}"
# Replace an earlier release of the same version so the tag points at this build.
gh release delete "$tag" --cleanup-tag --yes 2>/dev/null || true
gh release create "$tag" dist/* \
--target "$GITHUB_SHA" \
--title "Packwright $tag" \
--notes-file notes.md \
--latest