GitHub Actions Ile Andorid Apk Paket Oluşturma (React Native)
Yazılım geliştirme süreçleri bir çok aşamadan oluşmaktadır. Kodun yazılmasından sonra kuşkusuz en önemli adım CI/CD (Sürekli entegrasyon — Sürekli Dağıtım) ‘dir.
Eğer kodunuzu github üzerinde private veya public olarak tutuyorsanız, github actions’ları aylık 2000dk ya kadar ücretsiz olarak kullanabilirsiniz.
GitHub actions’lar ile build, test, publish aşmalarınızı otomatize edebilirsiniz. Actions’ları doğru kullanmak ve anlayabilmek için resme biraz yakından bakalım ve terimleri inceleyelim.
Workflows
GitHub üzerinde bir veya birden fazla işi (job) çalıştıran akıştır. Akış üzerindeki işler yapılandırılabilir. Reponuz üzerinde workflows dizininde .yml olarak tutabilirsiniz. Bu flowlar manuel olarak çalıştırılabildiği gibi bir aksiyonun (push, pull request, tag v.s.) gerçeklemesi sonucunda da otomatik çalışabilir.
Örnek olarak atılan her bir commit’den sonra tüm test süreçlerini yeniden çalıştıracak bir akışı otomatik olarak çalıştırabilirsiniz. Diğer bir gerçek dünya örneği ise release alınmış kodunuzu test, build aşamalarından geçirerek publish edebilirsiniz.
Jobs
Flowlar üzerinde her bir adımı temsil eder. Tanımlayacağınız görevleri belirleyeceğiniz adımlar ile çalıştırır. Aynı akış üzerinde yer alan job’lar arasında veri alış verişi kolaylıkla yapılabilmektedir. Build, test ve publish adımlarını job’lara bölerek flowlar üzerinde çalıştırabilirsiniz.
Job tanımlanırken bir önceki adımın success olarak tamamlanmasını koşul olarak belirtebilirsiniz.
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]
Runners
Tetiklendiği zaman flow üzerinde bulunan job’ları çalıştıran yapıdır. Her bir jobs belli bir sanal makinayı ayağa kaldırarak işlemlerini yapar. Örnek olarak ubuntu image’ı ile bir sanal makina ayağa kaldırarak adımları çalıştıran bir yaml dosyası.
jobs:
install-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install npm dependencies
run: |
npm install
Eğer bir windows server image ayağa kaldırmak istiyorsanız windows-latest veya windows-2022 şeklinde yazabilirsiniz. Daha fazlası için bu adrese göz atabilirsiniz.
Bu kadar teorik bilgiden sonra bir örnek ile inceleyelim. React Native ile yazdığımız bir mobil uygulamayı nasıl paketler (apk) ve publish ederiz görelim.
Öncelikle StoreApp adında boş bir React Native projesi oluşturuyorum.
npx react-native init StoreApp
Projemizin ana dizininde .github/workflows/build.yml dosyasını oluşturarak aşağıdaki şekilde düzenleyeim.
Aşağıdaki flowun ne zaman çalışacağını on.push.branches kısmında maın branch olarak belirliyoruz. Yani main branch’e her commit atıldığında bu workflow calışacak.
Build-android altında ubuntu-latest imajını tanımlayarak ilgili stepleri bu işletim sistemi üzerinde çalıştırmasını sağlıyoruz.
Jobs kısmına dikkat ederseniz iki tane job içeriyor. (install-and-test ve build-android). Flow üzerinde ilgili joblar çalışarak önce bağımlılıkları yükleyecek, ardından apk dosyamızı oluşturarak, github actions artifact üzerine yükleyecek.
Actions .yml dosyasını oluşturmadan önce https://docs.github.com/en/actions adresindeki dokümanı inceleyerek referans alabilirsiniz.
name: react-native-android-build-apk
on:
push:
branches:
- main
jobs:
install-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install npm dependencies
run: |
npm install
build-android:
needs: install-and-test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install npm dependencies
run: |
npm install
- name: Build Android Release
run: |
cd android && ./gradlew assembleRelease
- name: Upload Artifact
uses: actions/upload-artifact@v1
with:
name: app-release.apk
path: android/app/build/outputs/apk/release/
Evet projemizi tamamladık şimdi github üzerine pushlayarak actions log’ları inceleyelim.
https://github.com/akaramanapp/StoreApp/actions adresine girerek job’ları görüntüleyebiliriz.
Commit işlemimizin ardından her iki job’da çalışarak görevleri tamamlamış oldugunu görüyoruz. (Artifacts kısmına bakarsanız apk dosyamızın da yüklendiğini göreceksiniz.)
Detay Log:
Bir sonraki makalede görüşmek dileğiyle.. Hoşça kalın.