Spegla författarens Git, kör testerna, bygg ett QPKG: CI på din NAS
Forgejo på din NAS har en pull-spegel av ett programs förråd. Ett separat paketeringsprojekt bygger varje dag författarens senaste utgåva på NAS:ens egen runner, kör författarens tester och gör ett QPKG av den. Exemplet är fzy, en liten fuzzy-sökare skriven i C (MIT-licens).
- ModulerGit, CI, Redigerare
- Spegelförfattarens förråd
- ProjektNytt projekt, QPKG-paket
- Arbetsflödehämta, testa, bygg
- Körningardagligen, vid push, för hand
Bilderna kommer från panelen och Forgejo i Bucket & Code Server IDE, med varje fält ifyllt så som den här guiden beskriver. Kontot heter ola.
01Innan du börjar
- Git, CI och Redigerare måste vara på. En modul som är av har en knapp på sin ruta i Översikt och på sin egen sida: Slå på Git, Slå på Redigerare, och Slå på Git och CI medan Git fortfarande är av.
- QDK måste vara installerat: installera QNAP QDK 2.5.0 på sidan Verktygskedjor, fliken QNAP.
- Du behöver byggmiljön för Ubuntu 24.04: Appar → Exempel, eller Skapa en Builder-miljö på sidan Ny app. Arbetsflödet bygger i den.
- NAS:en måste kunna nå internet:
actions/checkoutochactions/upload-artifacthämtas fråndata.forgejo.org, och spegeln hämtar från författarens server.
Runnern på NAS:en tar hand om de jobb vars runs-on anger någon av dess etiketter, till exempel bucketvs. Den kör varje jobb på NAS:en själv, som admin. Den som kan pusha ett arbetsflöde till ett förråd kan alltså köra kommandon som admin på NAS:en: ge push-åtkomst bara till personer som du skulle anförtro NAS:ens adminlösenord.
02Spegla författarens förråd
- I Forgejo (Öppna Forgejo på sidan Git) trycker du på + → Ny migrering → Git.
- Klistra in adressen till författarens förråd, här
https://github.com/jhawthorn/fzy.git, bocka i Det här förrådet ska vara en spegel, ge det ett namn, till exempelfzy-upstream, och tryck på Migrera förråd.
- Spegeln hämtar själv författarens commits och taggar. Under spegelns Inställningar finns Speglingsintervall (8 timmar om du inte ändrar det, minst 10 minuter) och Synkronisera nu.

En spegel tar inte emot push, så ditt eget arbetsflöde kan inte läggas i den. En synkning kör bara de arbetsflöden som författarens förråd själv innehåller i .forgejo/workflows/, och fzy har inga. Bygget ligger därför i ett eget förråd som läser spegeln.
03Ett eget paketeringsprojekt
Öppna Nytt projekt från Git-sidan eller kommandopaletten (rollen developer). Guiden Ditt eget App Center går igenom varje steg; för det här exemplet:
- Mall: QPKG-paket.

- Namn:
fzy. Tjänst: Kommandoradsverktyg, som länkar programmet till/usr/binmedan paketet körs.
- Byggmiljö:
ubuntu2404-builder, miljön som arbetsflödet använder.
- Tryck på Skapa projekt. Projektet får sitt förråd, mappen
projects/fzyoch mallens arbetsflöde, som avsnitt 05 ersätter.
Ett förråd som skapats innan CI var på har Forgejos Actions avstängt, och ett pushat arbetsflöde startar ingenting. Slå på dem under förrådets Inställningar → Units; förråd som skapats medan CI är på har dem redan påslagna.
04En skrivskyddad token för spegeln
Jobbet klonar spegeln över HTTPS. Klonningen kräver inloggning, utom när spegeln är publik och Publik bläddring är på. Därför ger arbetsflödet den en token som bara kan läsa.
- I Forgejo: Inställningar → Applications → Generate new token: ett namn som
mirror-readoch behörigheten förråd: Read. Kopiera token: Forgejo visar den bara en gång. - I paketeringsförrådet: Inställningar → Åtgärder → Secrets → Add secret: namnet
MIRROR_TOKENoch token som värde.
05Arbetsflödet
Lägg den här filen i projektet som .forgejo/workflows/build.yml, i stället för mallens, och pusha den. Den körs vid varje push, en gång per dygn och när någon startar den för hand.
# .forgejo/workflows/build.yml: fzy from the author's newest release, tested, as a QPKG
name: build
on:
push:
schedule:
- cron: '30 4 * * *'
workflow_dispatch:
jobs:
build:
runs-on: bucketvs
steps:
- uses: actions/checkout@v4
- name: The author's newest release, from the mirror
run: |
git -c http.extraHeader="Authorization: token $MIRROR_TOKEN" clone --quiet \
"${{ github.server_url }}/${{ github.repository_owner }}/fzy-upstream.git" upstream
tag=$(git -C upstream describe --tags --abbrev=0)
git -C upstream checkout --quiet "$tag"
echo "VERSION=${tag#v}" >> "$GITHUB_ENV"
env:
MIRROR_TOKEN: ${{ secrets.MIRROR_TOKEN }}
- name: Build and run the author's tests
run: |
bvs env run ubuntu2404-builder -- make -C upstream
bvs env run ubuntu2404-builder -- make -C upstream check
- name: Put the program into the package
run: |
rm -f shared/bin/fzy
install -D -m 755 upstream/fzy x86_64/bin/fzy
sed -i "s/^QPKG_VER=.*/QPKG_VER=\"$VERSION\"/" qpkg.cfg
- name: Build the QPKG
run: bvs qbuild
- uses: actions/upload-artifact@v3
with:
name: fzy-qpkg
path: build/*.qpkg
- name: Publish into this NAS's App Center repository
run: |
for f in build/*.qpkg; do
if out=$(bvs repo publish "$f" --arch x86_64 --latest 2>&1); then
echo "$out"
elif printf '%s' "$out" | grep -q 'carries no code signature'; then
echo "::warning::$f is built but not published: it carries no code signature"
else
echo "$out" >&2
exit 1
fi
done
- Det andra steget hämtar den senaste taggen i spegeln, så att paketet följer författarens utgåvor, och taggens version blir paketets version (
QPKG_VER). bvs env run ubuntu2404-builder -- …bygger och testar i miljön, med dess kompilator och bibliotek. Ett misslyckat test gör att körningen misslyckas, och inget packas.bvs qbuildbygger paketet ibuild/. Körningen sparar paketet som en artefakt.- Det sista steget publicerar i NAS:ens App Center-förråd, som bara tar emot kodsignerade paket. Utan certifikat slutar körningen med en varning och paketet blir kvar som artefakt. Guiden Ditt eget App Center visar de två stegen som signerar varje bygge.
06Körningar, tester och paketet
Fliken Åtgärder i förrådet listar varje körning med vad som startade den: en push, schemat eller en person.
En körning visar varje steg med sin tid. Steget med testerna skriver ut författarens egna resultat.

Run workflow startar den för hand, till exempel direkt efter spegelns Synchronize now. Paketet finns under Artifacts på körningens sida.
