Tekton Pipelines, Continuous Foudation tarafından Kubernetes-native olarak açık kaynak kodlu geliştirilen, Sürekli Entegrasyon (Continuous Integration, CI) ve Sürekli Teslimat (Continuous Delivery, CD) sistemleri oluşturmaya yönelik bir framework’tür. Yenilenebilir, esnek ve parçalı mimarisi ile Kubernetes üzerinde koşması onu diğer CI/CD araçlarının önüne getirmekte.

Özellikle Jenkins kullanıyorsanız, aklınıza gelecek ilk soru neden Tekton pipeline’ına geçiş yapmak isteyebileceğinizdir. Sonuçta Jenkins ile zaten CI/CD süreçlerini işletebiliyorsunuz. Güzel soru… Bu sorunun cevabını anlatabilmem için bir adım geri çekilip anlatmaya başlamamda fayda olacaktır.
Konteynar’ların ve ardından Kubernetes’in gelişmesi ile birlikte monolith dünyadan hızla sıyrılarak uygulamaların birbirinden soyutlandığı, bağımlılıklarının ayrıldığı ve yatayda kolayca büyüyebildikleri bir dünyaya adım attık. Bu makaleyi okuduğunuza göre, bu dünyanın sizi de cezbettiğini söylemem doğru olacaktır. Bu yeni dünyaya geçişin ilk adımı uygulama mimarilerine olan bakış açısının değişmesidir. Durumlarını kendi üstlerinde tutmayan, tercihen durumsuz olan, daha çok da mikro-servis yönelikli uygulamalar geliştirmeye başladık.
Öte yandan, Jenkins kullanıyorsak, Kubernetes üzerinde koşacak uygulamalarınız için hazırladığımız CI/CD pipeline’larımız hala monolith. Yaptığımız tam olarak elektirikli arabaları buharlı makinelerle üretmek… Derleme ajanlarını sanal ya da gerçek sistemler üzerine kuruyoruz. Bir ya da bir kaç adımın gerekli bağımlılıkları ile koşacağı ajan sistemler kuruyoruz. Micro servislerimizin sayısı ve büyüklüğü artıyor. Yeni ekipler kuruyoruz. Tüm bunlar olup biterken oluşan yeni gereksinimleri karşılayacak CI/CD pipeline’larımızı yatayda büyütmenin yolu olarak hala yeni ajan sistemler oluşturmak. Bir taraftan güçlü bir lokomotiv bizi hızla ilerletirken bir kısım vagon’un el freni çekik…
Tekton pipeline’ın parladığı an işte tam da bu an. Konteynar’lara taşınmış pipeline’lar ile ajan sistemlere gereksinim olmaksızın, mevcut Kubernetes Cluster’ımızda CI/CD için yatayda hızlı büyüme sağlıyor. Üstelik Kubernetes yerlisi bir proje olarak, gerekli tüm yapılandırma ve adımları Kubernetes özel kaynak tanımları (Custom Resource Definitions, CRDs) sayesinde Kubernetes Cluster’ı üzerinde tutmakta. Tüm süreci kubectl ve yaml dosyaları ile oluşturabilir, yönetebilirsiniz.
Tekton Kurulumu
Kubernetes Üzerine Kurulum
Önceki paragraflar ardından Tekton Pipeline’ın farkını kafanızda netleştirebildiğimi umuyorum. Şimdi sırada kurulumda. Tek adımlık basit bir kurulum prosedürü olan Tekton Pipeline ön gereksinim olarak bir Kubernetes Cluster’ına ihtiyaç duymakta. Mevcut bir Kubernetes Cluster’ı üzerinde aşağıdaki komutu çalıştırarak kurulumu gerçekleştirebilirsiniz;
kubectl apply -f https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
Bu komut kubectl yardımıyla Tekton Pipeline’ı ve bağımlılıklarının Kubernetes Cluster’ında kurulmasını sağlayacaktır. Aşağıdaki komut kullanılarak Tekton pod’larının hazır duruma gelmesi beklenebilir;
kubectl wait --for='condition=Ready' pods -l app.kubernetes.io/name=tekton-pipelines -n tekton-pipelines
OpenShift Üzerine Kurulum
Kubernetes Cluster’ı üzerine kuruluma benzer şekilde Tekton Pipelines OpenShift Cluster’ı üzerine de kurulabilir. Bunun için OpenShift yöneticisi olarak başlattığınız oturumda öncelikle aşağıdaki komutla tekton-pipelines
adıyla bir proje oluşturmalısınız;
oc new-project tekton-pipelines
Bu projede aşağıdaki şekilde gerekli politikayı oluşturmalısınız;
oc adm policy add-scc-to-user anyuid -z tekton-pipelines-controller
Son olarak gerekli bileşenleri aşağıdaki şekilde kurabilirsiniz;
oc apply --filename https://storage.googleapis.com/tekton-releases/latest/release.yaml
Komut Satırı Arayüzü Kurulumu (Seçimli)
Yukarıdaki kurulum adımına ek olarak isterseniz Tekton Pipelines komut satırı uygulamasını kurabilirsiniz. Bunun için öncelikle aşağıdaki komutu kullanarak güncel sürüm numarasını bulmalıyız;
export CLI_RELEASE=$(curl --silent "https://api.github.com/repos/tektoncd/cli/releases/latest" | grep -Po '"tag_name": "v\K.*?(?=")')
Güncel sürüm numarasını kullanarak Redhat ve Centos işletim sistemleri için aşağıdaki şekilde RPM paketini kurabilirsiniz;
rpm -Uvh https://github.com/tektoncd/cli/releases/download/v${CLI_RELEASE}/cli_${CLI_RELEASE}_Linux-64bit.rpm
Diğer linux dağıtımlarında aşağıdaki komut ile binary paketi indirilebilir;
curl -LO https://github.com/tektoncd/cli/releases/download/v${CLI_RELEASE}/tkn_${CLI_RELEASE}_Linux_x86_64.tar.gz
Ardından path’te tanımlı bir dizine aşağıda örneklediğim şekilde ayıklanır;
sudo tar xvzf tkn_${CLI_RELEASE}_Linux_x86_64.tar.gz -C /usr/local/bin/ tkn

