mirror of
https://github.com/fromchat-messenger/app.git
synced 2026-09-22 19:15:05 +03:00
Simplify release CI: build only, inline workflow steps.
Remove test/smoke jobs and ci-*.sh scripts; embed compile, packaging, and version setup directly in release.yml. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -11,4 +11,14 @@ runs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Set version
|
- name: Set version
|
||||||
shell: bash
|
shell: bash
|
||||||
run: bash scripts/ci-set-version.sh "${{ inputs.version }}"
|
run: |
|
||||||
|
VERSION="${{ inputs.version }}"
|
||||||
|
VERSION_CODE="$(printf '%s' "$VERSION" | sed 's/[^0-9]//g')"
|
||||||
|
if [[ -z "$VERSION_CODE" ]]; then
|
||||||
|
VERSION_CODE=1
|
||||||
|
fi
|
||||||
|
GRADLE_FILE="build.gradle.kts"
|
||||||
|
sed -i.bak "s/extra\\[\"versionName\"\\] = \"[^\"]*\"/extra[\"versionName\"] = \"$VERSION\"/" "$GRADLE_FILE"
|
||||||
|
sed -i.bak "s/extra\\[\"versionCode\"\\] = [0-9]*/extra[\"versionCode\"] = $VERSION_CODE/" "$GRADLE_FILE"
|
||||||
|
rm -f "$GRADLE_FILE.bak"
|
||||||
|
echo "versionName=$VERSION versionCode=$VERSION_CODE"
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
targets: x86_64-pc-windows-msvc
|
targets: x86_64-pc-windows-msvc
|
||||||
- uses: ./.github/actions/cache-cargo-windows
|
- uses: ./.github/actions/cache-cargo-windows
|
||||||
- name: Set version
|
- id: ver
|
||||||
|
name: Resolve version
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||||||
@@ -37,7 +38,10 @@ jobs:
|
|||||||
else
|
else
|
||||||
V="${GITHUB_REF_NAME#win-x64-}"
|
V="${GITHUB_REF_NAME#win-x64-}"
|
||||||
fi
|
fi
|
||||||
bash scripts/ci-set-version.sh "$V"
|
echo "version=$V" >> "$GITHUB_OUTPUT"
|
||||||
|
- uses: ./.github/actions/set-version
|
||||||
|
with:
|
||||||
|
version: ${{ steps.ver.outputs.version }}
|
||||||
- name: Package Windows x64 installer
|
- name: Package Windows x64 installer
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
name: Release smoke
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- ".github/workflows/release.yml"
|
|
||||||
- ".github/workflows/release-smoke.yml"
|
|
||||||
- ".github/actions/**"
|
|
||||||
- "scripts/ci-*.sh"
|
|
||||||
- "app/desktop/build.gradle.kts"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: release-smoke-${{ github.ref }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
env:
|
|
||||||
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test-compile:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 30
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: ./.github/actions/setup-java-gradle
|
|
||||||
- run: bash scripts/ci-test-compile.sh
|
|
||||||
|
|
||||||
test-rust:
|
|
||||||
runs-on: windows-latest
|
|
||||||
timeout-minutes: 25
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
with:
|
|
||||||
targets: x86_64-pc-windows-msvc
|
|
||||||
- uses: ./.github/actions/cache-cargo-windows
|
|
||||||
- name: Test Windows installer Rust workspace
|
|
||||||
shell: bash
|
|
||||||
working-directory: app/desktop/windows-setup
|
|
||||||
run: cargo test --workspace --release
|
|
||||||
|
|
||||||
verify-script:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Syntax-check CI scripts
|
|
||||||
run: |
|
|
||||||
set -euo pipefail
|
|
||||||
for script in scripts/ci-*.sh; do
|
|
||||||
bash -n "$script"
|
|
||||||
echo "OK $script"
|
|
||||||
done
|
|
||||||
- name: Dry-run asset verification patterns
|
|
||||||
run: |
|
|
||||||
V="9.9.9"
|
|
||||||
bash scripts/ci-create-smoke-fixtures.sh /tmp/release-assets "$V"
|
|
||||||
sudo apt-get update && sudo apt-get install -y rpm file unzip
|
|
||||||
CI_SMOKE=1 bash scripts/ci-verify-release-assets.sh "$V" /tmp/release-assets
|
|
||||||
@@ -11,7 +11,7 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
skip_publish:
|
skip_publish:
|
||||||
description: "Build and verify only; skip GitHub Release upload"
|
description: "Build only; skip GitHub Release upload"
|
||||||
required: false
|
required: false
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
@@ -45,36 +45,8 @@ jobs:
|
|||||||
echo "version=$V" >> "$GITHUB_OUTPUT"
|
echo "version=$V" >> "$GITHUB_OUTPUT"
|
||||||
echo "tag=v$V" >> "$GITHUB_OUTPUT"
|
echo "tag=v$V" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
test-compile:
|
|
||||||
needs: resolve-version
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 30
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: ./.github/actions/setup-java-gradle
|
|
||||||
- uses: ./.github/actions/set-version
|
|
||||||
with:
|
|
||||||
version: ${{ needs.resolve-version.outputs.version }}
|
|
||||||
- name: Compile JVM release sources
|
|
||||||
run: bash scripts/ci-test-compile.sh
|
|
||||||
|
|
||||||
test-rust:
|
|
||||||
needs: resolve-version
|
|
||||||
runs-on: windows-latest
|
|
||||||
timeout-minutes: 25
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
|
||||||
with:
|
|
||||||
targets: x86_64-pc-windows-msvc
|
|
||||||
- uses: ./.github/actions/cache-cargo-windows
|
|
||||||
- name: Test Windows installer Rust workspace
|
|
||||||
shell: bash
|
|
||||||
working-directory: app/desktop/windows-setup
|
|
||||||
run: cargo test --workspace --release
|
|
||||||
|
|
||||||
windows-common:
|
windows-common:
|
||||||
needs: [resolve-version, test-compile, test-rust]
|
needs: resolve-version
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
timeout-minutes: 45
|
timeout-minutes: 45
|
||||||
steps:
|
steps:
|
||||||
@@ -87,7 +59,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
targets: x86_64-pc-windows-msvc
|
targets: x86_64-pc-windows-msvc
|
||||||
- uses: ./.github/actions/cache-cargo-windows
|
- uses: ./.github/actions/cache-cargo-windows
|
||||||
- name: Build arch-independent Windows tooling and JVM artifacts
|
- name: Build arch-independent Windows tooling and compile JVM
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
export FROMCHAT_PACKAGING_JDK="$JAVA_HOME"
|
export FROMCHAT_PACKAGING_JDK="$JAVA_HOME"
|
||||||
@@ -115,17 +87,13 @@ jobs:
|
|||||||
include:
|
include:
|
||||||
- arch: x64
|
- arch: x64
|
||||||
runner: windows-latest
|
runner: windows-latest
|
||||||
java-architecture: ""
|
|
||||||
- arch: arm64
|
- arch: arm64
|
||||||
runner: windows-11-arm
|
runner: windows-11-arm
|
||||||
java-architecture: ""
|
|
||||||
runs-on: ${{ matrix.runner }}
|
runs-on: ${{ matrix.runner }}
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: ./.github/actions/setup-java-gradle
|
- uses: ./.github/actions/setup-java-gradle
|
||||||
with:
|
|
||||||
java-architecture: ${{ matrix.java-architecture }}
|
|
||||||
- uses: ./.github/actions/set-version
|
- uses: ./.github/actions/set-version
|
||||||
with:
|
with:
|
||||||
version: ${{ needs.resolve-version.outputs.version }}
|
version: ${{ needs.resolve-version.outputs.version }}
|
||||||
@@ -140,16 +108,30 @@ jobs:
|
|||||||
path: app/desktop/windows-setup/target/release
|
path: app/desktop/windows-setup/target/release
|
||||||
- name: Package Windows ${{ matrix.arch }} installer
|
- name: Package Windows ${{ matrix.arch }} installer
|
||||||
shell: bash
|
shell: bash
|
||||||
run: bash scripts/ci-package-windows-release.sh "${{ matrix.arch }}"
|
env:
|
||||||
- name: Upload Windows ${{ matrix.arch }} installer
|
FROMCHAT_SKIP_RUST_BUILD: "1"
|
||||||
uses: actions/upload-artifact@v4
|
run: |
|
||||||
|
export FROMCHAT_PACKAGING_JDK="$JAVA_HOME"
|
||||||
|
args=(
|
||||||
|
:app:desktop:createReleaseDistributable
|
||||||
|
:app:desktop:patchWindowsJpackageReleaseIcon
|
||||||
|
:app:desktop:packSetupOnly
|
||||||
|
"-PdesktopArch=${{ matrix.arch }}"
|
||||||
|
--no-daemon
|
||||||
|
--console=plain
|
||||||
|
)
|
||||||
|
if [ "${{ matrix.arch }}" = "arm64" ]; then
|
||||||
|
args+=("-PwindowsArm64")
|
||||||
|
fi
|
||||||
|
./gradlew "${args[@]}"
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: windows-${{ matrix.arch }}
|
name: windows-${{ matrix.arch }}
|
||||||
path: app/desktop/build/distributions/release/*-windows-${{ matrix.arch }}.exe
|
path: app/desktop/build/distributions/release/*-windows-${{ matrix.arch }}.exe
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
macos:
|
macos:
|
||||||
needs: [resolve-version, test-compile, test-rust]
|
needs: resolve-version
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -177,7 +159,15 @@ jobs:
|
|||||||
key: dmg-tools-${{ hashFiles('app/desktop/dmg-background/package-lock.json') }}
|
key: dmg-tools-${{ hashFiles('app/desktop/dmg-background/package-lock.json') }}
|
||||||
restore-keys: dmg-tools-
|
restore-keys: dmg-tools-
|
||||||
- name: Install macOS packaging tools
|
- name: Install macOS packaging tools
|
||||||
run: bash scripts/ci-install-macos-dmg.sh
|
run: |
|
||||||
|
if ! command -v create-dmg >/dev/null 2>&1; then
|
||||||
|
brew install create-dmg
|
||||||
|
fi
|
||||||
|
DMG_DIR="app/desktop/dmg-background"
|
||||||
|
if [[ ! -f "$DMG_DIR/node_modules/playwright/package.json" ]]; then
|
||||||
|
npm --prefix "$DMG_DIR" install --no-fund --no-audit
|
||||||
|
npm --prefix "$DMG_DIR" exec playwright install chromium
|
||||||
|
fi
|
||||||
- name: Package macOS ${{ matrix.arch }}
|
- name: Package macOS ${{ matrix.arch }}
|
||||||
run: |
|
run: |
|
||||||
export FROMCHAT_PACKAGING_JDK="$JAVA_HOME"
|
export FROMCHAT_PACKAGING_JDK="$JAVA_HOME"
|
||||||
@@ -189,15 +179,17 @@ jobs:
|
|||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
linux:
|
linux:
|
||||||
needs: [resolve-version, test-compile, test-rust]
|
needs: resolve-version
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- arch: x64
|
- arch: x64
|
||||||
runner: ubuntu-latest
|
runner: ubuntu-latest
|
||||||
|
appimage: appimagetool-x86_64.AppImage
|
||||||
- arch: arm64
|
- arch: arm64
|
||||||
runner: ubuntu-24.04-arm
|
runner: ubuntu-24.04-arm
|
||||||
|
appimage: appimagetool-aarch64.AppImage
|
||||||
runs-on: ${{ matrix.runner }}
|
runs-on: ${{ matrix.runner }}
|
||||||
timeout-minutes: 75
|
timeout-minutes: 75
|
||||||
steps:
|
steps:
|
||||||
@@ -207,7 +199,17 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
version: ${{ needs.resolve-version.outputs.version }}
|
version: ${{ needs.resolve-version.outputs.version }}
|
||||||
- name: Install Linux packaging tools
|
- name: Install Linux packaging tools
|
||||||
run: bash scripts/ci-install-linux-packaging.sh "${{ matrix.arch }}"
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y fakeroot rpm binutils libfuse2 wget
|
||||||
|
CACHE_DIR="${RUNNER_TOOL_CACHE}/appimagetool"
|
||||||
|
mkdir -p "$CACHE_DIR"
|
||||||
|
TOOL="$CACHE_DIR/appimagetool-${{ matrix.arch }}.AppImage"
|
||||||
|
if [[ ! -f "$TOOL" ]]; then
|
||||||
|
wget -q "https://github.com/AppImage/appimagetool/releases/download/continuous/${{ matrix.appimage }}" -O "$TOOL"
|
||||||
|
chmod +x "$TOOL"
|
||||||
|
fi
|
||||||
|
echo "APPIMAGETOOL=$TOOL" >> "$GITHUB_ENV"
|
||||||
- name: Package Linux ${{ matrix.arch }}
|
- name: Package Linux ${{ matrix.arch }}
|
||||||
run: |
|
run: |
|
||||||
export FROMCHAT_PACKAGING_JDK="$JAVA_HOME"
|
export FROMCHAT_PACKAGING_JDK="$JAVA_HOME"
|
||||||
@@ -222,7 +224,7 @@ jobs:
|
|||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
android:
|
android:
|
||||||
needs: [resolve-version, test-compile, test-rust]
|
needs: resolve-version
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 60
|
timeout-minutes: 60
|
||||||
steps:
|
steps:
|
||||||
@@ -278,7 +280,8 @@ EOF
|
|||||||
path: release-staging/*.apk
|
path: release-staging/*.apk
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
verify:
|
publish:
|
||||||
|
if: ${{ github.event_name != 'workflow_dispatch' || inputs.skip_publish == false }}
|
||||||
needs:
|
needs:
|
||||||
- resolve-version
|
- resolve-version
|
||||||
- windows-package
|
- windows-package
|
||||||
@@ -286,10 +289,9 @@ EOF
|
|||||||
- linux
|
- linux
|
||||||
- android
|
- android
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Install verification tools
|
|
||||||
run: sudo apt-get update && sudo apt-get install -y rpm file unzip
|
|
||||||
- uses: actions/download-artifact@v4
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
path: artifacts
|
path: artifacts
|
||||||
@@ -305,27 +307,25 @@ EOF
|
|||||||
-name '*.apk' \
|
-name '*.apk' \
|
||||||
\) -exec cp {} release-assets/ \;
|
\) -exec cp {} release-assets/ \;
|
||||||
ls -la release-assets
|
ls -la release-assets
|
||||||
- name: Verify release assets
|
VERSION="${{ needs.resolve-version.outputs.version }}"
|
||||||
run: bash scripts/ci-verify-release-assets.sh "${{ needs.resolve-version.outputs.version }}" release-assets
|
for pattern in \
|
||||||
- uses: actions/upload-artifact@v4
|
"*-windows-x64.exe" \
|
||||||
with:
|
"*-windows-arm64.exe" \
|
||||||
name: release-assets
|
"*-macOS-x64.dmg" \
|
||||||
path: release-assets/*
|
"*-macOS-arm64.dmg" \
|
||||||
if-no-files-found: error
|
"*-linux-x64.deb" \
|
||||||
|
"*-linux-arm64.deb" \
|
||||||
publish:
|
"*-linux-x64.rpm" \
|
||||||
if: ${{ github.event_name != 'workflow_dispatch' || inputs.skip_publish == false }}
|
"*-linux-arm64.rpm" \
|
||||||
needs:
|
"*-linux-x64.AppImage" \
|
||||||
- resolve-version
|
"*-linux-arm64.AppImage" \
|
||||||
- verify
|
"*-android-universal.apk"
|
||||||
runs-on: ubuntu-latest
|
do
|
||||||
permissions:
|
if ! compgen -G "release-assets/$pattern" > /dev/null; then
|
||||||
contents: write
|
echo "Missing release asset: $pattern" >&2
|
||||||
steps:
|
exit 1
|
||||||
- uses: actions/download-artifact@v4
|
fi
|
||||||
with:
|
done
|
||||||
name: release-assets
|
|
||||||
path: release-assets
|
|
||||||
- name: Publish GitHub Release
|
- name: Publish GitHub Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
ASSETS_DIR="${1:?usage: ci-create-smoke-fixtures.sh <assets-dir>}"
|
|
||||||
VERSION="${2:?usage: ci-create-smoke-fixtures.sh <assets-dir> <version>}"
|
|
||||||
|
|
||||||
mkdir -p "$ASSETS_DIR"
|
|
||||||
|
|
||||||
for name in \
|
|
||||||
"FromChat-Setup-${VERSION}-windows-x64.exe" \
|
|
||||||
"FromChat-Setup-${VERSION}-windows-arm64.exe" \
|
|
||||||
"FromChat-${VERSION}-macOS-x64.dmg" \
|
|
||||||
"FromChat-${VERSION}-macOS-arm64.dmg" \
|
|
||||||
"FromChat-${VERSION}-linux-x64.deb" \
|
|
||||||
"FromChat-${VERSION}-linux-arm64.deb" \
|
|
||||||
"FromChat-${VERSION}-linux-x64.rpm" \
|
|
||||||
"FromChat-${VERSION}-linux-arm64.rpm" \
|
|
||||||
"FromChat-${VERSION}-linux-x64.AppImage" \
|
|
||||||
"FromChat-${VERSION}-linux-arm64.AppImage" \
|
|
||||||
"FromChat-${VERSION}-android-universal.apk"
|
|
||||||
do
|
|
||||||
echo "placeholder" > "$ASSETS_DIR/$name"
|
|
||||||
done
|
|
||||||
|
|
||||||
python3 - "$ASSETS_DIR" <<'PY'
|
|
||||||
import struct
|
|
||||||
import pathlib
|
|
||||||
import sys
|
|
||||||
import zipfile
|
|
||||||
|
|
||||||
root = pathlib.Path(sys.argv[1])
|
|
||||||
for name, machine in [
|
|
||||||
("FromChat-Setup-9.9.9-windows-x64.exe", 0x8664),
|
|
||||||
("FromChat-Setup-9.9.9-windows-arm64.exe", 0xAA64),
|
|
||||||
]:
|
|
||||||
path = root / name
|
|
||||||
data = bytearray(0x80)
|
|
||||||
struct.pack_into("<I", data, 0x3C, 0x40)
|
|
||||||
struct.pack_into("<H", data, 0x44, machine)
|
|
||||||
path.write_bytes(data)
|
|
||||||
apk = root / "FromChat-9.9.9-android-universal.apk"
|
|
||||||
with zipfile.ZipFile(apk, "w") as zf:
|
|
||||||
zf.writestr("lib/arm64-v8a/libdummy.so", b"\x00")
|
|
||||||
zf.writestr("lib/x86_64/libdummy.so", b"\x00")
|
|
||||||
for deb in root.glob("*.deb"):
|
|
||||||
deb.write_bytes(b"!<arch>\n")
|
|
||||||
for rpm in root.glob("*.rpm"):
|
|
||||||
rpm.write_bytes(b"\xed\xab\xee\xdb" + b"\x00" * 96)
|
|
||||||
for appimage in root.glob("*.AppImage"):
|
|
||||||
appimage.write_bytes(b"\x7fELF" + b"\x00" * 16)
|
|
||||||
for dmg in root.glob("*.dmg"):
|
|
||||||
dmg.write_bytes(b"UDIF" + b"\x00" * 32)
|
|
||||||
PY
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
ARCH="${1:?usage: ci-install-linux-packaging.sh <x64|arm64>}"
|
|
||||||
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y fakeroot rpm binutils libfuse2 wget file
|
|
||||||
|
|
||||||
case "$ARCH" in
|
|
||||||
x64)
|
|
||||||
TOOL_URL="https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
|
|
||||||
;;
|
|
||||||
arm64)
|
|
||||||
TOOL_URL="https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-aarch64.AppImage"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Unsupported arch: $ARCH" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
CACHE_DIR="${RUNNER_TOOL_CACHE:-/opt/hostedtoolcache}/appimagetool"
|
|
||||||
mkdir -p "$CACHE_DIR"
|
|
||||||
TOOL="$CACHE_DIR/appimagetool-${ARCH}.AppImage"
|
|
||||||
if [[ ! -f "$TOOL" ]]; then
|
|
||||||
wget -q "$TOOL_URL" -O "$TOOL"
|
|
||||||
chmod +x "$TOOL"
|
|
||||||
fi
|
|
||||||
echo "APPIMAGETOOL=$TOOL" >> "$GITHUB_ENV"
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
if ! command -v create-dmg >/dev/null 2>&1; then
|
|
||||||
brew install create-dmg
|
|
||||||
fi
|
|
||||||
|
|
||||||
DMG_DIR="app/desktop/dmg-background"
|
|
||||||
if [[ ! -f "$DMG_DIR/node_modules/playwright/package.json" ]]; then
|
|
||||||
npm --prefix "$DMG_DIR" install --no-fund --no-audit
|
|
||||||
npm --prefix "$DMG_DIR" exec playwright install chromium
|
|
||||||
fi
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
ARCH="${1:?usage: ci-package-windows-release.sh <x64|arm64>}"
|
|
||||||
|
|
||||||
export FROMCHAT_PACKAGING_JDK="${JAVA_HOME}"
|
|
||||||
export FROMCHAT_SKIP_RUST_BUILD=1
|
|
||||||
|
|
||||||
GRADLE_ARGS=(
|
|
||||||
:app:desktop:createReleaseDistributable
|
|
||||||
:app:desktop:patchWindowsJpackageReleaseIcon
|
|
||||||
:app:desktop:packSetupOnly
|
|
||||||
"-PdesktopArch=$ARCH"
|
|
||||||
--no-daemon
|
|
||||||
--console=plain
|
|
||||||
)
|
|
||||||
|
|
||||||
if [[ "$ARCH" == "arm64" ]]; then
|
|
||||||
GRADLE_ARGS+=("-PwindowsArm64")
|
|
||||||
fi
|
|
||||||
|
|
||||||
./gradlew "${GRADLE_ARGS[@]}"
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
VERSION="${1:?usage: ci-set-version.sh <version>}"
|
|
||||||
VERSION_CODE="$(printf '%s' "$VERSION" | sed 's/[^0-9]//g')"
|
|
||||||
if [[ -z "$VERSION_CODE" ]]; then
|
|
||||||
VERSION_CODE=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
||||||
GRADLE_FILE="$ROOT/build.gradle.kts"
|
|
||||||
|
|
||||||
sed -i.bak "s/extra\\[\"versionName\"\\] = \"[^\"]*\"/extra[\"versionName\"] = \"$VERSION\"/" "$GRADLE_FILE"
|
|
||||||
sed -i.bak "s/extra\\[\"versionCode\"\\] = [0-9]*/extra[\"versionCode\"] = $VERSION_CODE/" "$GRADLE_FILE"
|
|
||||||
rm -f "$GRADLE_FILE.bak"
|
|
||||||
|
|
||||||
echo "versionName=$VERSION versionCode=$VERSION_CODE"
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
./gradlew \
|
|
||||||
:app:shared:compileKotlinJvm \
|
|
||||||
:utils:shared:compileKotlinJvm \
|
|
||||||
:app:desktop:compileKotlin \
|
|
||||||
--no-daemon \
|
|
||||||
--console=plain
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
VERSION="${1:?usage: ci-verify-release-assets.sh <version> <assets-dir>}"
|
|
||||||
ASSETS_DIR="${2:?usage: ci-verify-release-assets.sh <version> <assets-dir>}"
|
|
||||||
|
|
||||||
if [[ ! -d "$ASSETS_DIR" ]]; then
|
|
||||||
echo "Assets directory not found: $ASSETS_DIR" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
mapfile -t FILES < <(find "$ASSETS_DIR" -maxdepth 1 -type f | sort)
|
|
||||||
if [[ "${#FILES[@]}" -eq 0 ]]; then
|
|
||||||
echo "No release assets in $ASSETS_DIR" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
require_file() {
|
|
||||||
local pattern="$1"
|
|
||||||
shopt -s nullglob
|
|
||||||
local matches=("$ASSETS_DIR"/$pattern)
|
|
||||||
shopt -u nullglob
|
|
||||||
if [[ "${#matches[@]}" -eq 0 ]]; then
|
|
||||||
echo "Missing asset matching: $pattern" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
for file in "${matches[@]}"; do
|
|
||||||
if [[ ! -s "$file" ]]; then
|
|
||||||
echo "Empty asset: $file" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "OK $file ($(wc -c <"$file") bytes)"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
pe_machine() {
|
|
||||||
python3 - "$1" <<'PY'
|
|
||||||
import struct, sys
|
|
||||||
path = sys.argv[1]
|
|
||||||
with open(path, "rb") as f:
|
|
||||||
data = f.read(0x80)
|
|
||||||
pe_off = struct.unpack_from("<I", data, 0x3C)[0]
|
|
||||||
machine = struct.unpack_from("<H", data, pe_off + 4)[0]
|
|
||||||
print(machine)
|
|
||||||
PY
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_pe() {
|
|
||||||
local file="$1"
|
|
||||||
local expected="$2"
|
|
||||||
local actual
|
|
||||||
actual="$(pe_machine "$file")"
|
|
||||||
if [[ "$actual" != "$expected" ]]; then
|
|
||||||
echo "PE machine mismatch for $file: got 0x$(printf '%x' "$actual"), want 0x$(printf '%x' "$expected")" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "OK PE arch $file"
|
|
||||||
}
|
|
||||||
|
|
||||||
require_file "FromChat-Setup-${VERSION}-windows-x64.exe"
|
|
||||||
require_file "FromChat-Setup-${VERSION}-windows-arm64.exe"
|
|
||||||
require_file "FromChat-${VERSION}-macOS-x64.dmg"
|
|
||||||
require_file "FromChat-${VERSION}-macOS-arm64.dmg"
|
|
||||||
require_file "FromChat-${VERSION}-linux-x64.deb"
|
|
||||||
require_file "FromChat-${VERSION}-linux-arm64.deb"
|
|
||||||
require_file "FromChat-${VERSION}-linux-x64.rpm"
|
|
||||||
require_file "FromChat-${VERSION}-linux-arm64.rpm"
|
|
||||||
require_file "FromChat-${VERSION}-linux-x64.AppImage"
|
|
||||||
require_file "FromChat-${VERSION}-linux-arm64.AppImage"
|
|
||||||
require_file "FromChat-${VERSION}-android-universal.apk"
|
|
||||||
|
|
||||||
shopt -s nullglob
|
|
||||||
for exe in "$ASSETS_DIR"/FromChat-Setup-"${VERSION}"-windows-x64.exe; do
|
|
||||||
assert_pe "$exe" 34404
|
|
||||||
done
|
|
||||||
for exe in "$ASSETS_DIR"/FromChat-Setup-"${VERSION}"-windows-arm64.exe; do
|
|
||||||
assert_pe "$exe" 43620
|
|
||||||
done
|
|
||||||
shopt -u nullglob
|
|
||||||
|
|
||||||
for dmg in "$ASSETS_DIR"/*.dmg; do
|
|
||||||
if [[ "${CI_SMOKE:-}" == "1" ]]; then
|
|
||||||
echo "OK DMG (smoke) $dmg"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if command -v hdiutil >/dev/null 2>&1; then
|
|
||||||
hdiutil verify "$dmg" >/dev/null
|
|
||||||
elif ! file "$dmg" | grep -qiE 'zlib compressed data|bzip2 compressed data|Apple Disk Image|UDIF'; then
|
|
||||||
echo "DMG does not look valid: $dmg" >&2
|
|
||||||
file "$dmg" || true
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "OK DMG $dmg"
|
|
||||||
done
|
|
||||||
|
|
||||||
for deb in "$ASSETS_DIR"/*.deb; do
|
|
||||||
if [[ "${CI_SMOKE:-}" == "1" ]]; then
|
|
||||||
echo "OK deb (smoke) $deb"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if ! dpkg-deb -I "$deb" >/dev/null 2>&1; then
|
|
||||||
echo "Invalid .deb: $deb" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "OK deb $deb"
|
|
||||||
done
|
|
||||||
|
|
||||||
for rpm in "$ASSETS_DIR"/*.rpm; do
|
|
||||||
if [[ "${CI_SMOKE:-}" == "1" ]]; then
|
|
||||||
echo "OK rpm (smoke) $rpm"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if ! rpm -qp "$rpm" >/dev/null 2>&1; then
|
|
||||||
echo "Invalid .rpm: $rpm" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "OK rpm $rpm"
|
|
||||||
done
|
|
||||||
|
|
||||||
for appimage in "$ASSETS_DIR"/*.AppImage; do
|
|
||||||
if [[ "${CI_SMOKE:-}" == "1" ]]; then
|
|
||||||
echo "OK AppImage (smoke) $appimage"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if ! file "$appimage" | grep -qi 'ELF'; then
|
|
||||||
echo "AppImage is not ELF: $appimage" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
chmod +x "$appimage"
|
|
||||||
echo "OK AppImage $appimage"
|
|
||||||
done
|
|
||||||
|
|
||||||
APK="$(find "$ASSETS_DIR" -maxdepth 1 -name '*android-universal.apk' | head -n 1)"
|
|
||||||
if [[ "${CI_SMOKE:-}" == "1" ]]; then
|
|
||||||
echo "OK APK (smoke) $APK"
|
|
||||||
elif command -v unzip >/dev/null 2>&1; then
|
|
||||||
if ! unzip -t "$APK" >/dev/null 2>&1; then
|
|
||||||
echo "APK zip integrity failed: $APK" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
libs="$(unzip -l "$APK" 'lib/*/*.so' | awk '/\.so$/ {print $4}' || true)"
|
|
||||||
echo "$libs" | grep -q 'lib/arm64-v8a/' || { echo "APK missing arm64-v8a libs" >&2; exit 1; }
|
|
||||||
echo "$libs" | grep -q 'lib/x86_64/' || { echo "APK missing x86_64 libs" >&2; exit 1; }
|
|
||||||
echo "OK APK ABIs $APK"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "All release assets verified for v$VERSION"
|
|
||||||
Reference in New Issue
Block a user