17-bo‘lim

O'z runner'ingiz

Self-hosted runner qachon kerak, uni o'rnatish, yorliqlar bilan tanlash, xizmat sifatida ishlatish va xavfsizlik qoidalari.

🕑 11 daqiqa o‘qish 📄 828 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Qachon kerak, qachon kerak emas
  2. O'rnatish
  3. Xizmat sifatida doimiy ishlatish
  4. Workflow'da ishlatish
  5. Iflos muhit muammosi
  6. Xavfsizlik
  7. Bir martalik runner'lar
  8. Kuzatish
  9. Xulosa

GitHub ning runner'lari qulay, lekin ba'zan yetarli emas: ichki tarmoqdagi serverga ulanish, maxsus apparat yoki yopiq repozitoriydagi katta hisob. Bunday hollarda o'z runner'ingizni qo'yasiz.

Qachon kerak, qachon kerak emas #

KerakKerak emas
Ichki tarmoqdagi bazaga ulanishOddiy ochiq loyiha (bepul va cheksiz)
Maxsus apparat: GPU, ARM, ko'p xotiraKichik jamoaning bir nechta repozitoriysi
Yopiq repozitoriyda katta hisobXavfsizlikni jiddiy sozlashga vaqt yo'q bo'lsa
Katta kesh va tez disk kerakBir kishilik loyiha
Litsenziyalangan dastur o'rnatilgan-
Avval hisob-kitob qiling

O'z runner'ingiz "bepul" emas: server ijarasi, yangilash, xavfsizlik va nosozliklarni tuzatish - hammasi vaqt va pul.

Yopiq repozitoriyda oyiga 3000 daqiqa bepul beriladi. Bu kuniga taxminan 100 daqiqa - kichik jamoaga ko'pincha yetadi. Shuning uchun avval haqiqiy sarfni ko'ring, keyin qaror qiling.

O'rnatish #

Repozitoriyda: Settings -> Actions -> Runners -> New self-hosted runner. GitHub tayyor buyruqlarni ko'rsatadi:

Terminal
mkdir actions-runner && cd actions-runner
curl -o actions-runner-linux-x64.tar.gz -L \
  https://github.com/actions/runner/releases/download/v2.319.1/actions-runner-linux-x64-2.319.1.tar.gz
tar xzf actions-runner-linux-x64.tar.gz