Temel Tekton Kavramları
Tekton Pipelines’ın ana hedefi tekil ya da bir pipeline’ın parçası olan Task‘ı (görevi) çalıştırmaktır. Task bir ya da daha fazla sayıda step (adım) barındırabilir. Tekton her bir task için bir pod, task altındaki her bir step için pod içerisinde bir container oluşturur. Her bir step, task tarafından sırayla işletilecektir.

Pipeline ise bir ya da daha fazla sayıda task’ın bir araya gelmesi ile oluşur. Task’lar farklı node’larda çalışabilir. Step’lerin task tarafından sırasıyla işletilmesinden farklı olarak task’lar pipeline’da 3 farklı şekilde işletilir;
- Ardıl
- Eş Zamanlı
- Grafik
Bir task tek başına sadece adımlardan oluşan bir görev tanımıdır. Task’ın çalışması için TaskRun kaynak nesnesi oluşturulmalıdır. TaskRun, bağlı task’ın tüm step’leri tamamlanana ya da hata alana kadar adımları sırası ile işletecektir. Task’lar gibi pipeline’lar da tek başlarına sadece hangi task’ların çalışacağını ve sırasını belirleyen kaynaklardır. Bir pipeline’ın çalışması için PipelineRun kaynak nesnesi oluşturulmalıdır. Bir PipelineRun kaynak nesnesi oluşturulduğunda bağlı pipeline içerisindeki her bir task için bir TaskRun kaynak nesnesi otomatik olarak oluşturulacaktır.
Bir başka Tekton CRD’si ise PipelineResource’dur. PipelineResource, bir pipeline içerisideki task’lara ait girdi ya da çıktı tanımıdır. PipelineResource nesnesi sayesinde örneğin bir task’a git deposunun adresi girdi olarak verilebilir.
Basit Bir Tektone Pipeline’ı
Bu kadar teorik bilgi ardından aşağıdaki adımları takip ederek Tekton Pipeline’ında “merhaba dünya” örneğimizi yazalım. Örneğimiz bir Ubuntu container’ında echo komutunu kullanarak “merhaba dünya” çıktısını verecek basit bir akış olacak. İlk adımda task tanımını hazırlamalıyız. Teknik olarak baktığımızda Task’lar birer Kubernetes CRD nesnesidir. Dolayısıyla aşağıdaki komutla oluşturacağımız Task CRD dosyası ile işe başlıyoruz;
cat > enterprisecoding-merhaba-dunya-task.yaml <<EOF apiVersion: tekton.dev/v1alpha1 kind: Task metadata: name: task-merhaba-dunya spec: steps: - name: echo image: ubuntu command: - echo args: - "Merhaba Dünya" EOF
Oluşturduğumuz enterprisecoding-merhaba-dunya-task.yaml
dosyası içerisindeki CRD aşağıdaki komutla Kubernetes Cluster’ında tanımlanır;
kubectl apply -f enterprisecoding-merhaba-dunya-task.yaml
Seçimli olarak; tek adımdan oluşan oluşan bu task’ı denemek amacıyla bir TaskRun CRD tanımı oluşturabilirsiniz. Bunun için aşağıdaki komutla ilgili yaml dosyası hazırlanmalıdır;
cat > enterprisecoding-merhaba-dunya-taskrun.yaml <<EOF apiVersion: tekton.dev/v1alpha1 kind: TaskRun metadata: name: taskrun-merhaba-dunya spec: taskRef: name: task-merhaba-dunya EOF
Oluşturduğumuz enterprisecoding-merhaba-dunya-taskrun.yaml
dosyası içerisindeki CRD aşağıdaki komutla Kubernetes Cluster’ında tanımlanır;
kubectl apply -f enterprisecoding-merhaba-dunya-taskrun.yaml
Eğer önceki adımlarda tariflediğim şekilde tekton komut satırı arayüzünü kurduysanız aşağıdaki komutu kullanarak taskrun tanımını görebilirsiniz;
tkn taskrun describe taskrun-merhaba-dunya

