# GitHub Actions ile Gyro Kapsayıcı'ya otomatik deploy: derle, gönder, yayınla

https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-kapsayici-github-actions

- **Bu rehberde ne öğreneceksiniz**: Her `main` dalı güncellemesinde Docker imajınızı derleyip Gyro imaj deposuna göndermeyi, `gyro` komut satırıyla yeni sürümü kesintisiz yayınlamayı ve sorun olursa otomatik geri almayı.
- **Süre**: 12 dakika
- **Kimin için**: Kodu GitHub'da tutan geliştiriciler.
- **Gerekenler**: Çalışan bir Gyro Kapsayıcı servisi ([ilk uygulama](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-kapsayici-ilk-uygulama)), deponuzda bir `Dockerfile`, GitHub'da **Settings > Secrets and variables > Actions** erişimi.

## 1. Yaklaşım

```
git push → GitHub Actions: docker build → docker push (Gyro imaj deposu)
                         → gyro container service update (yeni sürüm, kesintisiz)
                         → kontrol; başarısızsa gyro container service rollback
```

İmajı commit numarasıyla etiketlersiniz; böylece her sürüm sürüm geçmişinde commit'e bağlanır ve geri alma kolaylaşır.

## 2. Hazırlık: gizli değişkenler

1. **İmaj deposu parolası:** Gyro panelinde **İmaj Deposu** sayfasından kullanıcı adını ve parolayı alın ([Gyro imaj deposu](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-kapsayici-imaj-deposu)).
2. **API anahtarı:** Müşteri panelinde hesap menüsünden **API Kimlik Bilgileri**'nde yeni bir anahtar oluşturun; izinlerden **hizmet okuma** ve **yazma** izinlerini işaretleyin. Anahtarı CI için **ayrı** tutun ([Gyro API ile ilk adım](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-api-ilk-adim)).
3. GitHub deposunda **Settings > Secrets and variables > Actions** altında şunları ekleyin:

| Ad | Tür | Değer |
| --- | --- | --- |
| `GYRO_REGISTRY_USER` | Secret | İmaj deposu kullanıcı adı |
| `GYRO_REGISTRY_PASSWORD` | Secret | İmaj deposu parolası |
| `GYRO_TOKEN` | Secret | API anahtarı |
| `GYRO_ENV_ID` | Variable | Kapsayıcı ortam numaranız (ör. `12345`) |
| `GYRO_CODE` | Variable | Adres kodunuz (imaj öneki) |

> **Dikkat**
> 
> Parola ve anahtarları iş akışı dosyasına yazmayın; yalnız `secrets` olarak kullanın. İş akışı günlüklerinde GitHub bu değerleri maskeler.

## 3. İş akışı dosyası

Depoda `.github/workflows/deploy.yml` oluşturun:

```
name: Gyro'ya deploy
on:
  push:
    branches: [main]

env:
  REGISTRY: registry.ist.gyrohosting.com
  SERVICE: web                        # Gyro Kapsayıcı'daki servis adı

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: İmaj deposuna giriş
        run: echo "${{ secrets.GYRO_REGISTRY_PASSWORD }}" | docker login $REGISTRY -u "${{ secrets.GYRO_REGISTRY_USER }}" --password-stdin

      - name: Derle ve gönder
        run: |
          IMAGE=$REGISTRY/${{ vars.GYRO_CODE }}/$SERVICE:${{ github.sha }}
          docker build -t "$IMAGE" .
          docker push "$IMAGE"
          echo "IMAGE=$IMAGE" >> "$GITHUB_ENV"

      - name: gyro CLI kur
        run: |
          curl -fsSL https://www.gyrohosting.com/cli/install.sh | GYRO_INSTALL_DIR="$HOME/.local/bin" sh
          echo "$HOME/.local/bin" >> "$GITHUB_PATH"

      - name: Yeni sürümü yayınla
        env:
          GYRO_TOKEN: ${{ secrets.GYRO_TOKEN }}
        run: |
          gyro container service update ${{ vars.GYRO_ENV_ID }} $SERVICE \
            --image "$IMAGE" --reason "${{ github.sha }}" --yes

      - name: Yayını doğrula (en çok 5 dk)
        env:
          GYRO_TOKEN: ${{ secrets.GYRO_TOKEN }}
        run: |
          for i in $(seq 1 30); do
            STATE=$(gyro container service get ${{ vars.GYRO_ENV_ID }} $SERVICE -o json --query state | tr -d '"')
            echo "durum: $STATE"
            [ "$STATE" = "running" ] && exit 0
            sleep 10
          done
          echo "Yayın tamamlanamadı, önceki sürüme dönülüyor"
          gyro container service rollback ${{ vars.GYRO_ENV_ID }} $SERVICE --yes
          exit 1
```

