Bu dokümanda, iOS uygulamalarında hassas bilgileri (API keys, secrets vb.) güvenli bir şekilde yönetmek için GitHub Actions ve GitHub Secrets kullanarak CI/CD pipeline kurulumunu adım adım anlatmaktadır.
Caution
Bu dokümandaki KEY ve VALUE değerlerini projenize uygun olarak seçin ve güvenli bir şekilde oluşturulduğundan emin olun.
# Xcode'da yeni proje oluşturun
- Product Name: SecretDemo
- Interface: SwiftUI
- Language: SwiftBurada test amaçlı olarak bir view oluşturuldu.
import SwiftUI
struct ContentView: View {
@State private var apiKey = ""
@State private var showingSecret = false
var body: some View {
VStack(spacing: 30) {
Text("GitHub Secrets Demo")
.font(.largeTitle)
.fontWeight(.bold)
if showingSecret {
VStack {
Text("API Key:")
.font(.headline)
Text(apiKey.isEmpty ? "Yükleniyor..." : apiKey)
.font(.system(.body, design: .monospaced))
.padding()
.background(Color.yellow.opacity(0.2))
.cornerRadius(8)
}
}
Spacer()
Button(action: {
showingSecret.toggle()
}) {
Text(showingSecret ? "API Key'i Gizle" : "API Key'i Göster")
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
}
}
.padding()
.onAppear {
loadAPIKey()
}
}
func loadAPIKey() {
// Build time'da inject edilen değeri okuyoruz
if let key = Bundle.main.infoDictionary?["API_KEY"] as? String {
apiKey = key
} else {
apiKey = "API Key bulunamadı!"
}
}
}
#Preview {
ContentView()
}Info.plist dosyanıza şu satırı ekleyin:
<key>API_KEY</key>
<string>$(API_KEY)</string>
Proje root dizininde Config.xcconfig dosyasını aşağıdaki komut ile oluşturun:
touch Config.xcconfigArdından dosya içeriğini aşağıdaki gibi güncelleyin:
// Local test için
API_KEY = TopSecretKeyInDevelopmentEnvironment
Production için gerekli xcconfig dosyası GitHub Actions ile oluşturulmaktadır.
- Xcode'da projenizi açın
- Sol panelde proje adına (mavi ikon) tıklayın
- PROJECT → SecretDemo seçin
- Info sekmesine gidin
- Configurations bölümünde Debug ve Release için Config dosyasını seçin
Bu aşamaya kadar geldiyseniz projeyi çalıştırdığınızda aşağıdaki gibi bir ekranla karşılaşacaksınız.
# Xcode
*.xcodeproj/xcuserdata/
*.xcworkspace/xcuserdata/
*.xcuserstate
# Config files with secrets
# !!! PRODUCTION ORTAMINDA .gitignore DOSYANIZA '*.xcconfig' DEĞERİNİ EKLEMEYİ UNUTMAYIN !!!
# *.xcconfig
# Build
build/
DerivedData/git init
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/YOUR_USERNAME/SecretDemo.git
git push -u origin main- GitHub repository sayfasında: Settings → Secrets and variables → Actions
- "New repository secret" butonuna tıklayın
- Name:
API_KEY_VALUE - Value:
TopSecretKeyInProductionEnvironment - "Add secret" butonuna tıklayın
.github/workflows/build.yml dosyası oluşturun:
name: iOS Build and Release
on:
push:
branches: [ main ]
jobs:
build:
runs-on: macos-latest
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Create Config file with Secret
run: |
echo "API_KEY = ${{ secrets.API_KEY_VALUE }}" > Config.xcconfig
- name: Build iOS App
run: |
xcodebuild -project SecretDemo.xcodeproj \
-scheme SecretDemo \
-sdk iphonesimulator \
-configuration Debug \
-derivedDataPath ./build \
-xcconfig Config.xcconfig \
build
- name: Create IPA
run: |
cd build/Build/Products/Debug-iphonesimulator
mkdir Payload
cp -R SecretDemo.app Payload/
zip -r ../../../SecretDemo-Simulator.ipa Payload
cd -
- name: Create Release
uses: softprops/action-gh-release@v1
with:
tag_name: build-${{ github.run_number }}
name: "Build #${{ github.run_number }}"
files: |
build/SecretDemo-Simulator.ipa
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}-
Local Development:
Config.xcconfigdosyasında test değerleri tanımlanır- Xcode build sırasında
$(API_KEY_VALUE)değişkeni çözümlenir - Info.plist'teki
$(API_KEY)değeri doldurulur
-
CI/CD Pipeline:
- GitHub Actions workflow tetiklenir
- GitHub Secrets'tan
API_KEY_VALUEalınır - Config.xcconfig dosyası dinamik olarak oluşturulur
- Xcode build sırasında gerçek değer Info.plist'e yazılır
GitHub Secrets (Encrypted)
↓
GitHub Actions (Runtime)
↓
Config.xcconfig (Temporary)
↓
Xcode Build Process
↓
Info.plist (Compiled App)
- Repository sayfasında sağ tarafta "Releases" bölümüne tıklayın
- En son release'i bulun
- Assets bölümünden
SecretDemo-Simulator.ipadosyasını indirin
# ZIP'i açın
unzip SecretDemo-Simulator.ipa
# .app dosyasını Simulator'a yükleyin
xcrun simctl install booted Payload/SecretDemo.app
# Veya Finder'dan sürükle-bırak yapın.app dosyasını simulatöre kurduğunuzda aşağıdaki gibi bir ekranla karşılaşacaksınız. Burada 8. adımda eklediğimiz production ortamına ait gizli veri artık güvenli bir şekilde projemize geliyor.
# YANLIŞ - Config dosyası Git'e eklenmemeli
git add Config.xcconfig
# DOĞRU - .gitignore'a ekleyin
echo "*.xcconfig" >> .gitignoreNeden? Config dosyaları gerçek API key'leri içerebilir. Bir kez commit edilirse Git geçmişinde kalır!
- Repository Settings → Manage access kısmından kimlerin erişimi olduğunu kontrol edin
- Sadece güvendiğiniz kişilere admin/write yetkisi verin
- Secrets'ları düzenli olarak rotate edin (değiştirin)
# Public repo'da bu tehlikeli olabilir:
- name: Debug Config
run: |
cat Config.xcconfig # Secret'ı loglara yazdırırNot: GitHub Actions loglarında secrets otomatik maskelenir ama yine de dikkatli olun!
Production uygulamalar için:
- iOS Keychain kullanın
- Certificate pinning uygulayın
- Encrypted configuration dosyaları kullanın
- Runtime'da API endpoint'ten key alın
- API key'leri düzenli değiştirin (3-6 ayda bir)
- Eski key'leri kullanımdan kaldırın
- Access log'larını kontrol edin
# YANLIŞ - Büyük/küçük harf uyumsuzluğu
${{ secrets.api_key_value }}
# DOĞRU - Tam eşleşmeli
${{ secrets.API_KEY_VALUE }}<!-- Preprocessing kapalıysa çalışmaz -->
<string>$(API_KEY)</string>
<!-- Alternatif: Doğrudan string -->
<string>YOUR_KEY_HERE</string>Deployment öncesi kontrol edin:
- Config dosyaları .gitignore'da mı?
- Secrets düzgün adlandırılmış mı?
- Repository private mı? (hassas projeler için)
- Gereksiz log/debug kodu temizlendi mi?
- Team üyeleri güvenlik politikasını biliyor mu?
- Backup secret recovery planı var mı?
- API rate limit kontrolü yapıldı mı?
Not: Bu tutorial eğitim amaçlıdır. Production ortamında daha gelişmiş güvenlik önlemleri (KeyChain, encrypted storage, certificate pinning vb.) kullanmanız önerilir.
Hatırlatma: Güvenlik bir kerelik iş değil, sürekli bir süreçtir. Düzenli olarak güvenlik pratiklerinizi gözden geçirin ve güncelleyin.