👨‍🔧CI/CD pipeline-ის გამართვა

რა არის CI/CD pipeline-ი ? 🤔

CI/CD pipeline-ი არის ჩვენი პროექტის გატესტვის, სერვერზე გადატანის, აწყობის პროცესის გაავტომატიზირება. ამ პროცესის ავომატიზირება იმისთვის არის კარგი, რომ დეველოპერს დრო არ დაეხარჯოს ამ ყველაფრის გაკეთებაში ყოველ ცვილებაზე და ასევე იმისთვის, რომ ადამინაური შეცდომები ამ პროცესში მინიმუმამდე დავიყვანოთ. რაც მთავარია ყველა დეველოპერს გვიყვარს 5 წუთის საქმის ავომატიზაციაზე 4 საათის დახარჯვა, მაგრამ იმედია, რომ ამ სტატიის საშუალებით თქვენ არ მოგიწევთ 4 საათის დახარჯვა.

CI/CD pipeline-ის კონფიგურირება

1) SSH key-ის გენერირება

ssh key იმისთვის საჭიროა, რომ github-მა ჩვენს სერვერზე შესვლა შეძლოს, ამის მიღწევა კი შეგვიძლია ssh key-ის გარეშეც, მაგრამ ეს გზა ბევრად უსაფრთოა და არც ისე ძნელი. მოდი დავიწყოთ...

პირველი რიგში რა თქმა უნდა შევიდეთ სერვერზე:

ssh root@127.0.0.1

ამის შემდეგომ შევქმნათ ssh key შემდეგი ბრძანებით:

ssh-keygen

აქ რამოდენიმე შეკითხვას დაგისვამთ, მაგრამ ყველა მათგანზე default-ების არჩევა ჯობია. ამ ბრძანებით შეიქმნება public და private ssh key-ები. ჯერ მხოლოდ public-ი დაგვჭირდება. მის სანახავდ კი ტერმინალში ჩაწერეთ:

cat ~/.ssh/id_rsa.pub

ამ ბრძანების output-ი დააკოპირეთ, შემდეგ კი გაუშვით ბრძანება:

sudo vim ~/.ssh/authorized_keys

2) SSH key-ების github-ზე დამატება

წინა სექციაში შექმნილი key-ები უნდა ჩავამატოთ github-ზე რამოდენიმე ადგილას.

public key ჩავამატოთ ჩვენს პროფილზე შემდეგნაირად:

  • გადავიდეთ სეთინგებში

  • სეთინგებში ვიპოვოთ SSH and GDP keys

  • შემდეგ ჩავამატოთ ახალი ssh key:

  • აქ უნდა ჩავწეროთ ჩვენი public key-ი რომელიც უნდა ვნახოთ cat ~/.ssh/id_rsa.pub -ის გაშვების საშუალებით. სახელს მნიშვნელობა არ აქვს, მაგრამ ეცადეთ, რომ გასაგები დაარქვათ, მომავალში შეიძლება ბევრის ჩამატება დაგჭირდეთ.

ჩავამატოთ რამოდენიმე repository-ის secret:

1) SSH_HOST რომელიც იქნება ჩვენ სერვერის ip address

2) SSH_USERNAME რომელიც იქნება ჩვენი user-ის სახელი(ის, რომელსაც ssh-ის დროს ვიყენებთ)

3) SSH_KEY რომელიც იქნება ჩვენი private key, რომლის მოპოვება შეგვიძლია შემდეით ბრძანებით:

cat ~/.ssh/id_rsa

ამ ბრძანების შედეგი დააკოპირეთ მთლიანად, თავში და ბოლოში, რაც უწერია ეგენიც.

3) CI/CD pipeline-ის გაწერა

დაა დადგა დრო, რომ მართლა გავწეროთ CD Pipeline. პროექტში შევქმნათ ორი საქაღალდე: პირველი, .github პროექტის რუტში და workflows უნდა მოვათავსოთ .github-ის შიგნით. workflows-ში ჩვენ უნდა შევქმნათ ფაილი, ამ ფაილის სახელს მნიშვნელობა არ აქვს მაგრამ მაინც აჯობებს, რომ გასაგები სახელი დავრქვათ. ასე, რომ მოდი შევქმნათ yml ფაილი სახელად - deploy.yml

