├── .gitignore ├── day-6 ├── python-dockerize │ ├── requirements.txt │ ├── Dockerfile │ └── main.py ├── multi-stage │ ├── hello.c │ └── Dockerfile ├── dockerfile │ └── Dockerfile ├── terraform │ └── main.tf └── README.md ├── day-2 ├── nginx-html │ ├── images │ │ ├── SS-1.png │ │ ├── SS-2.png │ │ ├── SS-3.png │ │ ├── SS-4.png │ │ ├── SS-5.png │ │ ├── SS-6.png │ │ └── SS-7.png │ └── README.md └── README.md ├── day-8 └── README.md ├── README.md ├── day-5 └── README.md ├── day-1 └── README.md ├── day-7 └── README.md ├── day-4 └── README.md └── day-3 └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /day-6/python-dockerize/requirements.txt: -------------------------------------------------------------------------------- 1 | falcon==1.3.0 2 | gunicorn==19.7.1 -------------------------------------------------------------------------------- /day-6/multi-stage/hello.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main() { 4 | puts("Hello World!"); 5 | return 0; 6 | } -------------------------------------------------------------------------------- /day-2/nginx-html/images/SS-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akseyh/devops-bootcamp/HEAD/day-2/nginx-html/images/SS-1.png -------------------------------------------------------------------------------- /day-2/nginx-html/images/SS-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akseyh/devops-bootcamp/HEAD/day-2/nginx-html/images/SS-2.png -------------------------------------------------------------------------------- /day-2/nginx-html/images/SS-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akseyh/devops-bootcamp/HEAD/day-2/nginx-html/images/SS-3.png -------------------------------------------------------------------------------- /day-2/nginx-html/images/SS-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akseyh/devops-bootcamp/HEAD/day-2/nginx-html/images/SS-4.png -------------------------------------------------------------------------------- /day-2/nginx-html/images/SS-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akseyh/devops-bootcamp/HEAD/day-2/nginx-html/images/SS-5.png -------------------------------------------------------------------------------- /day-2/nginx-html/images/SS-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akseyh/devops-bootcamp/HEAD/day-2/nginx-html/images/SS-6.png -------------------------------------------------------------------------------- /day-2/nginx-html/images/SS-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/akseyh/devops-bootcamp/HEAD/day-2/nginx-html/images/SS-7.png -------------------------------------------------------------------------------- /day-6/multi-stage/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu AS compiler 2 | RUN apt update 3 | RUN apt install -y build-essential 4 | 5 | COPY hello.c / 6 | RUN make hello 7 | 8 | 9 | FROM ubuntu 10 | COPY --from=compiler /hello /hello 11 | CMD /hello -------------------------------------------------------------------------------- /day-6/python-dockerize/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.6 2 | 3 | COPY requirements.txt requirements.txt 4 | 5 | # COPY ile requirements.txt'yi kopyaladığım için burada kullanabilirim. 6 | RUN pip install -r requirements.txt 7 | 8 | COPY main.py main.py 9 | 10 | # python ile alakalı komutlar 11 | CMD gunicorn -b 0.0.0.0:8000 main:api -------------------------------------------------------------------------------- /day-6/dockerfile/Dockerfile: -------------------------------------------------------------------------------- 1 | # docker run -it ubuntu 2 | FROM ubuntu 3 | 4 | RUN apt update 5 | 6 | # RUN apt install figlet -y 7 | RUN ["apt", "install", "figlet", "-y"] 8 | 9 | ENTRYPOINT ["figlet"] 10 | 11 | # Build edildiğinde CMD çalışmaz not olarak eklenir. 12 | # Container run edildiğinde ilk çalışacak olan komuttur. 13 | # Dockerfile içerisinde iki CMD olursa sonuncusu geçerli olur. 14 | # CMD figlet merhaba // bu şekilde de kullanılır fakat sonuç figlet /bin/bash merhaba olacaktır. !! 15 | CMD ["merhaba"] -------------------------------------------------------------------------------- /day-6/python-dockerize/main.py: -------------------------------------------------------------------------------- 1 | import falcon 2 | import random 3 | import os 4 | import time 5 | 6 | waitTime = int(os.environ.get('WAIT_TIME', '2')) 7 | 8 | 9 | class RandomGenerator(object): 10 | def on_get(self, request, response): 11 | time.sleep(waitTime) 12 | number = random.randint(0, 100) 13 | result = {'lowerLimit': 0, 'higherLimit': 100, 'number': number} 14 | response.media = result 15 | 16 | 17 | api = falcon.API() 18 | api.add_route('/number', RandomGenerator()) 19 | -------------------------------------------------------------------------------- /day-6/terraform/main.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | docker = { 4 | source = "kreuzwerker/docker" 5 | version = "2.20.2" 6 | } 7 | } 8 | } 9 | 10 | provider "docker" { 11 | # Configuration options 12 | } 13 | 14 | resource "docker_image" "api" { 15 | name = "guray/benkimim:0.2" 16 | } 17 | 18 | resource "docker_container" "api" { 19 | name = "api" 20 | image = docker_image.api.name 21 | restart = "always" 22 | ports { 23 | internal = "8000" 24 | external = "8000" 25 | } 26 | } 27 | 28 | output "container_ip" { 29 | value = docker_container.api.network_data[0].ip_address 30 | } -------------------------------------------------------------------------------- /day-8/README.md: -------------------------------------------------------------------------------- 1 | # DevOps Bootcamp Day#8 2 | 3 | ## Kubernetes Networking 4 | 5 | ### Servis tipleri 6 | **ClusterIP**: Sadece içeriden erişilen bir IP adresi kullanılır. 7 | 8 | **NodePort**: ClusterIP açar ve her makinede sabit olan bir port seçer ve dinler, hangisine istek gelirse gelsin isteği ilgili porta gönderir. 9 | 10 | **Load Balancer**: Cloud load balancer açar istenen portu dinleyerek içerideki portlara yönlendirir. 11 | 12 | ## Jobs 13 | * **Batch Jobs**: Tek seferlik çalışır. 14 | * **Cron Jobs**: Zaman ayarlı batch job çalıştırır. 15 | 16 | ## Komutlar 17 | Tüm contextleri göster 18 | `kubectl config get-context` 19 | 20 | Aktif contexti göster 21 | `kubectl config current-context` 22 | 23 | Dry Run 24 | `kubectl apply --dry-run=server -f ...` 25 | 26 | `--dry-run=server`: Server ile yaml kıyaslaması yapar. Bir değişiklik yapmaz. 27 | 28 | ## Notlar 29 | * `kubectl logs` default olarak maksimum 5 request sınırı vardır. `--max-log-requests` parametresi ile override edilebilir. 30 | * Ingress layer 7'de çalışır. Gelen trafiği gerekli yerlere yönlendirir. Servis listesinde gelmez. `kubectl get ingress` ile listenebilir. 31 | 32 | ## Keywords 33 | * **declarative vs imperative** 34 | * **gcp anthos** 35 | * **gcp service accounts** 36 | * **k3d** 37 | * **KinD (kubernetes in docker)** 38 | * **MicroK8s** 39 | * **Minikube** 40 | * **DaemonSets** 41 | * **Healtchecks** 42 | * **Stateful Set** 43 | * **helm**: The package manager for Kubernetes 44 | 45 | ## Other Resources 46 | * [GCE Terraform Tutorials](https://learn.hashicorp.com/tutorials/terraform/gke) 47 | * [learn-terraform-provision-gke-cluster](https://github.com/hashicorp/learn-terraform-provision-gke-cluster/blob/main/vpc.tf) 48 | * [k8slens](https://k8slens.dev) 49 | * [YT: Ahmet Alp Balkan](https://www.youtube.com/c/ahmetb) 50 | * [roadmap.sh](https://roadmap.sh/devops) 51 | * [Amazon Up And Running](https://www.oreilly.com/library/view/kubernetes-up-and/9781098110192/) 52 | * [The Book Of Kubernetes](https://www.oreilly.com/library/view/the-book-of/9781098141394/) 53 | * [Kubernetes in Action](https://www.oreilly.com/library/view/kubernetes-in-action/9781617293726/) 54 | * [UNIX and Linux System Administration Handbook](https://www.amazon.com/UNIX-Linux-System-Administration-Handbook/dp/0131480057) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # devops-bootcamp 2 | 3 | > DevOps Bootcamp sürecinde aldığım notlar. 4 | 5 | ### Hafta #1: 6 | 7 | #### Konular 8 | * DevOps kavramı, iş tanımı 9 | * Temel DevOps prensipleri 10 | * Linux, network, security ve diğer konularda ön gereksinimlere ek tekrarlar ve uygulamalar 11 | * Python'un DevOps alanındaki kullanımı, kullanılan kütüphane ve örnekler 12 | 13 | #### Notlar 14 | * [Gün #1](day-1/README.md) 15 | * [Gün #2](day-2/README.md) 16 | 17 | #### Uygulamalar 18 | * [nginx ile html dosyası serve etmek](day-2/nginx-html/) 19 | 20 | - - - - 21 | 22 | ### Hafta #2: 23 | 24 | #### Konular 25 | * Continuous integration, continuous deployment kavramları 26 | * Jenkins, GitLab CI, GitHub Actions ve diğer çözümlerin tanıtımı 27 | * Jenkins kurulumu ve pipeline türleri 28 | * Pipeline hazırlanması, paralel ve seri çalıştırılan işler 29 | * Environment değişkenleri, configler, sunucu credentiallerinin saklanması 30 | * Çoklu branch yapısının kullanımı 31 | * Örnek bir pipeline hazırlanması, otomatik tetiklenmesi, testlerin çalıştırılıp sunucuya gönderilmesi 32 | 33 | #### Notlar 34 | * [Gün #3](day-3/README.md) 35 | * [Gün #4](day-4/README.md) 36 | 37 | - - - - 38 | 39 | ### Hafta #3: 40 | 41 | #### Konular 42 | * Container teknolojileri ve Docker eğitimi 43 | * Container kavramı, yapısı, container teknolojileri (Docker, containerd vs anlatımı, farkların açıklanması) 44 | * Container oluşturma ve prensipleri 45 | * Dockerfile kavramı 46 | * Containerlar ve 12 factor mimarisi 47 | * GCP 1. kısım - VM'ler ve port açma işlemleri 48 | * IaC kavramı, Terraform'a giriş ve Docker provider ile uygulamalar, Terraform ile GCP kullanımı 49 | 50 | #### Notlar 51 | * [Gün #5](day-5/README.md) 52 | * [Gün #6](day-6/README.md) 53 | 54 | #### Uygulamalar 55 | * [Dockerfile](day-6/dockerfile/Dockerfile) 56 | * [Python Dockerize](day-6/python-dockerize) 57 | * [Multi Stage](day-6/multi-stage) 58 | * [Terraform](day-6/terraform) 59 | - - - - 60 | 61 | ### Hafta #4: 62 | 63 | #### Konular 64 | * Kubernetes eğitimi 65 | * Orkestrasyon kavramı 66 | * HA kavramı, control plane ve data plane kavramları 67 | * Pod, deployment, service gibi yapılar 68 | * Ölçekleme, yatay ve dikey ölçekleme, kaynak kısıtlamalar 69 | * Operator yapısı ve helm 70 | * GKE cluster kurulumu, bağlantı, temel özellikler 71 | * GKE üzerinde yetkilendirme, node pool yapısı 72 | 73 | #### Notlar 74 | * [Gün #7](day-7/README.md) 75 | * [Gün #8](day-8/README.md) 76 | -------------------------------------------------------------------------------- /day-5/README.md: -------------------------------------------------------------------------------- 1 | # DevOps Bootcamp Day#5 2 | 3 | ## Docker Kurulumu 4 | `apt install docker.io` 5 | veya 6 | `curl -sSL https://get.docker.com | bash` 7 | 8 | --- 9 | 10 | ## Notlar 11 | * Docker, container açmayı ve kapatmayı ve yönetmeyi sağlayan bir araçtır. 12 | * Container açmak sistemde yetki gerektiren bir işlem. 13 | * Komut satırından docker komutu girmek yerine örneğin Python ile Docker API'a istek atılarak kullanılabilir. 14 | * Sistem paket veritabanı dizini: `/etc/apt/sources.list.d` 15 | * `SIGINT`: uygulamaya kapanmanı istiyorum sinyali gönderir. 16 | * `SIGKILL`: uygulamanın fişini çeker. 17 | 18 | --- 19 | 20 | ## Komutlar 21 | Docker Client/Server Info 22 | `docker info` 23 | 24 | --- 25 | 26 | Docker ile nginx ayağa kaldırma 27 | `docker run -it nginx` 28 | 29 | --- 30 | 31 | Kullanıcıya docker yetkisi vermek 32 | `usermod -aG docker ubuntu` 33 | > Bu komut ile kullanıcı root yetkilerine sahip olmadan root komutlarına erişebilir. 34 | 35 | --- 36 | 37 | Docker başlatmak 38 | `systemctl start docker` 39 | 40 | --- 41 | 42 | Sistem açıldığında docker açılması için 43 | `systemctl enable docker` 44 | 45 | --- 46 | 47 | Docker busybox çalıştır 48 | `docker run busybox echo hello world` 49 | 50 | --- 51 | 52 | Çalıştırılan imajın komut satırına erişmek 53 | `docker run -it ubuntu` 54 | `-i`: klavyede basılan tuşları container'a iletiyor. 55 | `-t`: komut satırı ekranını sağlıyor. 56 | 57 | --- 58 | 59 | Şuan çalışan containerları listeleme 60 | `docker ps` 61 | `-a`: çalışan ve çalışmayan containerları listeleme 62 | `-q`: sadece idleri döndürür 63 | `-l`: last 64 | 65 | --- 66 | 67 | Container'ı arkaplanda çalıştırma 68 | `docker run -d jpetazzo/clock` 69 | `-d`: detached 70 | 71 | --- 72 | 73 | Docker loglarını canlı takip etme 74 | `docker logs -f kind_blackwell` 75 | `docker logs --tail 3 kind_blackwell`: Son 3 satırı listeler 76 | 77 | --- 78 | 79 | Docker stop komutu 80 | Containerın kapanması için 10sn bekler (SIGINT). Hala çalışmaya devam ediyorsa fişini çeker (SIGKILL). 81 | 82 | --- 83 | 84 | Docker kill komutu 85 | Containerın fişini çeker (SIGKILL). 86 | 87 | --- 88 | 89 | `-it` ile çalıştırdığımız container'ın komut satırından ayrılmak 90 | Detach: `Ctrl + P` + `Ctrl + Q` 91 | 92 | --- 93 | 94 | Arkaplandaki containera bağlanmak 95 | Attach: `docker attach {container_id}` 96 | 97 | --- 98 | 99 | ## Keywords 100 | * **container** 101 | * **containerd** 102 | * **cri-o** 103 | * **podman** 104 | * **artifact** 105 | * **busybox** 106 | * **Docker Names Generator (Go)** 107 | * **alpine** 108 | * **log to stdout** 109 | 110 | --- 111 | 112 | ## Other Resources 113 | * [Docker ve Container Eğitim Serisi](https://www.youtube.com/playlist?list=PLijRwDfUJ_btzGLKV_VdVdHI75Q_X-eQh) 114 | * [Introduction to Containers](https://container.training/intro-selfpaced.yml.html) 115 | * [Cloud Native Landscape](https://l.cncf.io/) 116 | * [Play With Docker](https://labs.play-with-docker.com/) -------------------------------------------------------------------------------- /day-1/README.md: -------------------------------------------------------------------------------- 1 | # DevOps Bootcamp Day#1 2 | 3 | ## ÖNEMLİ LINUX KOMUTLARI 4 | 5 | ### Komut satırı başlığı değiştirmek 6 | `export PS1=‘komut: ‘` 7 | 8 | ### Login olan userları yazdırmak 9 | * w 10 | * who 11 | * lastlog 12 | 13 | ### Komutları loglama 14 | `script kayit.log` ile başlatılır `exit` komutu ile sonlandırılır. 15 | 16 | ### Dosya detayı 17 | `file kayit.log` 18 | 19 | ### Dosya İçeriği Yazdırmak İçin 20 | * cat 21 | * vim 22 | * nano 23 | * less 24 | * more 25 | * head 26 | * tail -15 27 | 28 | ### Dizin konumu öğrenme 29 | `pwd` 30 | 31 | ### Değişkenler 32 | ```bash 33 | echo $PWD 34 | echo $USER 35 | echo $SHELL 36 | ``` 37 | 38 | ### grep detaylı kullanımı 39 | `ls --help | grep -- -l` 40 | 41 | ### word count 42 | -l komutu ile satır sayar 43 | `wc -l` 44 | 45 | ### make directory 46 | -p: parent 47 | ```bash 48 | mkdir -p 49 | ``` 50 | 51 | ### Kullanışlı shell komutu 52 | ```bash 53 | mkdir -p fotograflar/{ocak,subat,mart} 54 | ``` 55 | veya 56 | ```bash 57 | mkdir -p fotograflar/{1..10} 58 | mkdir -p fotograflar/{a..z} 59 | ``` 60 | 61 | Shell bu komutu aşağıdaki şekilde düzenler. 62 | ```bash 63 | mkdir -p fotograflar/ocak fotograflar/subat fotograflar/mart 64 | ``` 65 | 66 | ### Dizini iç içe listeleme 67 | `ls -R` 68 | -R: recursive 69 | 70 | ### stdin & stdout & stderr 71 | **>** (Output forwarding) 72 | Save output to a file. 73 | **>>** 74 | Append output to a file. 75 | **<** (Stdin) 76 | Read input from a file. 77 | **1>** (Stdout) 78 | Redirect output messages. 79 | **2>** (Stderr) 80 | Redirect error messages. 81 | **&>** (Stderr) 82 | Redirect output and error messages. 83 | **|** (Pipe) 84 | Send the output from one program as input to another program. 85 | **stdout** 86 | Ekran da bir app olarak dev (device) dizininde mevcut. Çıktıyı `/dev/stdout`’a yönlendirirsek ekrana yazılacaktır. 87 | ```bash 88 | echo 'hello' > /dev/stdout 89 | ``` 90 | [Learn Piping and Redirection - Linux Tutorial](https://ryanstutorials.net/linuxtutorial/piping.php) 91 | 92 | ## Vim Komutları 93 | **i**: insert 94 | **v**: visual 95 | **yyp**: alt satıra kopyala 96 | 97 | ### vim satır numarası açma/kapatma 98 | `set number` 99 | `set number!` 100 | 101 | ### Sunucuyu yeniden başlatma 102 | `reboot` 103 | 104 | ### Sunucuyu kapatma 105 | `poweroff` 106 | 107 | ## Other Resources 108 | * [UNIX and Linux System Administration Handbook : Nemeth, Evi, Snyder, Garth, Hein, Trent R., Whaley, Ben, Mackin, Dan: Amazon.com.tr: Kitap](https://www.amazon.com.tr/UNIX-Linux-System-Administration-Handbook/dp/0134277554) 109 | * [FREE 4 Hour Ubuntu Course for Beginners](https://www.youtube.com/watch?v=t7uvq6z41Ro) 110 | * [Linux Operating System - Crash Course for Beginners](https://www.youtube.com/watch?v=ROjZy1WbCIA&t=2s) 111 | * [The 50 Most Popular Linux & Terminal Commands - Full Course for Beginners](https://www.youtube.com/watch?v=ZtqBQ68cfJc&t=10811s) 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /day-6/README.md: -------------------------------------------------------------------------------- 1 | # DevOps Bootcamp Day#6 2 | 3 | ## Dockerfile 4 | **Direktifler (Directives)** 5 | * FROM 6 | * RUN 7 | * CMD 8 | * ENTRYPOINT 9 | 10 | --- 11 | 12 | ## Bir imajın boyutunu nasıl düşürürüz? 13 | Dockerfile içerisinde RUN direktifi ile 14 | `apt install ... && ... && apt remove ...` 15 | şeklinde komutlar görebiliriz. 16 | Bu komutlar gerekli paketleri indirip işini hallettikten sonra paketleri siler. 17 | 18 | --- 19 | 20 | ## Terraform 21 | **Infrastructure as Code** 22 | Terraform gerekli paketleri indirme 23 | `terraform init` 24 | 25 | Plan oluşturma 26 | `terraform plan` 27 | 28 | Plan uygulama 29 | `terraform apply` 30 | 31 | --- 32 | 33 | ## Network Drivers 34 | * bridge (default) 35 | * null (for the special network called none) 36 | * host (for the special network called host) 37 | * container (that one is a bit magic!) 38 | 39 | --- 40 | 41 | ## Notlar 42 | * Dockerfile dosyasında herhangi input bekleyen bir durum olmamalı. 43 | * Docker build yaptığımızda CMD çalışmaz, not olarak eklenir. 44 | * Bir Dockerfile içerisinde iki CMD direktifi olursa sonuncusu geçerli olur. 45 | * ENTRYPOINT ve CMD yan yana çalışır. CMD'e verdiğiniz komutlar ENTRYPOINT'in parametresi olur. 46 | * Containerların kendilerine ait sanal ip adresleri olur. 47 | 48 | --- 49 | 50 | ## Komutlar 51 | Containerdan image üretmek 52 | `docker commit {container_id}` 53 | 54 | --- 55 | 56 | Image'a name ve tag eklemek 57 | `docker tag {image_id} sems/new_name:latest` 58 | 59 | --- 60 | 61 | Dockerfile build etmek 62 | `docker build .` 63 | 64 | tag ile build etmek 65 | `docker build -t sems/new_name .` 66 | 67 | `--no-cache`: cache kullanma 68 | 69 | --- 70 | 71 | Kendi bilgisayarımızdan container'ın içerisine dosya kopyalama 72 | `docker cp main.c {container_id}:/tmp` 73 | 74 | --- 75 | 76 | Çalışan process'e ellemeden container içerisinde komut çalıştırma 77 | `docker exec -it {container_id} /bin/bash` 78 | 79 | --- 80 | 81 | Bulunduğu makinenin network'unu kullanabilen container çalıştırma 82 | `docker run -it --network host alpine` 83 | 84 | > Container'ın network izolasyonu olmaz 85 | 86 | --- 87 | 88 | Container'ın detaylarını öğrenmek 89 | `docker inspect {container_id}` 90 | 91 | --- 92 | 93 | Container'ı dış dünyaya yönlendirme 94 | `docker run -d --name web -p 8080:80 nginx` 95 | 96 | > web adında nginx image'ı ile container çalıştırır. 97 | > Sunucumuzun ip adresinin 8000 portundan bu container'a erişebiliriz. 98 | 99 | --- 100 | 101 | Volume listeleme 102 | `docker volume ls` 103 | 104 | Volume oluşturma 105 | `docker volume create static` 106 | 107 | Container çalıştırırken static adındaki volume ile localdeki data dizinini bağlamak 108 | `docker run -it -v static:/data alpine` 109 | 110 | `docker run -v $PWD:/usr/share/nginx/html -d --name web -p 80:80 nginx` 111 | 112 | --- 113 | 114 | Container içerisinde ENVIRONMENT değişkenlerini kullanma 115 | `docker run -it --rm -e DB_HOST=localhost alpine` 116 | 117 | --- 118 | 119 | ## Keywords 120 | * **Dockerfile** 121 | * **dind (Docker in Docker)** 122 | * **multi-stage build** 123 | * **service discovery** 124 | * **bind mount** 125 | 126 | --- 127 | 128 | ## Other Resources 129 | * [Postgres Dockerfile](https://github.com/docker-library/postgres/blob/master/15/alpine/Dockerfile) 130 | * [Terraform](https://www.terraform.io/) 131 | * [Learn HashiCorp](https://learn.hashicorp.com/) -------------------------------------------------------------------------------- /day-7/README.md: -------------------------------------------------------------------------------- 1 | # DevOps Bootcamp Day#7 2 | 3 | ## Komutlar 4 | 5 | ### Kubectl ile container yayına almak 6 | 7 | 1. k3s kurulumu 8 | ```bash 9 | curl -sfL https://get.k3s.io | sh - 10 | ``` 11 | 12 | 2. nginx container'ı ile deployment oluşturma 13 | ```bash 14 | kubectl create deployment anasayfa --image nginx 15 | ``` 16 | 17 | 3. Ölçeklendirme 18 | ```bash 19 | kubectl scale deployment anasayfa --replicas=3 20 | ``` 21 | 22 | 4. Containerı load balancer ile dış dünyaya açmak 23 | ```bash 24 | kubectl expose deployment anasayfa --port 80 --type NodePort 25 | ``` 26 | 27 | 5. Servisleri görüntüle 28 | ```bash 29 | kubectl get service 30 | ``` 31 | 32 | --- 33 | 34 | Servisleri görüntüle 35 | ```bash 36 | kubectl get service 37 | ``` 38 | 39 | Podları görüntüle 40 | ```bash 41 | kubectl get pod 42 | ``` 43 | 44 | > **Pod İsimlendirme** 45 | > [UYGULAMA_ADI]-[REPLICA_SET_ADI]-[POD_ADI] 46 | 47 | Makineleri görüntüle 48 | ```bash 49 | kubectl get node 50 | ``` 51 | 52 | yaml çıktı almak 53 | ```bash 54 | kubectl get node -o yaml 55 | ``` 56 | 57 | explain 58 | ```bash 59 | kubectl explain node 60 | ``` 61 | 62 | describe 63 | ```bash 64 | kubectl describe node bootcamp 65 | ``` 66 | 67 | Cluster Info 68 | ```bash 69 | kubectl cluster-info 70 | ``` 71 | 72 | Kubectl ile ping atan bir pod ayağa kaldırmak 73 | ```bash 74 | kubectl run pingpong --image alpine ping 127.0.0.1 75 | ``` 76 | 77 | Pod loglarını yazdırmak 78 | ```bash 79 | kubectl logs pingpong --tail 1 -f 80 | ``` 81 | 82 | Bulunduğun namespacedeki service, deployment, replicaSet ve podları görüntüle 83 | ```bash 84 | kubectl get all 85 | ``` 86 | 87 | Pod label değiştirme 88 | > * Label sonuna - koyarsak labelı siler. 89 | > * Selector, app ve pod-template-hash labellarına göre filtreleme yapar. 90 | 91 | ```bash 92 | kubectl label pod pingpong-5c5fddf95d-v4nwc pod-template-hash- 93 | ``` 94 | 95 | ```bash 96 | kubectl label pod pingpong-5c5fddf95d-v4nwc team=backend 97 | ``` 98 | 99 | 100 | ## Notlar 101 | * Kubernetes ve kubectl çoğu zaman REST API üzerinden haberleşiyor. 102 | * DevOps görevlerinden biri kubernetes versiyonunu kontrol etmek. 103 | * Kubernetes versiyonu 1.15 ise kubectl versiyonu 1.14.Y veya 1.16.Y olabilir. 104 | * Kubeconfig directory: `~/.kube/config` 105 | * `export KUBECONFIG=/etc/rancher/k3s/k3s.yaml` 106 | * Kubernetes containerların kullanabileceği kaynak limtilerini belirleyebiliriz. 107 | * Podlar ölçeklenemez. 108 | * **Deployment** -> **ReplicaSet** -> **Pod** 109 | 110 | ## Keywords 111 | * **Docker Swarm** 112 | * **Kubectl** 113 | * [semantic versioning](https://semver.org/) 114 | * **OpenShift** - **OKD** 115 | * **RKE** / **RKE2 (Rancher Kubernetes Engine)** 116 | * **GKE (Google Kubernetes Engine )** 117 | * **EKS (Elastic Kubernetes Service)** 118 | * **AKS (Azure Kubernetes Service)** 119 | * [k3s](https://k3s.io/) 120 | * **rolling release**, **rollout** / **rollback** 121 | * **OOM (Out of Memory)** 122 | * **OOMkiller** 123 | * **Batch jobs** 124 | * **etcd (key-value db)** 125 | * [fork bomb](https://www.cyberciti.biz/faq/understanding-bash-fork-bomb/) 126 | 127 | ## Other Resources 128 | * [Introduction to Kubernetes](https://container.training/kube-selfpaced.yml.html) 129 | * [DockerCoins](https://github.com/jpetazzo/container.training/tree/main/dockercoins) 130 | * [Kubernetes The Hard Way](https://github.com/kelseyhightower/kubernetes-the-hard-way) 131 | * [Install Kubernetes](https://kubernetes.io/docs/tasks/tools/) 132 | * [Kubectl Permissions](https://rancher.com/docs/k3s/latest/en/installation/install-options/how-to-flags/) -------------------------------------------------------------------------------- /day-4/README.md: -------------------------------------------------------------------------------- 1 | # DevOps Bootcamp Day#4 2 | 3 | ## Pipeline Script 4 | 5 | **agent** 6 | Buildi ana node ile çalıştırmak yerine alt agentlar oluşturarak bunlarda çalıştırıyoruz. Agentlara bazı labellar vererek belli labela sahip olan agent ile çalıştırmak gibi seçenekler var. 7 | ```groovy 8 | agent { 9 | label 'linux' 10 | } 11 | ``` 12 | 13 | **environment** 14 | Global olarak veya stage içerisinde environment tanımlaması yapılabilir. 15 | ```groovy 16 | pipeline { 17 | agent any 18 | 19 | environment { 20 | GLOBAL_ENVIRONMENT="PROD" 21 | } 22 | 23 | stages { 24 | stage('Yedekle') { 25 | environment { 26 | STAGE_ENVIRONMENT="TEST" 27 | } 28 | steps { 29 | echo 'Stage 1:' 30 | sh 'echo GLOBAL_ENVIRONMENT: $GLOBAL_ENVIRONMENT' // PROD 31 | sh 'echo STAGE_ENVIRONMENT: $STAGE_ENVIRONMENT' // TEST 32 | } 33 | } 34 | stage('Guncelle') { 35 | steps { 36 | echo 'Stage 2:' 37 | sh 'echo GLOBAL_ENVIRONMENT: $GLOBAL_ENVIRONMENT' // PROD 38 | sh 'echo STAGE_ENVIRONMENT: $STAGE_ENVIRONMENT' // !!NOT ACCESSIBLE!! 39 | } 40 | } 41 | } 42 | } 43 | ``` 44 | > **sh komutunda tek tırnak ve çift tırnak kullanımı farkı:** 45 | > Tek tırnak shell'e yorumlaması için direk değişkeni gönderiyor. 46 | > Çift tırnak value değerini bularak onu gönderiyor. 47 | > 48 | > Tek tırnak kullanmak değişkeni görüntülemek ve buildin patlamaması için daha kullanışlı. 49 | 50 | **input** 51 | Stagelerde kullanıcıdan input almak için kullanılır 52 | ```groovy 53 | input { 54 | message 'Devam edilsin mi?' 55 | ok 'Evet' 56 | } 57 | ``` 58 | 59 | **matrix** 60 | Matris şeklinde çok sayıda işlemi tanımlamak için kullanılır 61 | ```groovy 62 | matrix { 63 | axes { 64 | axis { 65 | name 'PLATFORM' 66 | values 'linux', 'mac', 'windows' 67 | } 68 | axis { 69 | name 'BROWSER' 70 | values 'chrome', 'firefox', 'opera' 71 | } 72 | } 73 | } 74 | ``` 75 | 76 | Daha fazla bilgi için: [Snippet Generator](https://opensource.triology.de/jenkins/pipeline-syntax/) 77 | 78 | 79 | ## Komutlar 80 | 81 | ### Jenkins Docker Kurulumu 82 | Docker içerisinde jenkinsin kullanacağı bir docker oluşturur. 83 | ```bash 84 | docker run --name jenkins-docker --rm --detach \ 85 | --privileged --network cicd --network-alias docker \ 86 | --env DOCKER_TLS_CERTDIR=/certs \ 87 | --volume jenkins-docker-certs:/certs/client \ 88 | --volume jenkins-data:/var/jenkins_home \ 89 | --publish 2376:2376 \ 90 | docker:dind --storage-driver overlay2 91 | ``` 92 | 93 | ```bash 94 | docker run --name jenkins-blueocean --restart=on-failure --detach --network cicd --env DOCKER_HOST=tcp://docker:2376 --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 --publish 8080:8080 --publish 50000:50000 --volume jenkins-data:/var/jenkins_home --volume jenkins-docker-certs:/certs/client:ro jenkins/jenkins:2.346.3-jdk11 95 | ``` 96 | 97 | **initial password** 98 | ```bash 99 | docker exec -it $(docker ps -lq) cat /var/jenkins_home/secrets/initialAdminPassword 100 | ``` 101 | 102 | ## Notlar 103 | > node ayarlarından number of executors yani node'un aynı anda execute edeceği build sayısını değiştirebiliriz. 104 | > 105 | 106 | ## Keywords 107 | - **Jenkins agents** 108 | - [Snippet Generator](https://opensource.triology.de/jenkins/pipeline-syntax/) 109 | - **blueocean (plugin)** 110 | - **gitea** 111 | - **ci/cd/cdp** 112 | - **telepresence** -------------------------------------------------------------------------------- /day-2/README.md: -------------------------------------------------------------------------------- 1 | # DevOps Bootcamp Day#2 2 | 3 | ## Uygulamanın sürekli çalışması için kullanılan araçlar 4 | * Screen [How To Use Linux Screen | Linuxize](https://linuxize.com/post/how-to-use-linux-screen/) 5 | * Tmux 6 | * Service / systemd unit 7 | * Docker / container 8 | * Nohup 9 | 10 | ## Dizin Sistemi 11 | 1. **bin (binary)**: sistemdeki temel uygulamalar ls, cd… 12 | 2. **boot**: sistem açıldığında çalışacak uygulamalar. 13 | 3. **dev** (device): sistemdeki cihazlar. 14 | * shm (shared memory): Rame yazılır. Kayıt edilmez. 15 | 4. **etc**: ayarlar 16 | * **passwd**: userlar 17 | * **shadow**: parolalar şifrelenmiş şekilde tutulur 18 | * **sudoers**: sudo yetkisi olan kullanıcılar 19 | 5. **home**: root harici kullanıcıların ev dizinleri. 20 | 6. **root**: root kullanıcısının ev dizini. 21 | 7. **lib** 22 | 8. **media**, mnt: takılan disklerin bulunduğu klasörler. 23 | 9. **snap**: çoğu sistemde yok. 24 | 10. **lost+found**: sistem dosyaları taradıktan sonra bulduğu belirsiz dosyaları bu dizine atıyor.# 25 | 11. **opt (options)**: uygulama dosyalarının ayarlarını tuttuğu dizin. 26 | 12. **tmp**: sistemde geçici dosyaların saklandığı dizin. Herkes dosya koyabilir fakat sadece kendi dosyalarını düzenleyebilir ve silebilir. 27 | 13. **var (variables)**: Sistem üzerinde değişebilecek dosyalar. Örneğin sisteme giriş yapan kullanıcılar. 28 | * **log**: Sistemdeki çoğu log bu dizinde tutulur. 29 | 14. **proc (process)**: Sistemde çalışan uygulamaları tutar. Sanal dosya sistemi, diskte tutulmuyor. 30 | 15. **sys**: proc ile benzer. 31 | 16. **run**: Şuan çalışan uygulamaları tutar. 32 | 33 | ## Komutlar 34 | ### Çalışan uygulamaları listeleme 35 | * `ps aux` 36 | * `top` 37 | * `htop` 38 | ### systemctl 39 | * **unitleri listele**: 40 | `systemctl list-units` 41 | * **servisleri filtrele**: 42 | `systemctl list-units | grep ‘.service’` 43 | * **yenile**: Uygulamanın desteklemesi gerekir. 44 | `systemctl reload nginx` 45 | `systemctl restart nginx` 46 | ### nginx 47 | * **başlat**: 48 | `systemctl start nginx` 49 | * **durdur**: 50 | `systemctl stop nginx` 51 | * **başlangıçta başlat**: 52 | `systemctl enable nginx` 53 | * **başlangıçta başlatmayı durdur**: 54 | `systemctl disable nginx` 55 | 56 | ### log takip etme 57 | * `tail -f -n 2 /var/log/nginx` 58 | 59 | ### journalctl 60 | systemctl benzeri log yönetimi için bir çözüm. 61 | 62 | ### find 63 | `find . -name nginx.conf` 64 | `find . -name '*nginx*' -type d` 65 | 66 | ### ping 67 | `ping test.com` 68 | 69 | ### dig 70 | `dig @8.8.8.8 test.com` 71 | 72 | ### nslookup 73 | Minimal sistemlerde genelde nslookup bulabiliriz. 74 | `nslookup test.com 8.8.8.8` 75 | 76 | ### curl 77 | `curl test.com` 78 | 79 | **-v** (verbose) ile detayları görebiliriz 80 | `curl -v test.com` 81 | 82 | ### wget 83 | curl ile benzer. Dosya indirmek için hızlı ve kullanışlı. 84 | `wget https://releases.ubuntu.com/22.04/...` 85 | 86 | ### adduser 87 | `adduser sems` 88 | 89 | ## Yetkiler 90 | drwxrwxr 91 | - - - - 92 | > İlk harf dosyanın tipini belirtir. 93 | 94 | **-** -> regular file 95 | **d** -> dizin 96 | **f** -> dosya 97 | **c** -> character device (fiziksel, sanal cihazlar) (Örn: komut satırı) 98 | **b** -> block device (Örn: harddisk) 99 | - - - - 100 | > **(2,3,4)**. harfler kullanıcının dosya üzerindeki yetkileri 101 | > **(5,6,7)**. harfler grubun dosya üzerindeki yetkileri 102 | > **(8,9,10)**. harfler diğer kullanıcıların yetkileri 103 | 104 | **r** -> read 105 | **w** -> write 106 | **x** -> execute 107 | 108 | [File Permissions in Linux / Unix: How to Read, Write & Change?](https://www.guru99.com/file-permissions.html#:~:text=Linux%20divides%20the%20file%20permissions,ownership%20of%20a%20file%2Fdirectory.) 109 | 110 | ### Dosyanın sahibini değiştirmek 111 | > Sadece root dosyanın sahibini değiştirebilir. 112 | ```bash 113 | chown guray sozler.txt 114 | ``` 115 | 116 | ### Dosya yetkilerini değiştirmek 117 | > 2’lik sisteme göre yazılır. 118 | 119 | `chmod 644` -> `-rw-r--r--` 120 | 121 | ## Sorular 122 | * apt ile bir paketin belli bir versiyonu nasıl yüklenir? 123 | [How to Install Nginx Latest Version on Ubuntu 20.04, Ubuntu 18.04 - LinuxBabe](https://www.linuxbabe.com/ubuntu/install-nginx-latest-version-ubuntu-18-04) 124 | * Bir paketin bir sürümde sabit kalmasını nasıl sağlarız? 125 | 126 | ## Keywords 127 | * ssh keepalive [How to Keep Alive SSH Sessions](https://patrickmn.com/aside/how-to-keep-alive-ssh-sessions/) 128 | * ip spoofing -------------------------------------------------------------------------------- /day-2/nginx-html/README.md: -------------------------------------------------------------------------------- 1 | # Nginx ile HTML dosyası serve etmek 2 | Bootcamp kapsamında öğrendiğim bilgilerle ufak bir alıştırma yapmak için bir fikir düşündüm ve nginx konusuna da değindiğimiz için static bir html dosyayı serve etmek başlangıç için güzel olabilir. 3 | 4 | #### AWS EC2 ile Ubuntu makine oluşturuyoruz 5 | Öncelikle bir ubuntu makine oluşturuyorum. Zaten bu adımı AWS konsolda çok kolay yapabilirsiniz. 6 | 7 | EC2 servisini bulun, Launch instances butonu ile bir instance oluşturun. Ve hepsi bu kadar elinizde ubuntu bir makine var. 8 | 9 | Ubuntu Server 22.04 seçtim. Ben 1 yıllık ücretsiz kullanım hakkım olduğu için free tier eligible seçenekleri kullanıyorum. 10 | ![](images/SS-1.png) 11 | 12 | Yine Instance type’ı da ücretsiz olan t2.micro seçiyorum. Bu sistem uygulamamız için yeterli olacaktır. 13 | ![](images/SS-2.png) 14 | 15 | > ⚠️ **Ufak bir not** 16 | > Benim gibi yeni öğrenen biriyseniz AWS konsolda http 80 portunu açmayı unutmayın:) 17 | 18 | > **Network settings kısmında önemli bir detay var:** 19 | > ’**Allow HTTP traffic from the internet**’ seçeneğini aktif ediyoruz, eğer bu seçeneği aktif etmezsek browser üzerinden server’a erişim sağlayamayız. 20 | > Ve tabii ki **SSH**’ı da servera bağlanmak için aktif ediyoruz. 21 | ![](images/SS-3.png) 22 | 23 | Ayarlarımız bu kadar, **Launch instance** tıklayarak makinemizi oluşturabiliriz. 24 | 25 | Makineniz oluştuktan sonra indirdiğimiz .pem uzantılı bir dosya ile ssh bağlantısını sağlayabileceğiz. 26 | Instances alanında üzerine tıklayarak public IPv4 address kısmından ssh ile bağlanacağınız ip adresini öğrenebilirsiniz. 27 | 28 | #### SSH ile bağlantı kurmak 29 | > Bootcamp notlarımda bununla ilgili komutlar var. [Day#2](../../day-2/README.md) 30 | 31 | AWS ubuntu makinelerde default kullanıcı adı: **ubuntu**. 32 | ```bash 33 | ssh -i pem-dosyaniz.pem ubuntu@ip-adresiniz 34 | ``` 35 | 36 | Eğer bir sorun olmadıysa konsol ekranına erişmiş olmanız gerekir. 37 | ![](images/SS-7.png) 38 | 39 | #### nginx kurulumu 40 | Öncelikle nginx paketine ihtiyacımız var 41 | ```bash 42 | sudo apt update 43 | sudo apt install nginx 44 | ``` 45 | 46 | > **Not** 47 | > nginx kurduğumuzda aktif hale gelecektir. Eğer browserdan ip adresine girmeye çalışırsanız aşağıdaki gibi bir sayfayla karşılaşmalısınız. 48 | > ![](images/SS-4.png) 49 | 50 | Eğer direk başlamadıysa şu komutla nginx’i başlatabiliriz 51 | ```bash 52 | systemctl start nginx 53 | ``` 54 | 55 | Sistemde nginx servisinin durumunu görüntülemek için yine notlarımdaki komutları deneyebiliriz. 56 | 57 | Aşağıdaki komut ile çalışan servisler arasında nginx’i filtreleyebilirsiniz. 58 | ```bash 59 | systemctl list-units | grep nginx 60 | ``` 61 | 62 | #### nginx config 63 | Bu adımlar sonrasında nginx default sayfasını görebildiysek bir html dosyası oluşturarak nginx config’ini yapabiliriz 64 | 65 | İlk olarak `/home/ubuntu ` dizini altında `www` adlı bir dizin oluşturarak içerisinde html dosyası oluşturacağım. 66 | ```bash 67 | mkdir www 68 | cd www 69 | touch index.html 70 | ``` 71 | 72 | Ve html dosyasını düzenlemek için vim ile açacağım 73 | `sudo vim index.html` 74 | 75 | Vim içerisinde `i` ile INSERT moduna geçiyoruz ve html kodlarını ekliyorum 76 | ```html 77 | 78 | 79 | 80 | 81 | 82 | 83 | Nginx Works! 84 | 85 | 86 |
87 |