> **Bilgi**
> 
> Doğrulama adımındaki `state` alanı, `gyro container service get ID AD -o json` çıktısındaki servis durumudur; çıktınızın alan adını önce elle deneyip kontrol edin.

> **Bilgi**
> 
> `gyro` aracının `1.10` ve üstü sürümlerinde `container` komutları bulunur. Kurulum betiği güncel sürümü kurar; belirli bir sürüm için `GYRO_VERSION` ortam değişkenini kullanın ([gyro CLI kurulumu](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-cli-kurulum)).

## 4. Nasıl çalışır?

1. `docker push` imajı **commit numarasıyla** Gyro deposuna gönderir.
2. `gyro container service update` yeni sürümü yayınlar. Kopyalar tek tek yenilenir; yeni kopya sağlık kontrolünü geçmeden eski kopya kapatılmaz (kesintisiz).
3. Doğrulama adımı servis durumu **running** olana kadar bekler. 5 dakikada olmazsa `rollback` ile önceki sürüme döner ve iş akışı **başarısız** işaretlenir.
4. Sürüm geçmişinde her sürümün yanında commit numarası görünür ([Ölçekleme, güncelleme ve geri alma](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-kapsayici-olcekleme-guncelleme-geri-alma)).

## 5. Başka bir depodan imaj çekmek (GHCR)

İmajı Gyro deposu yerine GitHub Container Registry'ye gönderirseniz Gyro tarafında bir kez erişim bilgisi tanımlayın: **Düğüm Havuzu > Özel imaj deposu**'nda `ghcr.io`, kullanıcı adı ve **yalnız çekme (`read:packages`) izinli** bir token girin ya da `gyro container external-registry set ID --server ghcr.io --username KULLANICI --password TOKEN`. İş akışında `docker push ghcr.io/...` yapıp `--image ghcr.io/...` ile yayınlarsınız. Gyro deposunu kullanırsanız bu adıma gerek yoktur.

## 6. Sık sorulan sorular

**unauthorized ile push başarısız, ne yapmalıyım?**

Kullanıcı adı/parola bu ortama ait olmalı ve imaj adı `registry.ist.gyrohosting.com/<kodunuz>/…` ile başlamalı. Parolayı yenilediyseniz GitHub secret'ını güncelleyin.

**Her yayında depo doluyor mu?**

Hayır; otomatik temizlik, son 10 sürümün imajlarını tutar ve kullanılmayanları siler. Gerekirse **Saklanan sürüm** değerini ayarlayın ([imaj deposu](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-kapsayici-imaj-deposu)).

**Staging ve production ortamlarını ayrı tutabilir miyim?**

Her biri için ayrı bir ortam (ya da aynı ortamda ayrı servis) kullanın; iş akışında `GYRO_ENV_ID` ve `SERVICE` değerlerini dal başına değiştirin.

**Gizli değerleri (veritabanı parolası) iş akışından mı vermeliyim?**

Hayır. Bir kez panelden ya da `gyro container secret set` ile girin; yeni sürümlerde korunurlar ([Değişkenler ve gizli değerler](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-kapsayici-degiskenler-ve-gizli-degerler)).

## Sıradaki adım

- [Sık hatalar ve çözümleri](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-kapsayici-sik-hatalar)
- [API, CLI ve Terraform](https://www.gyrohosting.com/bilgi-bankasi/makale/gyro-kapsayici-api-cli-terraform)
