Skip to content

Commit 059f8de

Browse files
committed
[FIX] spelling mistakes fixed
1 parent 0954c6b commit 059f8de

File tree

1 file changed

+246
-23
lines changed

1 file changed

+246
-23
lines changed

pages/guides/ci-cd/java-spring-boot-deployment.en-UZ.mdx

Lines changed: 246 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { Callout } from "nextra-theme-docs";
1010
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/banner.png)
1111

1212

13-
Ushbu qo'llanma **Java Spring Boot** applicationlarnni **GitLab CI/CD** va **GitHub Actions** yordamida avtomatlashtirilgan tarzda deploy qilishni o'rganishni maqsad qilgan. Bu amaliyot DevOps Engineerlar va Java dasturchilari uchun zarur bo'lgan bilim va ko'nikmalarni qamrab oladi. Qo'llanmada Java Spring Boot applicationining tuzilishini tushunish va konfiguratsiya qilish jarayonlari ko'rib chiqamiz.
13+
Ushbu qo'llanma **Java Spring Boot** applicationlarnni **GitLab CI/CD** va **GitHub Actions** yordamida avtomatlashtirilgan tarzda deploy qilishni o'rganib chiqamiz. Bu amaliyot DevOps Engineerlar va Java dasturchilari uchun zarur bo'lgan bilim va ko'nikmalarni qamrab oladi. Qo'llanmada Java Spring Boot applicationining tuzilishini tushunish va konfiguratsiya qilish jarayonlari ko'rib chiqamiz.
1414

1515
Shuningdek, biz Dockerfile yozishni o'rganamiz va uni samarali ishlashi uchun optimallashtiramiz. Docker asosida konteynerlash jarayonlarini o'zlashtirgach, GitLab CI/CD va GitHub Actions yordamida CI/CD pipeline'larini sozlash va avtomatlashtirish usullarini ko'rib chiqamiz.
1616

@@ -265,6 +265,34 @@ Environment variablelarni Gitlab CI variablega qo'shib chiqishimiz kerak bo'ladi
265265
Gitlab CI variablega secret keylarni qo'shib chiqdik endi Gitlab CI/CD pipeline'larimizda bu secret keylarni ishlatishimiz mumkin.
266266
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/4.png)
267267

268+
## VM Tayyorlash
269+
270+
CI/CD deployment bosqichida biz applicationimizni vm(virtual machine)ga deploy qilamiz bu uchun vm tayyorlashimiz kerak bo'ladi, yani pipeline serverga ssh bilan ulanib ishlaydigan qismi bor shu qismi uchun ssh sozlashimiz va docker o'rnatishimiz kerak bo'ladi.
271+
272+
Docker o'rnatish uchun quyidagi qo'llanmadan foydalanishingiz mumkin - **[Linux serverlarga Docker o'rnatish](https://devops-journey.uz/guides/konteyner/docker-ornatish)**
273+
274+
CD pipelien serverga ssh orqali kira olishi kerak buning uchun serverda ssh-key generatsiya qilishimiz kerak bo'ladi.
275+
276+
```bash
277+
ssh-keygen
278+
```
279+
Yuqoridagi buyruqni yozib **ENTER**ni bosib key generatsiya qilib oling
280+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/6.png)
281+
282+
yuqorida buyruq 2ta key generatsiya qiladi public(`id_rsa.pub`) va private(`id_rsa`) keylar, bu keylar `~/.ssh` papkasiga saqlanadi.
283+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/7.png)
284+
CD pipeline serverga kira olishi uchun private(`id_rsa`) keyni `authorized_keys` fayliga qo'shib chiqishimiz kerak bo'ladi.
285+
```bash
286+
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
287+
```
288+
289+
Keyin esa private(`id_rsa`) keyni Gitlab CI variablega `SSH_PRIVATE_KEY` nomi bilan qo'shamiz private keyni `cat ~/.ssh/id_rsa` buyruqini ishga tushirib olishimiz mumkin.
290+
```bash
291+
cat ~/.ssh/id_rsa
292+
```
293+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/8.png)
294+
295+
268296
## Gitlab CI/CD pipeline
269297

