# ============================================================ # Gitea Actions CI/CD - Gitea LibreTranslate (Ceviri Uygulamasi) # # Bu workflow ne yapar: # 1) build-android -> Android APK derler # 2) build-linux -> Linux masaustu binary'sini derler, ondan # .deb / .rpm / .pkg.tar.zst (Arch) paketleri # uretir ve bu 3 paketi dogrudan Gitea'nin # Paket Kutuphanesi'ne (Package Registry) yayinlar # (boylece dnf/apt/pacman ile otomatik guncelleme # mumkun olur) # 3) release -> Butun ciktilari (apk + deb + rpm + pacman) tek # bir Gitea Release'ine ekler # # Sadece git TAG pushlandiginda calisir: # git tag 1.0.0 && git push origin 1.0.0 # ============================================================ name: Build Ceviri Uygulamasi on: push: tags: - '*' # normal commit'lerde DEGIL, sadece tag pushlaninca calisir workflow_dispatch: {} # Gitea Actions sekmesinden elle "Run workflow" ile de tetiklenebilir # Butun job/step'lere otomatik enjekte edilen ortak degerler. env: PACKAGE_NAME: gitea-libretranslate # deb/rpm/pacman uc formatta da kullanilan ayni paket adi GITEA_OWNER: y1lm0z # Paket Kutuphanesi bir kullaniciya/orga baglidir GITEA_HOST: git.y1lm0z.me jobs: # ============================================================ # JOB 1: ANDROID APK # ============================================================ build-android: runs-on: docker container: image: ghcr.io/cirruslabs/flutter:stable # Flutter + Android SDK hazir gelen image steps: # checkout/upload-artifact gibi action'lar JS ile yazilmis, calismalari icin # container icinde node bulunmasi sart. Bu image'da garanti olmadigindan # elle kuruyoruz. - name: Runner Hazirligi (Node ve Git) run: | apt-get update && apt-get install -y git nodejs || true # Kaynak kodu indir. Gitea'nin kendi mirror'ini kullaniyoruz (gitea.com/actions/*), # cunku bazi runner'lar github.com'a dogrudan erisemeyebiliyor. - name: Kodu al uses: https://gitea.com/actions/checkout@v4 # pubspec.yaml'daki tum paketleri (http, shared_preferences...) indirir. - name: Bagimliliklari indir run: flutter pub get # Release modda APK uretir. - name: APK derle run: flutter build apk --release # Uretilen APK'yi is akisi artifact deposuna yukler; 'release' job'u # bunu indirip Gitea Release'ine ekleyecek. - name: APK'yi artifact olarak yukle uses: https://gitea.com/actions/upload-artifact@v3 with: name: gitea-libretranslate-android-apk path: build/app/outputs/flutter-apk/app-release.apk # ============================================================ # JOB 2: LINUX DERLEME + DEB/RPM/PACMAN PAKETLEME + PAKET KUTUPHANESINE YAYIN # ============================================================ build-linux: runs-on: docker container: image: ubuntu:24.04 # cıplak image, her sey asagida elle kuruluyor steps: # Bu container'da hicbir sey kurulu degil; checkout action'i calismadan # once Node ve Git'i biz kurmak zorundayiz. - name: Node ve Git Kur (Action'larin calisabilmesi icin sart) run: | apt-get update apt-get install -y git nodejs curl unzip xz-utils - name: Kodu al uses: https://gitea.com/actions/checkout@v4 # Flutter'in Linux masaustu derlemesi icin gereken derleyici ve kutuphaneler. - name: Sistem bagimliliklarini kur run: | apt-get update apt-get install -y clang cmake ninja-build \ pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev # Flutter SDK'yi apt yerine git'ten cekiyoruz; boylece distro farki # (ubuntu/fedora/arch) onemsiz, her yerde ayni sekilde calisir. - name: Flutter SDK kur run: | git clone https://github.com/flutter/flutter.git -b stable --depth 1 /opt/flutter echo "/opt/flutter/bin" >> "$GITHUB_PATH" - name: Linux masaustu destegini ac run: | export PATH="/opt/flutter/bin:$PATH" flutter config --enable-linux-desktop flutter doctor - name: Bagimliliklari indir run: | export PATH="/opt/flutter/bin:$PATH" flutter pub get # Gercek binary + kaynaklari (build/linux/x64/release/bundle/) uretir. - name: Linux derle run: | export PATH="/opt/flutter/bin:$PATH" flutter build linux --release # Git tag'inden (ornek: v1.2.0) paket surumunu turetiyoruz: # - basindaki 'v' siliniyor -> 1.2.0 # - '-' karakteri '.' ile degistiriliyor (Arch pkgver'de '-' YASAK) # Boylece tek bir surum stringi 3 formatta da sorunsuz kullanilabiliyor. - name: Surum numarasini hazirla id: version run: | CLEAN_VERSION="$(echo "$GITHUB_REF_NAME" | sed 's/^v//; s/-/./g')" echo "version=$CLEAN_VERSION" >> "$GITHUB_OUTPUT" echo "Kullanilacak surum: $CLEAN_VERSION" # fpm (Effing Package Management): tek komutla deb + rpm + pacman uretebilen # Ruby araci. Ayri fedora/archlinux container'i acmaya gerek birakmiyor. - name: fpm kur run: | apt-get update # ruby -> fpm'in calisma zamani # ruby-dev/build-essential -> bazi ruby gem'leri native derleniyor # rpm -> .rpm meta verisi icin destek araclari # zstd -> pacman paketinin sikistirma formati # libarchive-tools -> bsdtar saglar, fpm'in pacman hedefi .MTREE # dosyasini uretmek icin bunu kullaniyor apt-get install -y ruby ruby-dev build-essential rpm zstd libarchive-tools gem install --no-document fpm # Flutter'in urettigi ham "bundle/" klasorunu, gercek bir Linux paketinin # bekledigi standart dizin yapisina (FHS) yerlestiriyoruz: # /usr/lib/gitea-libretranslate/ -> uygulamanin tum dosyalari # /usr/bin/gitea-libretranslate -> terminal/menuden calistirma komutu # /usr/share/applications/... -> uygulama menusunde gorunmesi icin - name: Paket icin dosya yapisini hazirla run: | STAGE=staging rm -rf "$STAGE" mkdir -p "$STAGE/usr/lib/${PACKAGE_NAME}" mkdir -p "$STAGE/usr/bin" mkdir -p "$STAGE/usr/share/applications" # Derlenen tum dosyalari (binary + data/ + lib/) kopyala. cp -r build/linux/x64/release/bundle/* "$STAGE/usr/lib/${PACKAGE_NAME}/" # /usr/bin altina kucuk bir baslatici script koy. # (linux/CMakeLists.txt icindeki BINARY_NAME "libretranslate" oldugu icin # gercek calistirilabilir dosyanin adi budur.) cat > "$STAGE/usr/bin/${PACKAGE_NAME}" << 'EOF' #!/bin/sh exec /usr/lib/gitea-libretranslate/libretranslate "$@" EOF chmod +x "$STAGE/usr/bin/${PACKAGE_NAME}" # Uygulama menusunde gorunmesi icin .desktop dosyasi. cat > "$STAGE/usr/share/applications/${PACKAGE_NAME}.desktop" << EOF [Desktop Entry] Type=Application Name=Gitea LibreTranslate Comment=Kendi LibreTranslate sunucunuza baglanan ceviri uygulamasi Exec=${PACKAGE_NAME} Icon=accessories-dictionary Terminal=false Categories=Utility;Office; EOF # Ayni "staging/" klasorunden uc farkli paket formati uretiliyor. # -C staging . -> staging/usr/... yapisini paketin kok dizini (/) gibi kullan. - name: deb paketi olustur run: | fpm -s dir -t deb \ -n "${PACKAGE_NAME}" \ -v "${{ steps.version.outputs.version }}" \ --architecture amd64 \ --depends libgtk-3-0 \ --description "Kendi LibreTranslate sunucunuza baglanan ceviri uygulamasi" \ --url "https://${GITEA_HOST}/${GITEA_OWNER}/Libretranslate-app" \ --maintainer "${GITEA_OWNER}" \ --license MIT \ -C staging . - name: rpm paketi olustur run: | fpm -s dir -t rpm \ -n "${PACKAGE_NAME}" \ -v "${{ steps.version.outputs.version }}" \ --architecture x86_64 \ --depends gtk3 \ --description "Kendi LibreTranslate sunucunuza baglanan ceviri uygulamasi" \ --url "https://${GITEA_HOST}/${GITEA_OWNER}/Libretranslate-app" \ --maintainer "${GITEA_OWNER}" \ --license MIT \ -C staging . - name: pacman (Arch) paketi olustur run: | fpm -s dir -t pacman \ -n "${PACKAGE_NAME}" \ -v "${{ steps.version.outputs.version }}" \ --architecture x86_64 \ --depends gtk3 \ --description "Kendi LibreTranslate sunucunuza baglanan ceviri uygulamasi" \ --url "https://${GITEA_HOST}/${GITEA_OWNER}/Libretranslate-app" \ --maintainer "${GITEA_OWNER}" \ --license MIT \ -C staging . # fpm'in urettigi dosya adlarini (surum/mimari otomatik eklendigi icin # tam adlari degisken) bulup sonraki adimlarda kullanmak uzere kaydediyoruz. - name: Paket dosyalarini bul id: files run: | echo "deb=$(find . -maxdepth 1 -name '*.deb' | head -n1)" >> "$GITHUB_OUTPUT" echo "rpm=$(find . -maxdepth 1 -name '*.rpm' | head -n1)" >> "$GITHUB_OUTPUT" echo "pkg=$(find . -maxdepth 1 -name '*.pkg.tar.zst' | head -n1)" >> "$GITHUB_OUTPUT" ls -la *.deb *.rpm *.pkg.tar.zst # Uc paketi de artifact olarak yukle (release job'u bunlari Release'e ekleyecek). - name: Linux paketlerini artifact olarak yukle uses: https://gitea.com/actions/upload-artifact@v3 with: name: gitea-libretranslate-linux-packages path: | *.deb *.rpm *.pkg.tar.zst # ------------------------------------------------------------ # BURADAN ITIBAREN: Gitea Paket Kutuphanesi'ne DOGRUDAN yayin. # Bu adimlar sayesinde paketler Release'de duran statik dosyalar olmanin # otesinde, dnf/apt/pacman tarafindan GERCEK BIR REPO gibi gorulur ve # "sudo dnf update" / "sudo apt update" / "sudo pacman -Syu" ile # otomatik guncellenir. # PACKAGE_TOKEN: Gitea'da "package" (write) yetkisiyle olusturulup # repo/organizasyon Secrets kismina eklenmis kisisel erisim anahtari. # ------------------------------------------------------------ - name: RPM paketini Gitea Paket Kutuphanesi'ne yayinla run: | curl --fail --user "${GITEA_OWNER}:${{ secrets.PACKAGE_TOKEN }}" \ --upload-file "${{ steps.files.outputs.rpm }}" \ "https://${GITEA_HOST}/api/packages/${GITEA_OWNER}/rpm/upload" # Debian registry'sinde yol icinde distribution+component var; ikisini de # sabit/genel-gecer tutuyoruz ("any" / "main") - apt sources.list'te de # ayni degerler kullanilacak. - name: DEB paketini Gitea Paket Kutuphanesi'ne yayinla run: | curl --fail --user "${GITEA_OWNER}:${{ secrets.PACKAGE_TOKEN }}" \ -X PUT \ --upload-file "${{ steps.files.outputs.deb }}" \ "https://${GITEA_HOST}/api/packages/${GITEA_OWNER}/debian/pool/any/main/upload" # Arch registry'sinde bir "repository" (grup) adi gerekiyor; "main" kullaniyoruz, # pacman.conf'ta da ayni ismi kullanacaksin. - name: Arch paketini Gitea Paket Kutuphanesi'ne yayinla run: | curl --fail --user "${GITEA_OWNER}:${{ secrets.PACKAGE_TOKEN }}" \ --upload-file "${{ steps.files.outputs.pkg }}" \ "https://${GITEA_HOST}/api/packages/${GITEA_OWNER}/arch/main" # ============================================================ # JOB 3: TUM CIKTILARI TEK BIR GITEA RELEASE'INE EKLE # ============================================================ release: name: Gitea Release Olustur needs: [build-android, build-linux] # once iki derleme de bitmis olmali runs-on: docker # Otomatik saglanan secrets.GITEA_TOKEN'in bu job'da Release olusturma/dosya # yukleme (write) yetkisine sahip oldugundan emin olmak icin acikca istiyoruz. # (Bazi Gitea kurulumlarinda varsayilan yetki salt-okunur olabiliyor.) permissions: contents: write container: image: ubuntu:24.04 steps: - name: Node, Git ve Sertifikalari Kur run: | apt-get update apt-get install -y git nodejs curl ca-certificates - name: Android APK'yi indir uses: https://gitea.com/actions/download-artifact@v3 with: name: gitea-libretranslate-android-apk path: release-assets/ - name: Linux paketlerini indir uses: https://gitea.com/actions/download-artifact@v3 with: name: gitea-libretranslate-linux-packages path: release-assets/ # apk + deb + rpm + pacman -> hepsi tek Release'e, tag adi basliginda. - name: Gitea'da Surumu Yukle uses: https://gitea.com/actions/gitea-release-action@main with: files: | release-assets/app-release.apk release-assets/*.deb release-assets/*.rpm release-assets/*.pkg.tar.zst title: Release ${{ github.ref_name }} api_key: ${{ secrets.GITEA_TOKEN }}