GCR Nedir?

Google Cloud Registry (GCR), Google Cloud Platform (GCP) üzerinde bulunan bir container image depolama hizmetidir. Bu hizmet, container imagelerini yüklemek, depolamak ve yönetmek için kullanılabilir.

GCR, container imagelerinin dağıtımını kolaylaştırır ve geliştiricilere ve operasyon ekiplerine container uygulamalarını yönetmek için bir araç sağlar. GCP üzerinde çalışan uygulamaların container imagelerinin depolanması ve yönetilmesi için Google Cloud Registry, yüksek performanslı, güvenli ve ölçeklenebilir bir çözümdür. Bu sayede uygulamalarınızın hızlı ve güvenli bir şekilde dağıtımını gerçekleştirebilirsiniz.

GCR, Kubernetes gibi popüler container yönetim sistemleriyle uyumlu olarak çalışır ve containerlar için otomatik olarak SSL sertifikaları sağlar. Ayrıca, container imageleri için otomatik olarak güvenlik taraması yaparak güvenlik açıklarını tespit eder ve giderir.

google cloud registry

GCR, özellikle GCP üzerinde çalışan uygulamaların container imagelerinin depolanması ve yönetilmesi için ideal bir seçenektir. Bu hizmet, uygulamalarınızın hızlı, güvenli ve ölçeklenebilir bir şekilde dağıtımını sağlar ve iş yükünüzü azaltarak daha verimli bir şekilde çalışmanıza yardımcı olur.

Sorun Nedir?

Google Cloud Registry üzerinde container imagelarınızı saklıyor olabilirsiniz. Her build işleminizde çıkan image’ı registry üzerine push ettiğinizde ve geriye dönük imageları tuttuğunuzda epey bir alan kaplama söz konusu olabilir. Google Cloud Registry üzerinde bir handle retention policy şu an için yok.

Çözüm Nedir?

Ben derleme, build ve deploy süreçlerinde Jenkins Pipeline kullanıyorum. Sunacağım çözüm her ne kadar jenkins üzerinden olsa da temelde sh komutları barındırdığından ve gcloud cli’ı kullandığından farklı CI/CD süreçlerinize de entegre etmeniz kolaydır.

Gereknisimler

  • Jenkins
  • Gcloud CLI
  • Gcloud Service Account

Öncelikle Gcloud login işlemini pipeline’a yaptırmak istiyorsanız (best practice) Google üzerinde GCR tarafında projenize yetkili olan bir service account oluşturmanız gerekiyor. Service Account’u oluşturduktan sonra çıktı olarak verilen json dosyasını Jenkins üzerine Credentials olarak (Secret file) eklemeniz gerekiyor.

Bu işlemi yaptıktan sonra aşağıdaki gibi bir pipeline işimizi çözecektir.

Jenkins Pipeline

pipeline {
    environment {
        GCR_REPO = 'eu.gcr.io/test-project/test-repository/test-image'
        NUM_TO_DELETE = '2'
    }
    stages {
        stage('Gcloud Login & Docker Login') {
            steps {
                withCredentials([file(credentialsId: 'service-account-secret-credentials', variable: 'GC_KEY')]) {
                    sh "gcloud auth activate-service-account --key-file=${GC_KEY}"
                    sh "gcloud auth configure-docker"
                }
            }
        }
        stage ('Delete old Images on GCR') {
            steps {
               sh '''
                    # Get the tags and find the latest N tags
                    tags=$(gcloud container images list-tags ${GCR_REPO} --format='get(tags)' --sort-by=tags)
                    tag_count=$(echo "${tags}" | wc -l)

                    if [[ ${tag_count} -gt ${NUM_TO_DELETE} ]]; then
                        latest_tags=$(echo "${tags}" | tail -n ${NUM_TO_DELETE} | paste -sd " " -)

                        if [[ -n "${latest_tags}" ]]; then
                            # Delete all tags except the latest N
                            gcloud container images list-tags ${GCR_REPO} --format='get(digest, tags)' --sort-by=date | awk -v latest_tags="${latest_tags}" '
                                BEGIN { split(latest_tags, arr, " "); }
                                !($2 == arr[1] || $2 == arr[2]) {
                                print $1
                                }
                            ' | xargs -I{} gcloud container images delete ${GCR_REPO}@{} --force-delete-tags
                        fi
                    fi
                '''
            }
        }
    }
}

Açıklamalar

  • Yukarıdaki pipeline’ı ilk kısmı inceleyecek olursak; Jenkins üzerine eklemiş olduğumuz service account json secret key’i GC_KEY variable olarak set ettik. Ardından “gcloud auth activate-service-account –key-file=${GC_KEY}” komutu ile gcloud’a login olduk service account’u kullanarak. Daha sonra “gcloud auth configure-docker” komutu ile de docker login işlemini sağladık.
  • Pipeline’ın son kısmında ise daha önce environment olarak set ettiğimiz GCR_REPO ve NUM_TO_DELETE değişkenlerimizi kullanarak registry üzerinden belirttiğimiz sayı kadar container image’ını tutup kalanını sildirme işlemi yaptırdık.

Ayrıca incelemek isterseniz Jenkins ile alakalı yazılarıma bu bağlantıdan ulaşabilirsiniz.