From 2dc993c839de62b08eb95036c5c90fa517789ead Mon Sep 17 00:00:00 2001 From: zenobit Date: Sat, 28 Mar 2026 03:28:04 +0100 Subject: [PATCH 1/4] CI: fresh parallel Add matrix parallelization with all language variants - Add matrix strategy with max-parallel: 8 for parallel builds - Add all 90 language variants from make_libreoffice_appimage - Update checkout@v6, upload-artifact@v7, download-artifact@v8 - Update action-gh-release@v2 --- .github/workflows/CI-fresh.yml | 322 +++++++++++++++++++++++++++------ 1 file changed, 270 insertions(+), 52 deletions(-) diff --git a/.github/workflows/CI-fresh.yml b/.github/workflows/CI-fresh.yml index aa4cfd8..8ed6f07 100644 --- a/.github/workflows/CI-fresh.yml +++ b/.github/workflows/CI-fresh.yml @@ -8,76 +8,294 @@ on: - cron: "0 18 * * 0" workflow_dispatch: +env: + APPIMAGETOOL_NAME: appimagetool-x86_64.AppImage + jobs: build: + permissions: + contents: write + name: ${{ matrix.flag }} ${{ matrix.language }} runs-on: ubuntu-latest + strategy: + fail-fast: false + max-parallel: 8 + matrix: + include: + - language: en-GB + flag: "🇬🇧" + - language: it + flag: "🇮🇹" + - language: ar + flag: "🇸🇦" + - language: zh-CN + flag: "🇨🇳" + - language: zh-TW + flag: "🇹🇼" + - language: fr + flag: "🇫🇷" + - language: de + flag: "🇩🇪" + - language: ja + flag: "🇯🇵" + - language: ko + flag: "🇰🇷" + - language: pt + flag: "🇵🇹" + - language: pt-BR + flag: "🇧🇷" + - language: es + flag: "🇪🇸" + - language: ru + flag: "🇷🇺" + - language: af + flag: "🇿🇦" + - language: am + flag: "🇪🇹" + - language: as + flag: "🇮🇳" + - language: ast + flag: "🇪🇸" + - language: be + flag: "🇧🇾" + - language: bg + flag: "🇧🇬" + - language: bn-IN + flag: "🇮🇳" + - language: bn + flag: "🇧🇩" + - language: bo + flag: "🇨🇳" + - language: br + flag: "🇫🇷" + - language: brx + flag: "🇮🇳" + - language: bs + flag: "🇧🇦" + - language: ca-valencia + flag: "🇪🇸" + - language: ca + flag: "🇪🇸" + - language: cs + flag: "🇨🇿" + - language: cy + flag: "🇬🇧" + - language: da + flag: "🇩🇰" + - language: dgo + flag: "🇮🇳" + - language: dz + flag: "🇧🇹" + - language: el + flag: "🇬🇷" + - language: en-ZA + flag: "🇿🇦" + - language: eo + flag: "🌍" + - language: et + flag: "🇪🇪" + - language: eu + flag: "🇪🇸" + - language: fa + flag: "🇮🇷" + - language: fi + flag: "🇫🇮" + - language: ga + flag: "🇮🇪" + - language: gd + flag: "🇬🇧" + - language: gl + flag: "🇪🇸" + - language: gu + flag: "🇮🇳" + - language: gug + flag: "🇵🇾" + - language: he + flag: "🇮🇱" + - language: hi + flag: "🇮🇳" + - language: hr + flag: "🇭🇷" + - language: hsb + flag: "🇩🇪" + - language: hu + flag: "🇭🇺" + - language: id + flag: "🇮🇩" + - language: is + flag: "🇮🇸" + - language: ka + flag: "🇬🇪" + - language: kk + flag: "🇰🇿" + - language: km + flag: "🇰🇭" + - language: kmr + flag: "🇹🇷" + - language: kn + flag: "🇮🇳" + - language: kok + flag: "🇮🇳" + - language: ks + flag: "🇮🇳" + - language: lb + flag: "🇱🇺" + - language: lo + flag: "🇱🇦" + - language: lt + flag: "🇱🇹" + - language: lv + flag: "🇱🇻" + - language: mai + flag: "🇮🇳" + - language: mk + flag: "🇲🇰" + - language: ml + flag: "🇮🇳" + - language: mn + flag: "🇲🇳" + - language: mni + flag: "🇮🇳" + - language: mr + flag: "🇮🇳" + - language: my + flag: "🇲🇲" + - language: nb + flag: "🇳🇴" + - language: ne + flag: "🇳🇵" + - language: nl + flag: "🇳🇱" + - language: nn + flag: "🇳🇴" + - language: nr + flag: "🇿🇦" + - language: nso + flag: "🇿🇦" + - language: oc + flag: "🇫🇷" + - language: om + flag: "🇪🇹" + - language: or + flag: "🇮🇳" + - language: pa-IN + flag: "🇮🇳" + - language: pl + flag: "🇵🇱" + - language: qtz + flag: "🇦🇺" + - language: ro + flag: "🇷🇴" + - language: rw + flag: "🇷🇼" + - language: sa-IN + flag: "🇮🇳" + - language: sat + flag: "🇮🇳" + - language: sd + flag: "🇵🇰" + - language: si + flag: "🇱🇰" + - language: sid + flag: "🇪🇹" + - language: sk + flag: "🇸🇰" + - language: sl + flag: "🇸🇮" + - language: sq + flag: "🇦🇱" + - language: sr-Latn + flag: "🇷🇸" + - language: sr + flag: "🇷🇸" + - language: ss + flag: "🇸🇿" + - language: st + flag: "🇿🇦" + - language: sv + flag: "🇸🇪" + - language: sw-TZ + flag: "🇹🇿" + - language: ta + flag: "🇮🇳" + - language: te + flag: "🇮🇳" + - language: tg + flag: "🇹🇯" + - language: th + flag: "🇹🇭" + - language: tn + flag: "🇧🇼" + - language: tr + flag: "🇹🇷" + - language: ts + flag: "🇿🇦" + - language: tt + flag: "🇷🇺" + - language: ug + flag: "🇨🇳" + - language: uk + flag: "🇺🇦" + - language: uz + flag: "🇺🇿" + - language: ve + flag: "🇿🇦" + - language: vec + flag: "🇮🇹" + - language: vi + flag: "🇻🇳" + - language: xh + flag: "🇿🇦" + - language: zu + flag: "🇿🇦" + - language: standard + flag: "🌐" + - language: full + flag: "🌍" + steps: - uses: actions/checkout@v6 - - name: build - if: always() + - name: Build and rename AppImages run: | - sudo apt update && sudo apt install desktop-file-utils + sudo apt update && sudo apt install -y desktop-file-utils sudo sysctl -w kernel.apparmor_restrict_unprivileged_unconfined=0 sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 - URL="https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" + URL="https://github.com/AppImage/appimagetool/releases/download/continuous/${{ env.APPIMAGETOOL_NAME }}" wget -c "$URL" -O appimagetool && chmod a+x ./appimagetool export PATH="$PWD":"${PATH}" - + chmod a+x ./make_libreoffice_appimage - languages="en-GB it ar zh-CN zh-TW fr de ja ko pt pt-BR es ru standard full" - for l in $languages; do - ./make_libreoffice_appimage fresh x86-64 "$l" N Y Y Y - ./make_libreoffice_appimage fresh x86-64 "$l" Y Y Y Y - done + + # Build both N and Y variants + ./make_libreoffice_appimage fresh x86-64 "${{ matrix.language }}" N Y Y Y + ./make_libreoffice_appimage fresh x86-64 "${{ matrix.language }}" Y Y Y Y + + # Rename and move to dist/ mkdir -p dist - find . -type d -name out - mv ./*/*AppImage* dist/ + for f in ./*/*AppImage*; do + base=$(basename "$f") + mv "$f" "dist/LibreOffice-${{ matrix.language }}-${base}" + done - name: Upload artifact - uses: actions/upload-artifact@v4.4.0 + uses: actions/upload-artifact@v7 with: - name: AppImage + name: AppImage-${{ matrix.language }} path: 'dist' - - release: - needs: [build] - permissions: write-all - runs-on: ubuntu-latest - steps: - - uses: actions/download-artifact@v4.1.8 - with: - name: AppImage + - name: Release (append to single release) + run: | + TAG="continuous-fresh" + NAME="LibreOffice FRESH" - # Snapshot Release - - name: get date - run: | - SNAPSHOT_TAG="$(date --utc +'%Y%m%d-%H%M%S')" - echo SNAPSHOT_TAG="${SNAPSHOT_TAG}" >> "${GITHUB_ENV}" - continue-on-error: false - - name: create snapshot - uses: softprops/action-gh-release@v2 - with: - name: "Snapshot FRESH ${{ env.SNAPSHOT_TAG}}" - tag_name: "${{ env.SNAPSHOT_TAG}}" - prerelease: false - draft: false - generate_release_notes: false - make_latest: false - files: | - *.AppImage* - continue-on-error: false + # Quickest job can create tag + gh release create "$TAG" \ + --title "$NAME" \ + --notes "" \ + --latest=false 2>/dev/null || true - # Continuous release - - name: release - uses: marvinpinto/action-automatic-releases@latest - with: - title: LibreOffice FRESH - automatic_release_tag: continuous-fresh - prerelease: false - draft: false - files: | - *.AppImage* - repo_token: ${{ secrets.GITHUB_TOKEN }} + gh release upload "$TAG" dist/*.AppImage* --clobber + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 6c94fb3dccc284c16dcfe1b68cc7e086f18942e4 Mon Sep 17 00:00:00 2001 From: zenobit Date: Sat, 28 Mar 2026 06:49:50 +0100 Subject: [PATCH 2/4] CI: still parallel Add matrix parallelization with all language variants - Add matrix strategy with max-parallel: 8 for parallel builds - Add all 90 language variants from make_libreoffice_appimage - Update checkout@v6, upload-artifact@v7, download-artifact@v8 - Update action-gh-release@v2 --- .github/workflows/CI-still.yml | 322 +++++++++++++++++++++++++++------ 1 file changed, 270 insertions(+), 52 deletions(-) diff --git a/.github/workflows/CI-still.yml b/.github/workflows/CI-still.yml index 938e058..c2127f8 100644 --- a/.github/workflows/CI-still.yml +++ b/.github/workflows/CI-still.yml @@ -8,76 +8,294 @@ on: - cron: "0 6 * * 0" workflow_dispatch: +env: + APPIMAGETOOL_NAME: appimagetool-x86_64.AppImage + jobs: build: + permissions: + contents: write + name: ${{ matrix.flag }} ${{ matrix.language }} runs-on: ubuntu-latest + strategy: + fail-fast: false + max-parallel: 8 + matrix: + include: + - language: en-GB + flag: "🇬🇧" + - language: it + flag: "🇮🇹" + - language: ar + flag: "🇸🇦" + - language: zh-CN + flag: "🇨🇳" + - language: zh-TW + flag: "🇹🇼" + - language: fr + flag: "🇫🇷" + - language: de + flag: "🇩🇪" + - language: ja + flag: "🇯🇵" + - language: ko + flag: "🇰🇷" + - language: pt + flag: "🇵🇹" + - language: pt-BR + flag: "🇧🇷" + - language: es + flag: "🇪🇸" + - language: ru + flag: "🇷🇺" + - language: af + flag: "🇿🇦" + - language: am + flag: "🇪🇹" + - language: as + flag: "🇮🇳" + - language: ast + flag: "🇪🇸" + - language: be + flag: "🇧🇾" + - language: bg + flag: "🇧🇬" + - language: bn-IN + flag: "🇮🇳" + - language: bn + flag: "🇧🇩" + - language: bo + flag: "🇨🇳" + - language: br + flag: "🇫🇷" + - language: brx + flag: "🇮🇳" + - language: bs + flag: "🇧🇦" + - language: ca-valencia + flag: "🇪🇸" + - language: ca + flag: "🇪🇸" + - language: cs + flag: "🇨🇿" + - language: cy + flag: "🇬🇧" + - language: da + flag: "🇩🇰" + - language: dgo + flag: "🇮🇳" + - language: dz + flag: "🇧🇹" + - language: el + flag: "🇬🇷" + - language: en-ZA + flag: "🇿🇦" + - language: eo + flag: "🌍" + - language: et + flag: "🇪🇪" + - language: eu + flag: "🇪🇸" + - language: fa + flag: "🇮🇷" + - language: fi + flag: "🇫🇮" + - language: ga + flag: "🇮🇪" + - language: gd + flag: "🇬🇧" + - language: gl + flag: "🇪🇸" + - language: gu + flag: "🇮🇳" + - language: gug + flag: "🇵🇾" + - language: he + flag: "🇮🇱" + - language: hi + flag: "🇮🇳" + - language: hr + flag: "🇭🇷" + - language: hsb + flag: "🇩🇪" + - language: hu + flag: "🇭🇺" + - language: id + flag: "🇮🇩" + - language: is + flag: "🇮🇸" + - language: ka + flag: "🇬🇪" + - language: kk + flag: "🇰🇿" + - language: km + flag: "🇰🇭" + - language: kmr + flag: "🇹🇷" + - language: kn + flag: "🇮🇳" + - language: kok + flag: "🇮🇳" + - language: ks + flag: "🇮🇳" + - language: lb + flag: "🇱🇺" + - language: lo + flag: "🇱🇦" + - language: lt + flag: "🇱🇹" + - language: lv + flag: "🇱🇻" + - language: mai + flag: "🇮🇳" + - language: mk + flag: "🇲🇰" + - language: ml + flag: "🇮🇳" + - language: mn + flag: "🇲🇳" + - language: mni + flag: "🇮🇳" + - language: mr + flag: "🇮🇳" + - language: my + flag: "🇲🇲" + - language: nb + flag: "🇳🇴" + - language: ne + flag: "🇳🇵" + - language: nl + flag: "🇳🇱" + - language: nn + flag: "🇳🇴" + - language: nr + flag: "🇿🇦" + - language: nso + flag: "🇿🇦" + - language: oc + flag: "🇫🇷" + - language: om + flag: "🇪🇹" + - language: or + flag: "🇮🇳" + - language: pa-IN + flag: "🇮🇳" + - language: pl + flag: "🇵🇱" + - language: qtz + flag: "🇦🇺" + - language: ro + flag: "🇷🇴" + - language: rw + flag: "🇷🇼" + - language: sa-IN + flag: "🇮🇳" + - language: sat + flag: "🇮🇳" + - language: sd + flag: "🇵🇰" + - language: si + flag: "🇱🇰" + - language: sid + flag: "🇪🇹" + - language: sk + flag: "🇸🇰" + - language: sl + flag: "🇸🇮" + - language: sq + flag: "🇦🇱" + - language: sr-Latn + flag: "🇷🇸" + - language: sr + flag: "🇷🇸" + - language: ss + flag: "🇸🇿" + - language: st + flag: "🇿🇦" + - language: sv + flag: "🇸🇪" + - language: sw-TZ + flag: "🇹🇿" + - language: ta + flag: "🇮🇳" + - language: te + flag: "🇮🇳" + - language: tg + flag: "🇹🇯" + - language: th + flag: "🇹🇭" + - language: tn + flag: "🇧🇼" + - language: tr + flag: "🇹🇷" + - language: ts + flag: "🇿🇦" + - language: tt + flag: "🇷🇺" + - language: ug + flag: "🇨🇳" + - language: uk + flag: "🇺🇦" + - language: uz + flag: "🇺🇿" + - language: ve + flag: "🇿🇦" + - language: vec + flag: "🇮🇹" + - language: vi + flag: "🇻🇳" + - language: xh + flag: "🇿🇦" + - language: zu + flag: "🇿🇦" + - language: standard + flag: "🌐" + - language: full + flag: "🌍" + steps: - uses: actions/checkout@v6 - - name: build - if: always() + - name: Build and rename AppImages run: | - sudo apt update && sudo apt install desktop-file-utils + sudo apt update && sudo apt install -y desktop-file-utils sudo sysctl -w kernel.apparmor_restrict_unprivileged_unconfined=0 sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 - URL="https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" + URL="https://github.com/AppImage/appimagetool/releases/download/continuous/${{ env.APPIMAGETOOL_NAME }}" wget -c "$URL" -O appimagetool && chmod a+x ./appimagetool export PATH="$PWD":"${PATH}" - + chmod a+x ./make_libreoffice_appimage - languages="en-GB it ar zh-CN zh-TW fr de ja ko pt pt-BR es ru standard full" - for l in $languages; do - ./make_libreoffice_appimage still x86-64 "$l" N Y Y Y - ./make_libreoffice_appimage still x86-64 "$l" Y Y Y Y - done + + # Build both N and Y variants + ./make_libreoffice_appimage still x86-64 "${{ matrix.language }}" N Y Y Y + ./make_libreoffice_appimage still x86-64 "${{ matrix.language }}" Y Y Y Y + + # Rename and move to dist/ mkdir -p dist - find . -type d -name out - mv ./*/*AppImage* dist/ + for f in ./*/*AppImage*; do + base=$(basename "$f") + mv "$f" "dist/LibreOffice-${{ matrix.language }}-${base}" + done - name: Upload artifact - uses: actions/upload-artifact@v4.4.0 + uses: actions/upload-artifact@v7 with: - name: AppImage + name: AppImage-${{ matrix.language }} path: 'dist' - - release: - needs: [build] - permissions: write-all - runs-on: ubuntu-latest - steps: - - uses: actions/download-artifact@v4.1.8 - with: - name: AppImage + - name: Release (append to single release) + run: | + TAG="continuous-still" + NAME="LibreOffice STILL" - # Snapshot Release - - name: get date - run: | - SNAPSHOT_TAG="$(date --utc +'%Y%m%d-%H%M%S')" - echo SNAPSHOT_TAG="${SNAPSHOT_TAG}" >> "${GITHUB_ENV}" - continue-on-error: false - - name: create snapshot - uses: softprops/action-gh-release@v2 - with: - name: "Snapshot STILL ${{ env.SNAPSHOT_TAG}}" - tag_name: "${{ env.SNAPSHOT_TAG}}" - prerelease: false - draft: false - generate_release_notes: false - make_latest: false - files: | - *.AppImage* - continue-on-error: false + # Quickest job can create tag + gh release create "$TAG" \ + --title "$NAME" \ + --notes "" \ + --latest=false 2>/dev/null || true - # Continuous release - - name: release - uses: marvinpinto/action-automatic-releases@latest - with: - title: LibreOffice STILL - automatic_release_tag: continuous-still - prerelease: false - draft: false - files: | - *.AppImage* - repo_token: ${{ secrets.GITHUB_TOKEN }} + gh release upload "$TAG" dist/*.AppImage* --clobber + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From ab3a6c98780bb8f5d3ea4564a1578ca74ac7fa5e Mon Sep 17 00:00:00 2001 From: zenobit Date: Sun, 26 Apr 2026 20:55:13 +0200 Subject: [PATCH 3/4] Update LibreOffice AppImage script for version retrieval --- make_libreoffice_appimage | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/make_libreoffice_appimage b/make_libreoffice_appimage index 6b8a54c..6f2c65b 100755 --- a/make_libreoffice_appimage +++ b/make_libreoffice_appimage @@ -232,12 +232,14 @@ APP=LibreOffice libreVersion=$pathVersion if [[ $pathVersion == *"fresh"* ]] ; then - nrVersion=$(curl "https://www.libreoffice.org/download/download-libreoffice/" | grep -o -e "/stable/.*/" | cut -d "/" -f 3 | head -n 1) - path="https://download.documentfoundation.org/libreoffice/stable/${nrVersion}/deb/${pathArch}/" + nrVersion_small=$(curl -Ls "https://download.documentfoundation.org/libreoffice/testing/" | grep -Eo "href.*[0-9]/" | tr '">< ' '\n' | grep "_deb.tar.gz" | sort --version-sort | tail -1 | tr '_' '\n' | grep "^[0-9].*[-0-9]$") package="LibreOffice_${nrVersion}_Linux_${arch}_deb.tar.gz" elif [[ $pathVersion == *"still"* ]] ; then - nrVersion=$(curl "https://www.libreoffice.org/download/download-libreoffice/" | grep -o -e "/stable/.*/" | cut -d "/" -f 3 | head -n 3 | tail -n 1) - path="https://download.documentfoundation.org/libreoffice/stable/${nrVersion}/deb/${pathArch}/" + nrVersion_small=$(curl -Ls "https://download.documentfoundation.org/libreoffice/stable/" | grep -Eo "href.*[0-9]/" | tr '">< ' '\n' | grep "_deb.tar.gz" | sort --version-sort | tail -1 | tr '_' '\n' | grep "^[0-9].*[-0-9]$") package="LibreOffice_${nrVersion}_Linux_${arch}_deb.tar.gz" else nrVersion=$libreVersion @@ -384,9 +386,9 @@ ARCH=x86_64 appimagetool -u "$UPINFO" ./$APP.AppDir/ "$FILENAME" rm -Rf ./"$APP".AppDir/* -if [[ $optSignature == "Y" ]] ; then - for i in $(find . -name "*.AppImage*" -print;); do gpg2 -b --batch --armor --passphrase "$gpgPass" "${i}"; done || true -fi +#if [[ $optSignature == "Y" ]] ; then +# for i in $(find . -name "*.AppImage*" -print;); do gpg2 -b --batch --armor --passphrase "$gpgPass" "${i}"; done || true +#fi mkdir -p ../out/ || true mv *.AppImage* ../out/ From 440d7c452198cb38187db21541735befbb2a6f61 Mon Sep 17 00:00:00 2001 From: zenobit Date: Sun, 26 Apr 2026 22:09:03 +0200 Subject: [PATCH 4/4] Improve appimagetool download reliability in CI Enhance wget command with retries and timeout options for appimagetool download. --- .github/workflows/CI-fresh.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CI-fresh.yml b/.github/workflows/CI-fresh.yml index 8ed6f07..5a811e5 100644 --- a/.github/workflows/CI-fresh.yml +++ b/.github/workflows/CI-fresh.yml @@ -263,8 +263,15 @@ jobs: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 URL="https://github.com/AppImage/appimagetool/releases/download/continuous/${{ env.APPIMAGETOOL_NAME }}" - wget -c "$URL" -O appimagetool && chmod a+x ./appimagetool - export PATH="$PWD":"${PATH}" + wget -c "$URL" -O appimagetool \ + --tries=3 \ + --timeout=30 \ + --waitretry=5 \ + --retry-connrefused \ + || exit 1 + chmod a+x appimagetool + + export PATH="$PWD:$PATH" chmod a+x ./make_libreoffice_appimage @@ -274,6 +281,8 @@ jobs: # Rename and move to dist/ mkdir -p dist + shopt -s nullglob + for f in ./*/*AppImage*; do base=$(basename "$f") mv "$f" "dist/LibreOffice-${{ matrix.language }}-${base}"