Benzer şekilde aşağıdaki komutla taskrun çıktısını görebilirsiniz;
tkn taskrun logs taskrun-merhaba-dunya

Oluşturduğumuz task’ı aşağıdaki komutla oluşturacağımız Pipeline CRD tanımına ekleyebilirsiniz;
cat > enterprisecoding-merhaba-dunya-pipeline.yaml <<EOF apiVersion: tekton.dev/v1alpha1 kind: Pipeline metadata: name: pipeline-merhaba-dunya spec: tasks: - name: merhaba-dunya taskRef: name: task-merhaba-dunya EOF
Oluşturduğumuz enterprisecoding-merhaba-dunya-pipeline.yaml
dosyası içerisindeki CRD aşağıdaki komutla Kubernetes Cluster’ında tanımlanır;
kubectl apply -f enterprisecoding-merhaba-dunya-pipeline.yaml
Pipeline’ı çalıştırmak için aşağıdaki komutla bir PipelineRun CRD nesnesi oluşturulur;
cat > enterprisecoding-merhaba-dunya-pipelinerun.yaml <<EOF apiVersion: tekton.dev/v1alpha1 kind: PipelineRun metadata: name: pipelinerun-merhaba-dunya spec: pipelineRef: name: pipeline-merhaba-dunya EOF
Oluşturduğumuz enterprisecoding-merhaba-dunya-pipelinerun.yaml
dosyası içerisindeki CRD aşağıdaki komutla Kubernetes Cluster’ında tanımlanır;
kubectl apply -f enterprisecoding-merhaba-dunya-pipelinerun.yaml
Eğer önceki adımlarda tariflediğim şekilde tekton komut satırı arayüzünü kurduysanız aşağıdaki komutu kullanarak pipelinerun tanımını görebilirsiniz;
tkn pipelinerun describe pipelinerun-merhaba-dunya

Benzer şekilde aşağıdaki komutla pipelinerun çıktısını görebilirsiniz;
tkn pipelinerun logs pipelinerun-merhaba-dunya

Aşağıdaki komutu kullanarak Tekton Pipelines’ın bizim için oluşturduğu pod’ları görebilirsiniz;
kubectl get pods

Alternatif olarak aşağıdaki komut yardımıyla Tekton Pipeline kaynaklarını görebilirsiniz;
kubectl get tekton-pipelines
