Concourse CI’ı Ubuntu 16.04 Üzerine Kurulum Rehberi
Sürekli Entegrasyon (CI) ve Sürekli Teslimat (CD) süreçleri, modern yazılım geliştirmenin temel taşlarından biridir. Concourse CI, bu süreçleri otomatikleştirmek için tasarlanmış, açık kaynaklı, container tabanlı ve görsel bir CI/CD sistemidir. Basit, güçlü ve esnek yapısıyla karmaşık pipeline’ları bile kolayca yönetmenizi sağlar. Bu kapsamlı rehberde, Concourse CI’ı Ubuntu 16.04 işletim sistemi üzerine adım adım nasıl kuracağınızı ve temel yapılandırmalarını nasıl yapacağınızı öğreneceksiniz. Ubuntu 16.04, uzun süreli destek (LTS) sağlayan ve birçok kurumsal ortamda hala kullanılan stabil bir platformdur.
Concourse CI Nedir ve Neden Kullanılır?
Concourse CI, tamamen container tabanlı bir yaklaşımla çalışır. Her bir görev (task), izole edilmiş bir Docker container’ı içinde çalışır, bu da ortam tutarlılığını ve güvenilirliğini garanti eder. Concourse’un temel felsefesi “her şey bir kaynak (resource) ve her şey bir görev (task)” üzerine kuruludur. Bu yaklaşım, pipeline’larınızı deklaratif bir şekilde tanımlamanıza olanak tanır ve her adımın bağımlılıklarını ve çıktılarını net bir şekilde belirtmenizi sağlar.
Concourse CI’ın Avantajları:
* Container Tabanlı: Her işlem kendi izole container’ında çalıştığı için ortam bağımlılıklarından kaynaklanan sorunlar ortadan kalkar. Bu, “benim makinemde çalışıyordu” sorununu çözmeye yardımcı olur.
* Deklaratif Yapı: Pipeline’lar YAML dosyalarıyla tanımlanır, bu da sürüm kontrol sistemlerinde saklanabilmesini ve kolayca yönetilebilmesini sağlar.
* Görsel Arayüz: Pipeline’larınızı ve mevcut durumlarını görsel bir arayüzden takip edebilirsiniz. Bu, karmaşık iş akışlarını anlamayı ve sorunları gidermeyi kolaylaştırır.
* Esneklik: Geniş bir kaynak (resource) türü yelpazesi sunar (Git, Docker Image, S3, vb.) ve kendi özel kaynak türlerinizi oluşturmanıza olanak tanır.
* Ölçeklenebilirlik: İhtiyaç duyulduğunda ek worker’lar ekleyerek sistemi kolayca ölçeklendirebilirsiniz.
* Tekrarlanabilirlik: Container tabanlı yapısı sayesinde her çalıştırma aynı ortamda gerçekleşir ve bu da tekrarlanabilir sonuçlar elde edilmesini sağlar.
Bu rehber, Concourse’u tek bir Ubuntu 16.04 sunucusu üzerinde docker-compose kullanarak kurmaya odaklanacaktır. Bu yöntem, geliştirme ortamları, küçük takımlar veya Concourse’u denemek isteyenler için idealdir. Üretim ortamları için genellikle BOSH gibi daha gelişmiş dağıtım araçları veya Kubernetes entegrasyonları tercih edilir.
Ön Gereksinimler
Concourse CI’ı Ubuntu 16.04 üzerine kurmadan önce bazı temel ön gereksinimleri karşılamanız gerekmektedir.
Ubuntu 16.04 Sunucusu
* Minimum 2 CPU çekirdeği (tercihen 4+)
* Minimum 4 GB RAM (tercihen 8 GB+)
* Minimum 20 GB disk alanı (build’ler için daha fazlası gerekebilir)
* sudo ayrıcalıklarına sahip bir kullanıcı hesabı
* İnternet bağlantısı
Sistem Güncellemesi
Kuruluma başlamadan önce sisteminizin güncel olduğundan emin olun. Bu, güvenlik açıklarını kapatır ve paket uyumluluğunu sağlar.
sudo apt update
sudo apt upgrade -y
sudo apt dist-upgrade -y
sudo reboot # Gerekliyse sistemi yeniden başlatın
Docker Kurulumu
Concourse CI, container tabanlı çalıştığı için Docker’a ihtiyaç duyar. Ubuntu 16.04 için Docker CE (Community Edition) kurulumunu gerçekleştireceğiz.
1. Gerekli Paketleri Yükleme:
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
2. Docker GPG Anahtarını Ekleme:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
3. Docker APT Deposunu Ekleme:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable"
4. APT Paket İndeksini Güncelleme:
sudo apt update
5. Docker CE Kurulumu:
sudo apt install -y docker-ce
6. Docker Servisini Başlatma ve Etkinleştirme:
Docker genellikle kurulumdan sonra otomatik olarak başlar. Durumunu kontrol edebilir ve etkinleştirebilirsiniz:
sudo systemctl status docker
sudo systemctl enable docker
7. Kullanıcıyı Docker Grubuna Ekleme (İsteğe Bağlı ama Önerilir):
sudo kullanmadan Docker komutlarını çalıştırmak için kullanıcınızı docker grubuna ekleyin. Değişikliklerin etkili olması için oturumu kapatıp tekrar açmanız veya sistemi yeniden başlatmanız gerekebilir.
sudo usermod -aG docker $USER
8. Docker Kurulumunu Test Etme:
docker run hello-world
Bu komut, Docker’ın doğru şekilde çalıştığını gösteren bir test container’ı çalıştıracaktır.
Docker Compose Kurulumu
Concourse’un birden fazla servisten (web, worker, veritabanı) oluşması nedeniyle, bunları yönetmek için Docker Compose kullanacağız.
1. Docker Compose İndirme:
En güncel sürümü Docker Compose GitHub sayfasından kontrol edin. Aşağıdaki örnekte 1.29.2 sürümü kullanılmıştır, ancak daha yeni bir sürüm mevcut olabilir.
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2. Çalıştırılabilir İzinleri Verme:
sudo chmod +x /usr/local/bin/docker-compose
3. Sembolik Bağlantı Oluşturma (İsteğe Bağlı):
Bazen docker-compose komutunun sistem genelinde erişilebilir olması için sembolik bağlantı oluşturmak gerekebilir.
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
4. Docker Compose Kurulumunu Test Etme:
docker-compose --version
Bu komut, yüklü Docker Compose sürümünü göstermelidir.
Concourse CI Kurulumu
Concourse CI’ı docker-compose ile kurmak için bir dizi yapılandırma dosyasına ve anahtara ihtiyacımız olacak.
1. Concourse Dizinini Oluşturma
Tüm Concourse dosyalarını barındıracak bir dizin oluşturalım:
mkdir ~/concourse
cd ~/concourse
2. Kimlik Doğrulama Anahtarları Oluşturma
Concourse, web ve worker bileşenleri arasında güvenli iletişimi sağlamak için SSH anahtarları kullanır. Bu anahtarları oluşturmamız gerekiyor.
mkdir keys
ssh-keygen -t rsa -f ./keys/tsa_host_key -N ''
ssh-keygen -t rsa -f ./keys/web_key -N ''
ssh-keygen -t rsa -f ./keys/worker_key -N ''
cp ./keys/web_key.pub ./keys/authorized_worker_keys
cp ./keys/worker_key.pub ./keys/authorized_worker_keys
Bu komutlar şunları yapar:
* keys adında bir dizin oluşturur.
* tsa_host_key: TSA (Team Synchronization Agent) için ana bilgisayar anahtarı.
* web_key: Concourse web düğümü için anahtar.
* worker_key: Concourse worker düğümü için anahtar.
* authorized_worker_keys: Worker’ların web düğümüne bağlanmasına izin veren ortak anahtarları içerir.
3. Docker Compose Yapılandırma Dosyası (docker-compose.yml)
Concourse web, worker ve PostgreSQL veritabanı servislerini tanımlayacak docker-compose.yml dosyasını oluşturalım.
nano docker-compose.yml
Dosya içeriği aşağıdaki gibi olmalıdır:
version: '3.8'
services:
concourse-db:
image: postgres:9.6
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
environment:
POSTGRES_DB: concourse
POSTGRES_USER: concourse
POSTGRES_PASSWORD: changeme
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- concourse-db-data:/var/lib/postgresql/data/pgdata
ports:
- "5432:5432" # Sadece test amaçlı, üretimde dışarıya açmayın
restart: unless-stopped
concourse-web:
image: concourse/concourse:6.7.0 # Concourse sürümünü kontrol edin ve güncelleyin
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
command: web
ports:
- "8080:8080"
volumes:
- ./keys/web_key:/concourse-keys/web_key
- ./keys/tsa_host_key:/concourse-keys/tsa_host_key
- ./keys/authorized_worker_keys:/concourse-keys/authorized_worker_keys
environment:
CONCOURSE_SESSION_SIGNING_KEY: changeme_session_signing_key # Üretim için benzersiz ve güçlü bir anahtar olmalı
CONCOURSE_EXTERNAL_URL: http://YOUR_SERVER_IP:8080 # Sunucunuzun IP adresi veya alan adı
CONCOURSE_POSTGRES_HOST: concourse-db
CONCOURSE_POSTGRES_USER: concourse
CONCOURSE_POSTGRES_PASSWORD: changeme
CONCOURSE_POSTGRES_DATABASE: concourse
CONCOURSE_BASIC_AUTH_USERNAME: admin
CONCOURSE_BASIC_AUTH_PASSWORD: password # Üretim için güçlü bir şifre kullanın
CONCOURSE_ADD_LOCAL_USER: admin:password # Sadece ilk kurulum için, sonra kaldırılabilir
CONCOURSE_TSA_HOST_KEY: /concourse-keys/tsa_host_key
CONCOURSE_WEB_KEY: /concourse-keys/web_key
CONCOURSE_AUTHORIZED_KEYS: /concourse-keys/authorized_worker_keys
depends_on:
- concourse-db
restart: unless-stopped
concourse-worker:
image: concourse/concourse:6.7.0 # Concourse sürümünü kontrol edin ve güncelleyin
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
command: worker
volumes:
- ./keys/worker_key:/concourse-keys/worker_key
- ./keys/tsa_host_key.pub:/concourse-keys/tsa_host_key.pub
environment:
CONCOURSE_TSA_HOST: concourse-web:2222
CONCOURSE_TSA_PUBLIC_KEY: /concourse-keys/tsa_host_key.pub
CONCOURSE_WORKER_KEY: /concourse-keys/worker_key
privileged: true # Worker'ların Docker içinde Docker çalıştırması için gerekli olabilir
depends_on:
- concourse-web
restart: unless-stopped
volumes:
concourse-db-data:
Önemli Notlar ve Yapılandırma Detayları:
* image: concourse/concourse:6.7.0: Bu rehber yazılırken Concourse 6.7.0 sürümü kullanılmıştır. En güncel ve stabil sürümü Concourse resmi Docker Hub sayfasından kontrol ederek kullanmanız önerilir.
* POSTGRES_PASSWORD: changeme: Bu şifreyi kesinlikle güçlü ve benzersiz bir şifre ile değiştirin.
* CONCOURSE_SESSION_SIGNING_KEY: changeme_session_signing_key: Bu da üretim ortamı için çok önemli bir güvenlik anahtarıdır. Rastgele, uzun ve karmaşık bir dize ile değiştirilmelidir. Örneğin, openssl rand -hex 32 komutu ile oluşturulabilir.
* CONCOURSE_EXTERNAL_URL: http://YOUR_SERVER_IP:8080: YOUR_SERVER_IP kısmını sunucunuzun gerçek IP adresi veya alan adı ile değiştirin. Eğer bir alan adı kullanıyorsanız ve SSL/TLS yapılandırması yapacaksanız https:// ile başlamalıdır.
* CONCOURSE_BASIC_AUTH_USERNAME: admin ve CONCOURSE_BASIC_AUTH_PASSWORD: password: Bu, Concourse’a erişim için varsayılan kullanıcı adı ve şifredir. Üretim ortamında kesinlikle güçlü bir şifre kullanın ve bu temel kimlik doğrulama yerine daha gelişmiş kimlik doğrulama yöntemlerini (GitHub, LDAP, OAuth vb.) tercih edin.
* CONCOURSE_ADD_LOCAL_USER: admin:password: Bu, Concourse’un dahili kullanıcı veritabanına bir kullanıcı eklemek için kullanılır. İlk kurulum için kullanışlıdır ancak daha sonra kaldırılması veya yorum satırı yapılması önerilir.
* privileged: true: Concourse worker’larının build işlemleri sırasında Docker içinde Docker çalıştırması gerekebilir. Bu ayar, container’a daha fazla yetki verir. Güvenlik açısından dikkatli kullanılmalıdır.
4. Concourse’u Başlatma
docker-compose.yml dosyasını kaydettikten sonra, Concourse servislerini başlatabilirsiniz:
docker-compose up -d
* -d parametresi, servisleri arka planda (detached mode) çalıştırmanızı sağlar.
Servislerin durumunu kontrol etmek için:
docker-compose ps
Tüm servislerin Up durumunda olması gerekir.
Logları takip etmek için:
docker-compose logs -f
Concourse UI’a Erişim ve İlk Kullanım
Concourse servisleri çalışmaya başladıktan sonra, web arayüzüne erişebilirsiniz.
1. Web Tarayıcısı ile Erişim:
Web tarayıcınızı açın ve http://YOUR_SERVER_IP:8080 adresine gidin (burada YOUR_SERVER_IP yerine sunucunuzun IP adresini veya alan adını yazın).
Concourse giriş ekranını görmelisiniz. docker-compose.yml dosyasında belirttiğiniz admin kullanıcı adı ve password ile giriş yapın.
2. fly CLI Kurulumu:
fly, Concourse ile etkileşim kurmak için kullanılan komut satırı aracıdır. Concourse web arayüzünün sağ alt köşesinde veya http://YOUR_SERVER_IP:8080/fly adresinde fly CLI için indirme bağlantılarını bulabilirsiniz. Linux (64-bit) sürümünü indirin.
# Concourse UI'dan indirilen fly dosyasını kullanın veya aşağıdaki gibi indirin
wget http://YOUR_SERVER_IP:8080/api/v1/cli?arch=amd64&platform=linux -O fly
chmod +x fly
sudo mv fly /usr/local/bin/
3. fly ile Concourse’a Giriş:
fly CLI’yi kullanarak Concourse hedef sunucunuza giriş yapın:
fly -t main login -c http://YOUR_SERVER_IP:8080 -u admin -p password
* -t main: Hedefin adını main olarak belirler. Birden fazla Concourse ortamınız varsa bu isimleri değiştirebilirsiniz.
* -c http://YOUR_SERVER_IP:8080: Concourse web arayüzünün URL’si.
* -u admin -p password: Giriş yapmak için kullanılan kullanıcı adı ve şifre.
Başarılı bir girişin ardından logged in successfully mesajını görmelisiniz.
4. Basit Bir Pipeline Oluşturma ve Çalıştırma (İsteğe Bağlı):
Concourse kurulumunuzu test etmek için basit bir pipeline tanımlayıp çalıştırabilirsiniz.
hello-world.yml adında bir dosya oluşturun:
nano hello-world.yml
İçeriği:
resource_types:
- name: git
type: docker-image
source:
repository: concourse/git-resource
resources:
- name: my-repo
type: git
source:
uri: https://github.com/concourse/concourse-pipeline-samples.git # Örnek bir repo
jobs:
- name: hello-world
plan:
- get: my-repo
trigger: true
- task: say-hello
config:
platform: linux
image_resource:
type: docker-image
source: {repository: busybox}
run:
path: sh
args: ["-c", "echo Hello from Concourse CI! && ls -la my-repo"]
Pipeline’ı ayarlayın:
fly -t main set-pipeline -p hello-world -c hello-world.yml
Onaylamanız istenecektir, y yazıp Enter’a basın.
Pipeline’ı tetikleyin:
fly -t main trigger-job -j hello-world/hello-world
Pipeline’ın durumunu izleyin:
fly -t main watch -j hello-world/hello-world
Veya Concourse web arayüzünden hello-world pipeline’ını takip edebilirsiniz. Başarılı bir şekilde çalıştığında “Hello from Concourse CI!” çıktısını görmelisiniz.
Concourse’u Yönetme ve Sorun Giderme
Concourse Servislerini Durdurma ve Yeniden Başlatma
* Durdurma:
docker-compose down
Bu komut, container’ları durdurur ve kaldırır, ancak concourse-db-data hacmini (volume) korur.
* Başlatma:
docker-compose up -d
* Yeniden Başlatma:
docker-compose restart
Logları Kontrol Etme
Herhangi bir sorunla karşılaştığınızda, loglar en iyi bilgi kaynağıdır.
Tüm servislerin loglarını takip etme
docker-compose logs -f
Sadece belirli bir servisin loglarını takip etme (örneğin concourse-web)
docker-compose logs -f concourse-web
Sık Karşılaşılan Sorunlar ve Çözümleri
* docker-compose up -d komutu çalışmıyor veya servisler başlamıyor:
* Docker ve Docker Compose’un doğru yüklendiğinden ve çalıştığından emin olun.
* docker-compose logs komutu ile hatayı kontrol edin.
* Port çakışmaları olabilir (örneğin 8080 portu başka bir uygulama tarafından kullanılıyor olabilir).
* docker-compose.yml dosyasındaki yazım hatalarını kontrol edin. YAML formatı boşluklara karşı hassastır.
* Disk alanının yeterli olduğundan emin olun.
* Concourse web arayüzüne erişilemiyor:
* CONCOURSE_EXTERNAL_URL değerinin doğru ayarlandığından emin olun.
* Sunucu güvenlik duvarının (UFW veya başka bir firewall) 8080 portuna gelen bağlantılara izin verdiğinden emin olun:
sudo ufw allow 8080/tcp
sudo ufw enable
* docker-compose ps ile concourse-web servisinin Up durumda olduğunu doğrulayın.
* fly login başarısız oluyor:
* URL’nin ( -c parametresi) doğru olduğundan emin olun.
* Kullanıcı adı ve şifrenin (-u, -p parametreleri) docker-compose.yml dosyasındaki CONCOURSE_BASIC_AUTH_USERNAME ve CONCOURSE_BASIC_AUTH_PASSWORD ile eşleştiğinden emin olun.
* Concourse web servisinin çalıştığından emin olun.
* Worker’lar web servisine bağlanamıyor:
* docker-compose logs concourse-worker komutu ile worker loglarını kontrol edin.
* Anahtar dosyalarının (./keys dizini) doğru oluşturulduğundan ve docker-compose.yml dosyasında doğru yollarla belirtildiğinden emin olun.
* concourse-web ve concourse-worker servislerinin aynı Docker ağında olduğundan emin olun. docker-compose bunu varsayılan olarak yapar.
* Build’ler takılı kalıyor veya başarısız oluyor:
* Worker loglarını kontrol edin.
* privileged: true ayarının concourse-worker servisi için etkin olduğundan emin olun, özellikle Docker içinde Docker çalıştırıyorsanız.
* Yeterli sistem kaynağı (CPU, RAM, disk) olduğundan emin olun.
Güvenlik Hususları
Bu kurulum rehberi, Concourse’u hızlıca çalıştırmak için tasarlanmıştır. Üretim ortamları için aşağıdaki güvenlik önlemlerini dikkate almanız önemlidir:
* Güçlü Şifreler ve Anahtarlar: POSTGRES_PASSWORD, CONCOURSE_SESSION_SIGNING_KEY, CONCOURSE_BASIC_AUTH_PASSWORD gibi tüm şifreleri ve anahtarları güçlü, rastgele ve benzersiz değerlerle değiştirin.
* SSL/TLS Kullanımı: Concourse web arayüzüne HTTPS üzerinden erişimi sağlamak için bir ters proxy (Nginx veya Apache) ve Let’s Encrypt gibi bir sertifika yetkilisi kullanarak SSL/TLS yapılandırması yapın. CONCOURSE_EXTERNAL_URL değerini https:// ile başlayacak şekilde güncelleyin.
* Kimlik Doğrulama Entegrasyonu: Temel HTTP kimlik doğrulaması yerine GitHub, GitLab, LDAP veya OAuth gibi daha güvenli ve merkezi kimlik doğrulama yöntemlerini kullanın.
* Ağ Güvenliği: Concourse servislerinin sadece ihtiyaç duyulan portlardan erişilebilir olduğundan emin olun. Özellikle PostgreSQL veritabanı portunu (5432) dış dünyaya açmaktan kaçının. Concourse web arayüzü portunu (8080), bir ters proxy kullanıyorsanız sadece ters proxy’nin erişebileceği şekilde yapılandırın.
* Kullanıcı ve İzin Yönetimi: Concourse’ta farklı takımlar ve kullanıcılar için uygun izinleri tanımlayın.
* Güncel Tutma: Concourse ve Docker sürümlerini düzenli olarak güncelleyerek güvenlik açıklarını kapatın.
* Log Yönetimi: Logları merkezi bir loglama sistemine (ELK Stack, Grafana Loki vb.) göndererek izlenebilirliği artırın ve güvenlik olaylarını daha hızlı tespit edin.
* Yedekleme: Concourse veritabanını düzenli olarak yedekleyin.
Sonuç
Bu rehberde, Concourse CI’ı Ubuntu 16.04 üzerine docker-compose kullanarak adım adım nasıl kuracağınızı öğrendiniz. Docker ve Docker Compose kurulumundan, Concourse servislerinin yapılandırılmasına, web arayüzüne erişime ve fly CLI kullanımına kadar tüm temel adımları ele aldık. Artık Concourse CI ortamınız hazır ve ilk pipeline’larınızı oluşturmaya başlayabilirsiniz.
Concourse’un gücü, deklaratif pipeline tanımında ve container tabanlı iş yükü yönetiminde yatmaktadır. Bu sayede, yazılım geliştirme süreçlerinizi otomatikleştirebilir, daha hızlı ve güvenilir teslimatlar yapabilirsiniz. Unutmayın ki bu kurulum bir başlangıç noktasıdır; üretim ortamları için güvenlik ve ölçeklenebilirlik konularında ek yapılandırmalar yapmanız gerekecektir. Concourse’un resmi belgeleri, daha derinlemesine yapılandırma ve gelişmiş özellikler hakkında değerli bilgiler sunar. Keşfetmeye devam edin ve CI/CD yolculuğunuzda başarılar dileriz!
