diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 7db67f4..981e8ec 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -1,43 +1,85 @@ +# ============================================================ +# 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: - # Sadece yeni bir tag pushlandığında çalışır (Örn: git tag 1.0.0 && git push origin 1.0.0) tags: - - '*' - workflow_dispatch: {} + - '*' # 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 + 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: ceviri-android-apk + 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 + image: ubuntu:24.04 # cıplak image, her sey asagida elle kuruluyor + steps: - - name: Node ve Git Kur (Action'ların çalışabilmesi için şart) + # 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 @@ -45,12 +87,15 @@ jobs: - 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 @@ -67,28 +112,182 @@ jobs: 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 - - name: Bundle'i sikistir + # 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: | - cd build/linux/x64/release - tar -czf ceviri-linux-bundle.tar.gz bundle + CLEAN_VERSION="$(echo "$GITHUB_REF_NAME" | sed 's/^v//; s/-/./g')" + echo "version=$CLEAN_VERSION" >> "$GITHUB_OUTPUT" + echo "Kullanilacak surum: $CLEAN_VERSION" - - name: Linux bundle'i artifact olarak yukle + # 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 + apt-get install -y ruby ruby-dev build-essential rpm zstd + 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: ceviri-linux-bundle - path: build/linux/x64/release/ceviri-linux-bundle.tar.gz + 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] + 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: | @@ -98,20 +297,23 @@ jobs: - name: Android APK'yi indir uses: https://gitea.com/actions/download-artifact@v3 with: - name: ceviri-android-apk + name: gitea-libretranslate-android-apk path: release-assets/ - - name: Linux Bundle'i indir + - name: Linux paketlerini indir uses: https://gitea.com/actions/download-artifact@v3 with: - name: ceviri-linux-bundle + name: gitea-libretranslate-linux-packages path: release-assets/ - - name: Gitea'da Sürümü Yükle + # 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/ceviri-linux-bundle.tar.gz + release-assets/*.deb + release-assets/*.rpm + release-assets/*.pkg.tar.zst title: Release ${{ github.ref_name }} api_key: ${{ secrets.GITEA_TOKEN }} \ No newline at end of file