Merge branch 'main' of https://git.azuze.fr/kawa/Motionity
Sync Gitea releases to GitHub / sync-releases (push) Canceled after 0s

This commit is contained in:
2026-08-13 12:47:42 +02:00
5 changed files with 142 additions and 29 deletions
+72
View File
@@ -0,0 +1,72 @@
name: Sync Gitea releases to GitHub
on:
push:
branches:
- main
workflow_dispatch: {}
env:
GITEA_URL: https://git.azuze.fr
GITEA_OWNER: kawa
GITEA_REPO: Motionity
jobs:
sync-releases:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Install jq
run: sudo apt-get update && sudo apt-get install -y jq
- name: Fetch Gitea releases and sync to GitHub
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
AUTH_HEADER=()
if [ -n "${GITEA_TOKEN:-}" ]; then
AUTH_HEADER=(-H "Authorization: token ${GITEA_TOKEN}")
fi
# Récupère toutes les releases Gitea (pagination simple, 50 max, ajuster si besoin)
releases=$(curl -sf "${AUTH_HEADER[@]}" \
"${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/${GITEA_REPO}/releases?limit=50")
echo "$releases" | jq -c '.[]' | while read -r release; do
tag=$(echo "$release" | jq -r '.tag_name')
name=$(echo "$release" | jq -r '.name // .tag_name')
body=$(echo "$release" | jq -r '.body // ""')
prerelease=$(echo "$release" | jq -r '.prerelease')
draft=$(echo "$release" | jq -r '.draft')
# Skip si la release existe déjà sur GitHub
if gh release view "$tag" >/dev/null 2>&1; then
echo "Release $tag existe déjà sur GitHub, on passe."
continue
fi
echo "Création de la release $tag sur GitHub..."
flags=()
[ "$prerelease" = "true" ] && flags+=(--prerelease)
[ "$draft" = "true" ] && flags+=(--draft)
# Le tag doit exister sur le repo GitHub ; s'il n'existe pas encore,
# on utilise --notes-file avec target par défaut (branche par défaut)
gh release create "$tag" \
--title "$name" \
--notes "$body" \
"${flags[@]}"
# Télécharge et attache les assets de la release Gitea
asset_count=$(echo "$release" | jq '.assets | length')
if [ "$asset_count" -gt 0 ]; then
tmpdir=$(mktemp -d)
echo "$release" | jq -c '.assets[]' | while read -r asset; do
asset_name=$(echo "$asset" | jq -r '.name')
asset_url=$(echo "$asset" | jq -r '.browser_download_url')
echo "Téléchargement de $asset_name..."
curl -sfL "${AUTH_HEADER[@]}" -o "${tmpdir}/${asset_name}" "$asset_url"
gh release upload "$tag" "${tmpdir}/${asset_name}" --clobber
done
rm -rf "$tmpdir"
fi
done
+1 -1
View File
@@ -1,5 +1,5 @@
# Motionity # Motionity
### Demo available here : [motionity.kawa.zip](https://motionity.kawa.zip/)
Web-based motion graphics editor with keyframing, masking, filters and text animations. Web-based motion graphics editor with keyframing, masking, filters and text animations.
This is a fork of the original [Motionity](https://github.com/alyssaxuu/motionity) by [@alyssaxuu](https://github.com/alyssaxuu), with bug fixes and enhancements. This is a fork of the original [Motionity](https://github.com/alyssaxuu/motionity) by [@alyssaxuu](https://github.com/alyssaxuu), with bug fixes and enhancements.
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "motionity", "name": "motionity",
"productName": "Motionity", "productName": "Motionity",
"version": "1.0.0", "version": "2.0.0",
"description": "Web-based motion graphics editor with keyframing, masking, filters and text animations", "description": "Web-based motion graphics editor with keyframing, masking, filters and text animations",
"license": "MIT", "license": "MIT",
"author": "Kawa", "author": "Kawa",
+35 -12
View File
@@ -36,14 +36,19 @@
./scripts/build-release.ps1 -Targets win -Tag v1.1.0 ./scripts/build-release.ps1 -Targets win -Tag v1.1.0
Windows installers only, named v1.1.0. Windows installers only, named v1.1.0.
.EXAMPLE
./scripts/build-release.ps1 -Targets win,linux-appimage
Windows installers plus the Linux AppImage — no Flatpak.
.EXAMPLE .EXAMPLE
./scripts/build-release.ps1 -SkipVendor -SkipDeps ./scripts/build-release.ps1 -SkipVendor -SkipDeps
Reuse src/vendor/ and node_modules as they are — the fast rebuild. Reuse src/vendor/ and node_modules as they are — the fast rebuild.
#> #>
[CmdletBinding()] [CmdletBinding()]
param( param(
# Platforms to package. "win" is NSIS + portable, "linux" is AppImage + Flatpak. # Platforms to package. "win" is NSIS + portable; "linux-appimage" and
[ValidateSet("win", "linux")] # "linux-flatpak" are the two Linux bundles, and "linux" is shorthand for both.
[ValidateSet("win", "linux", "linux-appimage", "linux-flatpak")]
[string[]]$Targets = @("win", "linux"), [string[]]$Targets = @("win", "linux"),
# Version used in the artifact names. Defaults to v<package.json version>, # Version used in the artifact names. Defaults to v<package.json version>,
@@ -64,11 +69,15 @@ param(
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
function Invoke-Checked { function Invoke-Checked {
param([Parameter(Mandatory)][string]$Exe, [Parameter(Mandatory)][string[]]$Args) # NB: the param is $CmdArgs, not $Args. $Args is an automatic variable in
Write-Host " > $Exe $($Args -join ' ')" -ForegroundColor DarkGray # PowerShell; a param of that name never binds the passed array (it stays the
& $Exe @Args # function's own empty $args), so `& $Exe @Args` would run the exe with no
# arguments — e.g. bare `npm`, which just prints usage and exits 1.
param([Parameter(Mandatory)][string]$Exe, [Parameter(Mandatory)][string[]]$CmdArgs)
Write-Host " > $Exe $($CmdArgs -join ' ')" -ForegroundColor DarkGray
& $Exe @CmdArgs
if ($LASTEXITCODE -ne 0) { if ($LASTEXITCODE -ne 0) {
throw "'$Exe $($Args -join ' ')' failed with exit code $LASTEXITCODE." throw "'$Exe $($CmdArgs -join ' ')' failed with exit code $LASTEXITCODE."
} }
} }
@@ -101,11 +110,20 @@ try {
Write-Host " output : $distDir" Write-Host " output : $distDir"
Write-Host "" Write-Host ""
# Expand "linux" to its two concrete bundles and drop duplicates, so the rest
# of the script only ever deals with win / linux-appimage / linux-flatpak.
$resolvedTargets = @()
foreach ($t in $Targets) {
if ($t -eq "linux") { $resolvedTargets += "linux-appimage", "linux-flatpak" }
else { $resolvedTargets += $t }
}
$resolvedTargets = @($resolvedTargets | Select-Object -Unique)
# electron-builder produces AppImage and Flatpak with Linux-only tooling # electron-builder produces AppImage and Flatpak with Linux-only tooling
# (appimagetool, flatpak-builder). Warned rather than blocked: the same script # (appimagetool, flatpak-builder). Warned rather than blocked: the same script
# runs under pwsh on a Linux box or in WSL, which is where that target belongs. # runs under pwsh on a Linux box or in WSL, which is where that target belongs.
if ($Targets -contains "linux" -and $env:OS -eq "Windows_NT") { if (($resolvedTargets -like "linux-*") -and $env:OS -eq "Windows_NT") {
Write-Warning "the linux target needs a Linux host or WSL — electron-builder cannot produce AppImage or Flatpak on Windows (PACKAGING.md has the WSL setup)." Write-Warning "the Linux targets need a Linux host or WSL — electron-builder cannot produce AppImage or Flatpak on Windows (PACKAGING.md has the WSL setup)."
} }
if ($Clean) { if ($Clean) {
@@ -161,7 +179,7 @@ try {
throw 'electron-builder not found in node_modules — run "npm ci" (or drop -SkipDeps).' throw 'electron-builder not found in node_modules — run "npm ci" (or drop -SkipDeps).'
} }
foreach ($target in $Targets) { foreach ($target in $resolvedTargets) {
Write-Host "Packaging $target..." -ForegroundColor Cyan Write-Host "Packaging $target..." -ForegroundColor Cyan
# --publish never: electron-builder otherwise tries to upload to whatever # --publish never: electron-builder otherwise tries to upload to whatever
@@ -175,10 +193,15 @@ try {
"-c.portable.artifactName=$(Get-ArtifactName "$prefix-win-x64-portable")" "-c.portable.artifactName=$(Get-ArtifactName "$prefix-win-x64-portable")"
) )
} }
"linux" { "linux-appimage" {
$builderArgs = @( $builderArgs = @(
"--linux", "AppImage", "flatpak", "--publish", "never", "--linux", "AppImage", "--publish", "never",
"-c.appImage.artifactName=$(Get-ArtifactName "$prefix-linux-x86_64")", "-c.appImage.artifactName=$(Get-ArtifactName "$prefix-linux-x86_64")"
)
}
"linux-flatpak" {
$builderArgs = @(
"--linux", "flatpak", "--publish", "never",
"-c.flatpak.artifactName=$(Get-ArtifactName "$prefix-linux-x86_64")" "-c.flatpak.artifactName=$(Get-ArtifactName "$prefix-linux-x86_64")"
) )
} }
+33 -15
View File
@@ -14,8 +14,10 @@
instead (creating the release if it does not exist). instead (creating the release if it does not exist).
-BinariesOnly ships just the installers: no docker build, no docker login, no -BinariesOnly ships just the installers: no docker build, no docker login, no
image push, and the release upload is implied. That is also the mode to use on image push, and the release upload is implied. It takes the target list to
a Linux host or in WSL, where the AppImage and Flatpak targets actually build. build (win, linux-appimage, linux-flatpak — comma-separated) and that list
overrides -Targets. The Linux targets need a Linux host or WSL, which is where
-BinariesOnly linux-appimage,linux-flatpak belongs.
Credentials are read, in order of precedence: Credentials are read, in order of precedence:
1. -Username / -Password parameters 1. -Username / -Password parameters
@@ -35,13 +37,19 @@
Full release: push the image and attach every dist/ installer to release v1.1.0. Full release: push the image and attach every dist/ installer to release v1.1.0.
.EXAMPLE .EXAMPLE
./scripts/publish.ps1 -BinariesOnly -Targets win -Tag v1.1.0 ./scripts/publish.ps1 -BinariesOnly win -Tag v1.1.0
Windows installers only — build them and attach them to release v1.1.0. Docker Windows installers only — build them and attach them to release v1.1.0. Docker
is never invoked, so this works with Docker Desktop stopped. is never invoked, so this works with Docker Desktop stopped.
.EXAMPLE .EXAMPLE
./scripts/publish.ps1 -BinariesOnly -NoBinaryBuild -Tag v1.1.0 ./scripts/publish.ps1 -BinariesOnly win,linux-appimage -Tag v1.1.0
Retry a failed upload: attach the installers already in dist/ without rebuilding. Windows installers plus the Linux AppImage (no Flatpak), attached to v1.1.0.
.EXAMPLE
./scripts/publish.ps1 -BinariesOnly win -NoBinaryBuild -Tag v1.1.0
Retry a failed upload: attach the installers already in dist/ without rebuilding
(the target list is required syntactically but ignored — every dist/ installer
for the tag is uploaded regardless).
.EXAMPLE .EXAMPLE
./scripts/publish.ps1 -NoBinaries ./scripts/publish.ps1 -NoBinaries
@@ -92,8 +100,8 @@ param(
# Skip building the desktop installers. # Skip building the desktop installers.
[switch]$NoBinaries, [switch]$NoBinaries,
# Forwarded to build-release.ps1. # Forwarded to build-release.ps1. "linux" is shorthand for both Linux bundles.
[ValidateSet("win", "linux")] [ValidateSet("win", "linux", "linux-appimage", "linux-flatpak")]
[string[]]$Targets = @("win", "linux"), [string[]]$Targets = @("win", "linux"),
[switch]$SkipVendor, [switch]$SkipVendor,
@@ -103,7 +111,10 @@ param(
# Ship only the installers: no docker build, login or push. Implies # Ship only the installers: no docker build, login or push. Implies
# -PublishRelease, since building alone is what build-release.ps1 already does. # -PublishRelease, since building alone is what build-release.ps1 already does.
[switch]$BinariesOnly, # Takes the target list to build (comma-separated), which overrides -Targets:
# -BinariesOnly win,linux-appimage
[ValidateSet("win", "linux-appimage", "linux-flatpak")]
[string[]]$BinariesOnly,
# Attach the installers to the Gitea release for $Tag, creating the release if # Attach the installers to the Gitea release for $Tag, creating the release if
# it is missing. # it is missing.
@@ -122,11 +133,13 @@ param(
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
function Invoke-Checked { function Invoke-Checked {
param([Parameter(Mandatory)][string]$Exe, [Parameter(Mandatory)][string[]]$Args) # $CmdArgs, not $Args: $Args is a PowerShell automatic variable and never
Write-Host " > $Exe $($Args -join ' ')" -ForegroundColor DarkGray # binds the passed array, so `& $Exe @Args` would run the exe bare.
& $Exe @Args param([Parameter(Mandatory)][string]$Exe, [Parameter(Mandatory)][string[]]$CmdArgs)
Write-Host " > $Exe $($CmdArgs -join ' ')" -ForegroundColor DarkGray
& $Exe @CmdArgs
if ($LASTEXITCODE -ne 0) { if ($LASTEXITCODE -ne 0) {
throw "'$Exe $($Args -join ' ')' failed with exit code $LASTEXITCODE." throw "'$Exe $($CmdArgs -join ' ')' failed with exit code $LASTEXITCODE."
} }
} }
@@ -283,20 +296,25 @@ $repoRoot = Split-Path -Parent $PSScriptRoot
Push-Location $repoRoot Push-Location $repoRoot
try { try {
# --- Mode resolution ------------------------------------------------------ # --- Mode resolution ------------------------------------------------------
if ($BinariesOnly -and $NoBinaries) { # -BinariesOnly is a target list, so its mere presence (a non-empty array) is
# what selects the mode.
$binariesOnlyMode = $BinariesOnly.Count -gt 0
if ($binariesOnlyMode -and $NoBinaries) {
throw "-BinariesOnly and -NoBinaries cancel each other out — pick one." throw "-BinariesOnly and -NoBinaries cancel each other out — pick one."
} }
if ($NoBinaryBuild -and $NoBinaries) { if ($NoBinaryBuild -and $NoBinaries) {
throw "-NoBinaryBuild reuses the build that -NoBinaries skips entirely — pick one." throw "-NoBinaryBuild reuses the build that -NoBinaries skips entirely — pick one."
} }
if ($BinariesOnly) { if ($binariesOnlyMode) {
# Nothing to build, log into or push on the container side, and uploading # Nothing to build, log into or push on the container side, and uploading
# is the whole point (build-release.ps1 alone covers "just build them"). # is the whole point (build-release.ps1 alone covers "just build them").
$NoBuild = $true $NoBuild = $true
$SkipLogin = $true $SkipLogin = $true
$PublishRelease = $true $PublishRelease = $true
# The targets named on -BinariesOnly are what to build.
$Targets = $BinariesOnly
} }
$pushImage = -not $BinariesOnly $pushImage = -not $binariesOnlyMode
if (-not $ReleaseRepo) { $ReleaseRepo = "$Owner/$Repo" } if (-not $ReleaseRepo) { $ReleaseRepo = "$Owner/$Repo" }
if (-not $ApiBase) { $ApiBase = "https://$Registry" } if (-not $ApiBase) { $ApiBase = "https://$Registry" }