ამ ფაილში ჩვენ უნდა ჩავეწეროთ შემდეგნარი კონფიგურაცია:

name: Deploy on server
on:
  push:
    branches:
      - main
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: copy env file
        run: cp .env.example .env
      - name: install npm dependencies
        run: npm ci
      - name: run linter
        run: npm run lint
      - name: Set ssh key 
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
      - name: Deploy to Server
        if: ${{ success() }}
        run: |
          ssh -o StrictHostKeyChecking=no ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }} << EOF
            cd apps
            cd nextjs-folder-structure-example
            git pull
            npm ci
            npm run build
            pm2 restart nextjs-example-process
          EOF

კაი მოდი ავხსნათ აქ რა ხდება, სექციებად:

on:
    push: 
        branches: [main]

აქ უბრალოდ აღწერილია თუ რა შემთხვევაში უნდა გაეშვას github workflow. ამ შემთხვევაში github workflow გაეშვება main ბრენჩზე ნებისმიერი დაფუშვისას(commit, merge, etc...)

runs-on: ubuntu-latest

ჩვენს job-ს ვეუბნებით რა გარემოში გაუშვას github workflow.

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: copy env file
        run: cp .env.example .env
      - name: install npm dependencies
        run: npm ci
      - name: run linter
        run: npm run lint
      - name: Set ssh key 
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
      - name: Deploy to Server
        if: ${{ success() }}
        run: |
          ssh -o StrictHostKeyChecking=no ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_HOST }} << EOF
            cd apps
            cd nextjs-folder-structure-example
            git pull
            npm ci
            npm run build
            pm2 restart nextjs-example-process
          EOF

და ეს არის, რა თქმა უნდა მთავარი ნაწილი. ჩვენ სანამ "Deply to Server"-ამდე მივალთ გვაქ ამ workflow-ს CI გაწერილი იმისთვის რო ლინტერი გავუშვათ, ამისთვის ჩვენ ვიყენებთ ორ დამხმარე action-ს actions/checkout და actions/setup-node-ს checkout-ი ჩვენი პროქტს აკოპირებს კონტეინერში რომელიც action-ის დროს შეიქმნა setup node-ი კი ალბათ როგორ მიხვდი node-ს აყენებს ამ კონტეინერში, რის შემდეგაც საჭირო ბრძანებები ეშვება იმისთვის რო linter გაეშვას, ლინტის დროს თუ არ აღმოჩნდა პრობლემა მაშინ ჩვენ private ssh key-ს ჩავამატებ container-ში, რის შემდეგაც ssh-ის საშუალებით შევალთ ჩვენ სერვერზე და იქ საჭირო ბრძანებებს გავუშვებთ იმისთვის რომ სერვერზე ავიდეს ჩვენი ცვილებები

თუ ყველაფერმა წარმატებით ჩაირა ამ ცვილებების ატანის შემდეგ workflow-ი უნდა გაეშვას და ცვილებები უნდა აისახოს სერვერზე. თუ ეს მოხდა, გილოცავვვ, მარა მოდი კითხვა გააგრძელე რამოდენიმე რაღაც უნდა გაჩვენო, და თუ არ მაქ მოსალოცად საქმე მაინც გააგრძელე შეიძლება დაგეხმაროს გასწორებაში

როცა workflow-ში რამე წარუმატებლად ეშვება, ჩვენ mail-ზე მოგვივა შეტყობინება. მაგრამ ამის შემოწმება ასევე github-იდან შეგივიძლია - გადავიდეთ რეპოზიტორიის actions ტაბში და გადასვილს შემდგომ დავინახავთ ყველა გაშვებულ workflow-ს. თუ რომელიმე ჩაფლავდა და რაღაც მიზეზის გამო ვერ გაეშვა შეგვიძლია ავირჩიოთ და ლოგები ვნახოთ 🙌 აი მაგალIთად ეს workflow წარუმატებლად დასრულდა იმის გამო, რომ არ გვქონდა დაყენებული pm2.

ნუ.. ვისთვისაც მისალოცი არ მქონდა იმედია ეს დაგეხმარათ 🙌

Last updated