270298
Okey yuqorida biz loyihani tushundik, Dockerfile yozdik va konfiguratsiyalarimizni sozladik endi Gitlab CI/CD pipeline'larimizni yozamiz. Gitlab CI/CD pipeline'larini yozish uchun `.gitlab-ci.yml` faylini loyihaning asosiy katalogiga yaratamiz.
@@ -404,28 +432,7 @@ Ushbu CD pipeline'ni tushunish uchun quyidagi qadamlarni ko'rib chiqamiz:
404432

405433
Bu CD pipelineni ishga tushirish uchun kerakli secretlarni Gitlab CI variablega qo'shib chiqamiz.
406434

407-
CD pipelien serverga ssh orqali kira olishi kerak buning uchun serverda ssh-key generatsiya qilib uni Gitlab CI variablega qo'shib chiqamiz.
408-
409-
```bash
410-
ssh-keygen
411-
```
412-
Yuqoridagi buyruqni yozin **ENTER**ni bosib key generatsiya qilib oling
413-
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/6.png)
414-
415-
yuqorida buyruq 2ta key generatsiya qiladi public(`id_rsa.pub`) va private(`id_rsa`) keylar, bu keylar `~/.ssh` papkasiga saqlanadi.
416-
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/7.png)
417-
CD pipeline serverga kira olishi uchun private(`id_rsa`) keyni `authorized_keys` fayliga qo'shib chiqishimiz kerak bo'ladi.
418-
```bash
419-
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
420-
```
421-
422-
Keyin esa private(`id_rsa`) keyni Gitlab CI variablega `SSH_PRIVATE_KEY` nomi bilan qo'shamiz private keyni `cat ~/.ssh/id_rsa` buyruqini ishga tushirib olishimiz mumkin.
423-
```bash
424-
cat ~/.ssh/id_rsa
425-
```
426-
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/8.png)
427-
428-
Serverda ssh key genratsiya qilib sozlab olganimizdan keyin Gitlab CI variablega qo'shib chiqishimiz kerak bo'ladi.
435+
Yuqorida biz **[VM tayyorlash](#vm-tayyorlash)** bosqichida serverga docker install qilib ssh-key generatsiya qilgandik endi shu keylarni Gitlab CI variablega qo'shib chiqishimiz kerak bo'ladi.
429436
**-> Settings -> CI/CD -> Variables** bo'limiga o'tamiz va `SERVER_IP` nomli variablega server ip manzilini(Gitlab bo'glana oladigan IP) yozamiz.
430437
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/9.png)
431438
`SERVER_USERNAME` nomli variablega serverga kirish uchun user nomini yozamiz, userni `whoami` buyruqini ishga tushirib olishimiz mumkin.
@@ -456,6 +463,222 @@ Docker containerlar ro'yxatida `waifulist` nomli containerni ko'rib turibmiz por
456463
Keling endi PostgreSQL databazani tekshirib ko'ramiz.
457464
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/21.png)
458465