Ro'yxatdan o'tkazish (token GitHub sahifasida ko'rsatiladi va bir necha soatda tugaydi):

Terminal
./config.sh --url https://github.com/foydalanuvchi/loyiha --token AAAA...
Natija
--------------------------------------------------------------------------------
|        ____ _ _   _   _       _          _        _   _                      |
|       / ___(_) |_| | | |_   _| |__      / \   ___| |_(_) ___  _ __  ___      |
--------------------------------------------------------------------------------

# Authentication
√ Connected to GitHub

# Runner Registration
Enter the name of the runner group to add this runner to: [press Enter for Default]
Enter the name of runner: [press Enter for server-1]
Enter any additional labels (ex. label-1,label-2): [press Enter to skip] ichki,linux
√ Runner successfully added
√ Runner connection is good

Ishga tushirish:

Terminal
./run.sh
Natija
√ Connected to GitHub

Current runner version: '2.319.1'
Listening for Jobs
root ostida ishlatmang

Runner har qanday workflow kodini bajaradi. root ostida ishlasa, bu kod butun serverga ega bo'ladi.

Alohida foydalanuvchi yarating:

Terminal
sudo adduser --disabled-password --gecos "" runner
sudo -u runner -H bash -c "cd ~ && ./config.sh ..."

config.sh ning o'zi ham root ostida ishga tushirilsa, ogohlantirish beradi - uni e'tiborsiz qoldirmang.

Xizmat sifatida doimiy ishlatish #

./run.sh terminal yopilishi bilan to'xtaydi. Doimiy ishlashi uchun xizmat qilib o'rnatiladi:

Terminal
sudo ./svc.sh install runner
sudo ./svc.sh start
sudo ./svc.sh status
Natija
● actions.runner.foydalanuvchi-loyiha.server-1.service - GitHub Actions Runner
     Loaded: loaded
     Active: active (running)

Endi u server qayta yuklanganda ham o'zi ko'tariladi.

Workflow'da ishlatish #

YAML
jobs:
  test:
    runs-on: self-hosted
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm test

Bir nechta runner bo'lsa, yorliq bilan aniqlashtiriladi:

YAML
    runs-on: [self-hosted, linux, ichki]

Bu yozuv barcha yorliqlarga ega runner'ni tanlaydi.

GitHub runner va o'z runner'ingiz GitHub runner • Har ish uchun toza mashina • Muhit har safar bir xil • Xizmat ko'rsatish GitHub zimmasida • Ochiq repozitoriyda bepul • Ichki tarmoqqa kira olmaydi O'z runner'ingiz • Ichki tarmoq va maxsus apparat • Kesh va disk siznikida qoladi • Daqiqalar hisoblanmaydi • Muhit iflos bo'lib boradi • Xavfsizlik sizning zimmangizda Ko'p jamoa ikkalasini birga ishlatadi: oddiy ishlar GitHub'da, maxsus ishlar o'zida
Tanlov qulaylik va nazorat o'rtasida - ko'pincha ikkalasi birga ishlatiladi

Iflos muhit muammosi #

GitHub runner'i har ish uchun toza mashina beradi. Sizniki esa o'zgarmaydi: oldingi ishdan qolgan fayllar, o'rnatilgan paketlar va global sozlamalar joyida qoladi.

Oqibatlari:

MuammoKo'rinishi
Eski fayllar qoladiTest o'chirilgan fayl mavjudligi tufayli o'tib ketadi
Global paketlar to'planadiVersiyalar mojarosi
Disk to'ladiQuvur tushunarsiz xato bilan yiqiladi
Bir ish boshqasiga ta'sir qiladiParallel joblar bir-birining portini band qiladi

Yechim - har ishdan keyin tozalash:

YAML
    steps:
      - name: Ish maydonini tozalash
        run: |
          rm -rf "${{ github.workspace }}"/* || true
          docker system prune -af --volumes || true

      - uses: actions/checkout@v4

Yoki har ishni konteyner ichida bajarish:

YAML
jobs:
  test:
    runs-on: self-hosted
    container:
      image: node:22-alpine
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm test

Konteyner har safar toza boshlanadi - bu iflos muhit muammosini deyarli butunlay yechadi.

Xavfsizlik #

Ochiq repozitoriyda o'z runner'ingizni ishlatmang

Bu GitHub ning o'z hujjatlaridagi ogohlantirish. Sabab: har qanday odam fork qilib, PR ochib, sizning runner'ingizda o'z kodini ishga tushirishi mumkin.

Bu shunchaki nazariy xavf emas - runner'lardan kriptovalyuta qazish va ichki tarmoqqa kirish uchun ko'p marta foydalanilgan.

Qoidalar:

QoidaSabab
Faqat yopiq repozitoriydaBegona PR kod ishlata olmaydi
Alohida foydalanuvchi ostidaZarar chegaralanadi
Ichki tarmoqdan ajratilganRunner buzilsa, tarmoq ochilmaydi
Fork'lardan PR ni tasdiqlashSettings -> Actions -> Fork pull request workflows
Vaqti-vaqti bilan qayta o'rnatishIflos va buzilgan holatni tozalaydi

Bir martalik runner'lar #

Eng xavfsiz yondashuv - har ish uchun yangi runner ko'tarish va ish tugagach uni o'chirish:

Terminal
./config.sh --url https://github.com/foydalanuvchi/loyiha \
  --token AAAA... --ephemeral

--ephemeral bayrog'i bilan runner bitta ishni bajaradi va ro'yxatdan chiqadi. Bu GitHub runner'ining xatti-harakatiga yaqinlashadi: har ish toza muhitda ishlaydi.

Katta jamoalar buni avtomatlashtiradi: har navbat uchun konteyner yoki virtual mashina ko'tariladi va yo'q qilinadi.

Kuzatish #

Nima kuzatiladiNima uchun
Disk bo'sh joyiEng ko'p uchraydigan nosozlik sababi
Runner holati (online)O'chib qolsa, joblar navbatda qotadi
Navbatda kutish vaqtiUzoq kutish - runner yetishmayotgani belgisi
Runner versiyasiEskirsa, GitHub ulanishni to'xtatadi

Runner o'zini yangilab turadi, lekin juda eskirgan versiya bilan ulanish rad etiladi - shuning uchun uni butunlay unutib qo'ymaslik kerak.

Amaliy topshiriq
  1. O'z runner'ingiz kerak yoki kerak emasligini uchta dalil bilan asoslang.
  2. Sinov serveriga runner o'rnating va uni ./run.sh bilan ishga tushiring.
  3. Unga ichki va linux yorliqlarini bering.
  4. runs-on: [self-hosted, ichki] bilan job yozib, u shu runner'da ishlashini ko'ring.
  5. Runner'ni xizmat sifatida o'rnating va serverni qayta yuklab tekshiring.
  6. Bir ishda fayl yaratib, keyingi ishda u joyida turganini ko'ring (iflos muhit).
  7. Tozalash qadamini qo'shib, muammoni yeching.
  8. Xuddi shu jobni container: ichida bajarib, farqni solishtiring.
  9. --ephemeral bilan bir martalik runner ishga tushiring.
  10. Ochiq repozitoriyda o'z runner'ini ishlatish nega xavfli - uch jumlada yozing.

Xulosa #

  • O'z runner'ingiz ichki tarmoq, maxsus apparat yoki katta hisob uchun kerak bo'ladi.
  • U bepul emas: server, yangilash va xavfsizlik sizning zimmangizda.
  • Runner'ni root ostida ishlatmang - alohida foydalanuvchi yarating.
  • Doimiy ishlashi uchun uni xizmat sifatida o'rnating (svc.sh install).
  • runs-on: [self-hosted, linux, ichki] barcha yorliqlarga ega runner'ni tanlaydi.
  • Asosiy farq: GitHub runner'i toza, sizniki esa iflos bo'lib boradi.
  • Yechim - har ishdan keyin tozalash yoki ishni konteyner ichida bajarish.
  • Ochiq repozitoriyda o'z runner'ingizni ishlatmang - begona kod unda ishga tushadi.
  • --ephemeral runner bitta ish bajarib, ro'yxatdan chiqadi - eng xavfsiz variant.
  • Disk bo'sh joyi va runner holatini kuzating - bu eng ko'p uchraydigan nosozlik sabablari.

Keyingi bo'limda GitLab CI bilan solishtirib, umumiy tushunchalarni mustahkamlaymiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.