If you are seeing this nginx works correctly!

88 |
89 | 90 | 91 | ``` 92 | 93 | > `:wq` ile kaydederek vim’den çıkıyorum. 94 | 95 | html dosyasını da oluşturduğumuza göre config’i yapabiliriz. 96 | `/etc/nginx/nginx.conf` dizininde config dosyasını bulabilirsiniz. 97 | 98 | `sudo vim /etc/nginx/nginx.conf` 99 | http içerisine aşağıdaki server kısmını ekliyoruz 100 | ``` 101 | server { 102 | listen 80; 103 | server_name ip-adresiniz; 104 | root /home/ubuntu/www; 105 | index index.html; 106 | } 107 | ``` 108 | 109 | > `:wq` ile kaydedip çıkıyoruz. 110 | 111 | config dosyasını test etmek için `sudo nginx -t` çalıştırıyoruz. 112 | ![](images/SS-5.png) 113 | 114 | Ve son olarak `sudo systemctl restart nginx` komutu ile nginx’i yeniden başlatıyoruz. 115 | 116 | Tarayıcıdan ip adresinize ulaşmaya çalışırsanız başarılı şekilde html dosyasını görebilirsiniz 🎉 117 | 118 | ![](images/SS-6.png) 119 | 120 | 121 | -------------------------------------------------------------------------------- /day-3/README.md: -------------------------------------------------------------------------------- 1 | # DevOps Bootcamp Day#3 2 | 3 | ## Otomasyon 4 | - **Otomasyon** 5 | - İşleri otomatikleştirmek 6 | - **Orkestrasyon** 7 | - Birden fazla sunucuda aynı anda otomasyon 8 | - Kubernetes 9 | - Config Management 10 | - Inventory Management 11 | - Iterative Management 12 | - Continuous Integration 13 | - Continuous Deployment 14 | - Continuous Delivery 15 | - Continuous Development 16 | - Infrastructure as Code 17 | 18 | --- 19 | 20 | ## Jenkins 21 | 22 | ### Jenkins Ortamı Oluşturma 23 | 1. docker kurulumu 24 | ```bash 25 | sudo apt install docker.io docker-compose -y 26 | ``` 27 | 28 | 2. jenkins için ortamı hazırlamak 29 | ```bash 30 | docker network create cicd 31 | docker run -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --network cicd --name jenkins jenkins/jenkins:lts 32 | ``` 33 | 34 | 3. Biz sunucuya girmeden sunucuya sızmaya çalışan biri giremesin diye initial password oluşturuyoruz. 35 | ```bash 36 | docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword 37 | ``` 38 | 39 | 4. Ayağa kaldırıyoruz 40 | ```bash 41 | docker run -d --name demoserver --network cicd guray/weaksshd:0.2 42 | ``` 43 | 44 | --- 45 | 46 | ### Jenkins SSH Demo Credentials 47 | **hostname**: demoserver 48 | **username**: sshuser 49 | **password**: myweakpassword 50 | 51 | serverAliveInterval 52 | clientAliveInterval 53 | 54 | --- 55 | 56 | ### Jenkins Build 57 | 58 | #### Details 59 | - **parameters**: Buildlere parametreler ekleyebiliriz 60 | - **throttle builds**: Ard arda çalıştırmayı engelleme 61 | - **disable**: Kullanılmaması için disabled edebiliriz 62 | - **concurrent build**: Eş zamanlı build çalıştırma 63 | 64 | #### Triggers 65 | Buildleri manuel olarak çalıştırabildiğimiz gibi farklı yöntemlerle de çalıştırabiliriz. 66 | Belirlenen bir görevin sonunda, bir hata sonucunda, github üzerinden veya periyodik olarak da çalıştırabiliyoruz. 67 | 68 | **cron ile periyodik trigger örneği:** 69 | MINUTE HOUR DAY_OF_MONTH MONTH DAY_OF_WEEK 70 | > Her sene 6.ayın 5'inde 3:50'de çalıştır 71 | > *: haftanın her günü 72 | 73 | ``` 74 | TZ=Europe/Istanbul 75 | 50 3 5 6 * 76 | ``` 77 | 78 | **Pre-build Script** 79 | Build çalışmadan önce script çalıştırır. 80 | 81 | **Post-build Script** 82 | Build sonrası script çalıştırır. 83 | 84 | **Soru** 85 | Build çalışmadan önce /etc altındaki dosyaları .tar.gz formatında kopyalayıp `backup_etc_{gün}_{ay}_{yıl}.tar.gz` adıyla kaydeden script'i yazın. 86 | `tar czf backup_etc_$(date '+%d_%m_%Y_%H_%M').tar.gz /etc` 87 | 88 | ⚠️ Bu komut kullanıcının dosyalarda yetkisi yoksa permission denied hatası verebilir. 89 | 90 | Bu hata sonucu scriptin patlamaması için komutu aşağıdaki şekilde düzenleyebiliriz. 91 | `tar czf backup_etc_$(date '+%d_%m_%Y_%H_%M').tar.gz /etc || echo ''` 92 | veya 93 | `tar czf backup_etc_$(date '+%d_%m_%Y_%H_%M').tar.gz /etc || /bin/true` 94 | 95 | --- 96 | 97 | ### Pipeline 98 | Build versiyonlama problemi ve kopyalama zorluğu sebebiyle bu işleri kod ile yapma gereksinimi yüzünden kullanılır. 99 | 100 | > Pipeline script groovy diline benzer bir yapıdadır. 101 | 102 | **declarative pipeline** 103 | - pipeline ile başlar 104 | - Daha modern kabul edilir 105 | - Belli başlı komutları çalıştırır 106 | 107 | **scripted pipeline** 108 | - node ile başlar 109 | - groovy programlama dili ile kod yazabiliyoruz 110 | 111 | --- 112 | 113 | ### Jenkins Lifecycle 114 | 1. **Build** 115 | Kod build edilir. 116 | 2. **Statik Kod Analizi** 117 | Belli araçlar ile kodun içerisindeki güvenlik açıklarını, performans iyileştirme önerilerini vs bulur. 118 | 3. **Unit Test** 119 | Kodun parçalarının kod ile test edilmesi. Bir kod parçasını test etmek için kullanılır. 120 | 4. **Packaging** 121 | Kod paketlenerek çalışır hale getirilir. 122 | 5. **Functional Test** 123 | Paket mockup servisler ile test edilir. Gerçek bir servise veya database'e istek atmıyoruz. İdeal şekilde ve sınırsız hızlı response dönen mockuplar ile test yapıyoruz. 124 | 1. **Integration Test** 125 | Functional test ile farkı paket gerçek servis ve veritabanları ile test edilir. Gecikmelerle ve hatalarla testin geçip geçmediğine bakılır. 126 | 7. **E2E Test** 127 | Selenium ile kullanıcı arayüzü ile test edilir. 128 | 8. **Prod** 129 | Kod canlıya alınır. 130 | 131 | --- 132 | 133 | ## Notlar 134 | > Unix sistemlerde exit-status 0 başarılı anlamına gelir. 0 dışındaki her şey hatadır. 135 | 136 | ## Komutlar 137 | - Linux dağıtımı bilgileri 138 | `cat /etc/os-release` 139 | 140 | - Docker yetki komutu 141 | `sudo usermod -aG docker $USER` 142 | 143 | - Son çalışan komutun status bilgisi 144 | `echo $?` 145 | 146 | ## Keywords 147 | - **jenkins** 148 | - **figlet** 149 | - **clean workspace plugin** 150 | - **cron** 151 | - **pipeline as code** 152 | 153 | ## Other Resources 154 | - [crontab.guru](https://crontab.guru/) 155 | - [Selenium Python](https://selenium-python.readthedocs.io/) 156 | - Jenkins için örnek birkaç tutorial: 157 | - https://www.youtube.com/watch?v=FX322RVNGj4 158 | - https://www.youtube.com/watch?v=nCKxl7Q_20I 159 | - https://www.youtube.com/watch?v=MayMkFCkzj4 --------------------------------------------------------------------------------