466+
## Github Actions CI/CD
467+
468+
Bu amaliyotimizda biz ham Gitlab CI bilan CI/CD pipeline va Github Actions bilan CI/CD pipeline yozamiz. Yuqorida biz Gitlab CI/CD bilan pipeline yozishni ko'rib chiqdik bu qismda biz Github Actions bilan CI/CD pipeline yozamiz.
469+
470+
<Callout type="info" emoji="">
471+
Agar siz Github Actions bilan tanish bo'lmasangiz quyidagi qo'llanma orqali o'rganib chiqishingiz mumkin: [**Github Actions CI/CD**](https://devops-journey.uz/guides/ci-cd/github-actions-ci-cd).
472+
</Callout>
473+
474+
### CI pipeline
475+
Github Actions CI pipeline'ni yozish uchun birinchi navbatda `.github/workflows` papkasini yaratib olamiz va ichiga `ci-cd.yml` faylini yaratamiz ba CI pipeline'ni quyidagicha yozamiz.
476+
477+
```yaml filename=".github/workflows/ci.yml"
478+
name: Github Actions CI/CD
479+
480+
on:
481+
push:
482+
branches: [ main ]
483+
pull_request:
484+
branches: [ main ]
485+
486+
env:
487+
REPO_NAME: ${{ github.repository }}
488+
REGISTRY: ghcr.io
489+
490+
jobs:
491+
build_and_push:
492+
runs-on: ubuntu-latest
493+
permissions:
494+
contents: read
495+
packages: write
496+
steps:
497+
- name: Checkout code
498+
uses: actions/checkout@v3
499+
500+
- name: Set up Docker Buildx
501+
uses: docker/setup-buildx-action@v3
502+
503+
- name: Log in to the Container registry
504+
uses: docker/login-action@v3
505+
with:
506+
registry: ${{ env.REGISTRY }}
507+
username: ${{ github.actor }}
508+
password: ${{ secrets.GITHUB_TOKEN }}
509+
510+
- name: Build and push Docker image
511+
uses: docker/build-push-action@v5
512+
with:
513+
context: .
514+
push: true
515+
tags: "${{ env.REGISTRY }}/${{ env.REPO_NAME }}:${{ github.sha }}"
516+
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.REPO_NAME }}:buildcache
517+
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.REPO_NAME }}:buildcache,mode=max
518+
```
519+
Agar siz [**Github Actions CI/CD**](https://devops-journey.uz/guides/ci-cd/github-actions-ci-cd) qo'llanmasini o'qib chiqgan bo'lsangiz bu CI pipeline'ni oson tushunasiz. Qisqa qilib aytganda bu CI juda oddiy pipeline bo'lib Github Actions orqali `main` branchga push qilganda yoki pull request ochganda avtomatik ishga tushadi va Docker imageni build qilib Github Container registryga push qiladi.
520+
521+
CI pipelineni sinash uchub Githubdagi repositoriyamiz `main` branchiga push qilamiz pipeline avtomatik ishga tushishi kerak.
522+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/22.png)
523+
524+
-----------------
525+
526+
Rasmda Github Actions ishga tushayotganini ko'rishingiz mumkin.
527+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/23.png)
528+
529+
-----------------
530+
531+
Repositoriyadan **-> Actions** bo'limiga o'tib pipelinedagi joblarni ko'rishimiz mumkin.
532+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/24.png)
533+
534+
-----------------
535+
536+
Bu qismda faqat bizda CI pipelineda `build_and_push` jobi ishlayotanini ko'rishimiz mumkin.
537+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/25.png)
538+
539+
-----------------
540+
541+
Bu rasmda esa CI pipeliendagi `build_and_push` jobi muvaffaqiyatli ishga tushganini ko'rishimiz mumkin.
542+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/26.png)
543+
544+
CI pipeline muvaffaqiyatli ishga tushdi endi esa uni teklshirib ko'rishimiz kerak bo'ladi. Biz container registry sifatida Github Container registryni ishlatdik keling container registryda CI pipelienda yaratilgan imageni tekshirib ko'ramiz, buning uchun **-> Packages** bo'limiga o'tib container registryda yaratilgan imageni ko'ramiz.
545+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/27.png)
546+
547+
-----------------
548+
549+
Ko'rib turganingizdek bizda `waifulist` nomli docker image mavjud.
550+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/28.png)
551+
552+
Biz Github Actionsda CI pipeline muvaffaqiyatli yozib ishga tushirdik endi esa CD pipeline'ni yozamiz.
553+
554+
### CD pipeline
555+
556+
CD pipelineda biz CI pipeline'da build qilingan docker imageni Github Actions orqali serverga kirib docker imageni Github Container registrydan pull qilib belgilan qiymatlar bilan uni ishga tushiramiz. Buning uchun `ci-cd.yml` faylini o'zgartirishlar kiritishimiz kerak bo'ladi.
557+
558+
```yaml filename=".github/workflows/ci-cd.yml" {11,13-17,48-71}
559+
name: Github Actions CI/CD
560+
561+
on:
562+
push:
563+
branches: [ main ]
564+
pull_request:
565+
branches: [ main ]
566+
567+
env:
568+
REPO_NAME: ${{ github.repository }}
569+
CONTAINER_NAME: waifulist
570+
REGISTRY: ghcr.io
571+
SSH_HOST: ${{ secrets.SERVER_IP }}
572+
SSH_USER: ${{ secrets.SERVER_USERNAME }}
573+
SSH_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
574+
PORT: 8080:8080
575+
SPRING_PROFILES_ACTIVE: dev
576+
577+
jobs:
578+
build_and_push:
579+
runs-on: ubuntu-latest
580+
permissions:
581+
contents: read
582+
packages: write
583+
steps:
584+
- name: Checkout code
585+
uses: actions/checkout@v3
586+
587+
- name: Set up Docker Buildx
588+
uses: docker/setup-buildx-action@v3
589+
590+
- name: Log in to the Container registry
591+
uses: docker/login-action@v3
592+
with:
593+
registry: ${{ env.REGISTRY }}
594+
username: ${{ github.actor }}
595+
password: ${{ secrets.GITHUB_TOKEN }}
596+
597+
- name: Build and push Docker image
598+
uses: docker/build-push-action@v5
599+
with:
600+
context: .
601+
push: true
602+
tags: "${{ env.REGISTRY }}/${{ env.REPO_NAME }}:${{ github.sha }}"
603+
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.REPO_NAME }}:buildcache
604+
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.REPO_NAME }}:buildcache,mode=max
605+
606+
deploy:
607+
needs: build_and_push
608+
runs-on: ubuntu-latest
609+
permissions:
610+
contents: read
611+
packages: write
612+
steps:
613+
- name: Executing remote SSH commands to deploy
614+
uses: appleboy/ssh-action@master
615+
with:
616+
host: "${{ env.SSH_HOST }}"
617+
username: "${{ env.SSH_USER }}"
618+
key: "${{ env.SSH_KEY }}"
619+
script: |
620+
echo ${{ secrets.GITHUB_TOKEN }} | docker login -u ${{ github.actor }} --password-stdin ${{ env.REGISTRY }}
621+
docker pull "${{ env.REGISTRY }}/${{ env.REPO_NAME }}:${{ github.sha }}"
622+
docker stop "${{ env.CONTAINER_NAME }}" || true
623+
docker rm "${{ env.CONTAINER_NAME }}" || true
624+
docker run -d --name ${{ env.CONTAINER_NAME }} -p ${{ env.PORT }} \
625+
-e SPRING_PROFILES_ACTIVE=${{ env.SPRING_PROFILES_ACTIVE }} \
626+
-e DEV_DATABASE_URL=${{ secrets.DEV_DATABASE_URL }} \
627+
-e DEV_DATABASE_USERNAME=${{ secrets.DEV_DATABASE_USERNAME }} \
628+
-e DEV_DATABASE_PASSWORD=${{ secrets.DEV_DATABASE_PASSWORD }} \
629+
${{ env.REGISTRY }}/${{ env.REPO_NAME }}:${{ github.sha }}
630+
```
631+
632+
Ushbu CD pipelineni qisqacha tushintiradigan bo'lsam `cd-cd.yml` ga `CONTAINER_NAME`, `PORT`, `SSH_HOST`, `SSH_USER`, `SSH_KEY`, `SPRING_PROFILES_ACTIVE`, `DEV_DATABASE_URL`, `DEV_DATABASE_USERNAME`, `DEV_DATABASE_PASSWORD` nomli yangi o'zgaruvchilari qo'shildi. deploy uchu `deploy` nomli job yozdik bu job afqat `build_and_push` jobi tugagandan keyin ishlaydi va berilgan `SSH_HOST`, `SSH_USER`, `SSH_KEY` secretlarini Github Secretsdan olib serverga ssh orqali kiradi va birinchi navbatda Github Container Registyrga login qiladi va `build_and_push` jobida build qilingan imageni pull qilib oladi va hozir ishlab turgan eski containerni to'xtatatib belgilangan variablelar(`SPRING_PROFILES_ACTIVE`, `PORT`, `CONTAINER_NAME`) orqali yangi containerni ishga tushiradi. `application-dev.properties` faylida dev environment uchun kerakli secretlarni esa Github Secretsdan olib ishlatadi.
633+
634+
Ushbu yangilangan to'liq CI/CD pipelieni ishga tushirishdan oldin kerakli secretlarni Github Secretga qo'shib chiqishimiz kerak bo'ladi.
635+
636+
Buning uchun **-> Settings -> Secrets and variable -> New repository secret** bo'limiga o'tib kerakli secretlarni qo'shib chiqamiz.
637+
638+
`DEV_DATABASE_URL` ga `jdbc:postgresql://134.209.217.179:5432/waifulist` formatda secret keyni yozamiz buyerda IP manzil PostgreSQL server manzili va porti `waifulist` esa database nomi bo'ladi.
639+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/30.png)
640+
`DEV_DATABASE_USERNAME` ga postgres secret keyni yozamiz buyerda PostgreSQL serverga ulanish uchun kerak bo'lgan foydalanuvchi nomi.
641+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/31.png)
642+
`DEV_DATABASE_PASSWORD` ga `lwfjljqwotpreqwt2` secret keyni yozamiz bu PostgreSQL serverga yuqoria belgilangan user bilan ulanish uchun kerak user paroli(yani `postgres` user paroli).
643+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/29.png)
644+
645+
Yuqorida biz **[VM tayyorlash](#vm-tayyorlash)** bosqichida serverga docker install qilib ssh-key generatsiya qilgandik endi shu keylarni Github Actions Secretga qo'shib chiqishimiz kerak bo'ladi.
646+
647+
`SERVER_IP` nomli variablega server ip manzilini(Gitlab bo'glana oladigan IP) yozamiz.
648+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/32.png)
649+
`SERVER_USERNAME` nomli variablega serverga kirish uchun user nomini yozamiz, userni `whoami` buyruqini ishga tushirib olishimiz mumkin.
650+
```bash
651+
whoami
652+
```
653+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/33.png)
654+
`SSH_PRIVATE_KEY` nomli variablega esa yuqorida yaratib olgan private keyni yozamiz.
655+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/34.png)
656+
657+
Bizda secretlar umumiy ro'yxati.
658+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/36.png)
659+
660+
661+
Okeyy biz barcha secret va variablelarni to'g'ri qo'shib chiqdik endi esa to'liq CI/CD pipelineni ishga tushirish uchun o'zgarishlarni `main` branchga push qilamiz. CI/CD avtomatik ishga tushishi kerak.
662+
663+
664+
Ko'rib turganingizdek bu safar bizda jobllar ikkita `build_and_push` va `deploy` joblarini ko'ramiz va ular ketma-ketlikda ishlaydi.
665+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/37.png)
666+
667+
Okey bizda to'liq CI/CD muvaffaqiyatli ishladi endi uni tekshirib ko'rishimiz kerak bo'ladi.
668+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/38.png)
669+
670+
Serverga kirib docker containerlar ro'yxatini ko'ramiz.
671+
```bash
672+
docker ps
673+
```
674+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/39.png)
675+
Bizda `waifulist` nomli docker containerimiz mavjud va statusi healthy bo'lganini ko'ramiz, keling endi bu API'ning swagger interfeysiga kirib ko'ramiz, bunig uchun brauzerdan `http://server-ip::8080/swagger-ui/index.html` manziliga kirib ko'ramiz bizda API swagger interfeysi ochilishi kerak.
676+
677+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/20.png)
678+
679+
Keling endi PostgreSQL databazani tekshirib ko'ramiz.
680+
![java-deployment](https://raw.githubusercontent.com/devops-journey-uz/assets/main/images/tutorials/ci-cd/java-deployment/21.png)
681+
459682
Niyohat biz bugun Spring Boot applicationni Docker konteyneriga ishga tushirishni o'rgandik, Gitlab CI/CD pipelinelarini yozdik va loyihamizni Gitlab CI/CD orqali jarayonlarni avtomatlashtirdik, Spring Bootda multi-environment konfiguratsiyalar bilan ishlashni o'rgandik va secretlarimizni Gitlab CI variablega qo'shib ishladik. Bugungi amaliyot boshlang'ich darajada hisoblanasa bu orqali siz ko'p narsalarni o'rganib chiqasiz, qolganlari esa keyingi boqichlarda.
460683

461684
## Qo'shimcha

0 commit comments

Comments
 (0)