17-bo‘lim
O'z runner'ingiz
Self-hosted runner qachon kerak, uni o'rnatish, yorliqlar bilan tanlash, xizmat sifatida ishlatish va xavfsizlik qoidalari.
Ushbu bo‘lim mundarijasi
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 #
| Kerak | Kerak emas |
|---|---|
| Ichki tarmoqdagi bazaga ulanish | Oddiy ochiq loyiha (bepul va cheksiz) |
| Maxsus apparat: GPU, ARM, ko'p xotira | Kichik jamoaning bir nechta repozitoriysi |
| Yopiq repozitoriyda katta hisob | Xavfsizlikni jiddiy sozlashga vaqt yo'q bo'lsa |
| Katta kesh va tez disk kerak | Bir kishilik loyiha |
| Litsenziyalangan dastur o'rnatilgan | - |
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:
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):
./config.sh --url https://github.com/foydalanuvchi/loyiha --token AAAA...
--------------------------------------------------------------------------------
| ____ _ _ _ _ _ _ _ _ |
| / ___(_) |_| | | |_ _| |__ / \ ___| |_(_) ___ _ __ ___ |
--------------------------------------------------------------------------------
# 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:
./run.sh
√ Connected to GitHub
Current runner version: '2.319.1'
Listening for Jobs
root ostida ishlatmangRunner har qanday workflow kodini bajaradi. root ostida ishlasa, bu
kod butun serverga ega bo'ladi.
Alohida foydalanuvchi yarating:
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:
sudo ./svc.sh install runner
sudo ./svc.sh start
sudo ./svc.sh status
● 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 #
jobs:
test:
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
- run: npm ci && npm test
Bir nechta runner bo'lsa, yorliq bilan aniqlashtiriladi:
runs-on: [self-hosted, linux, ichki]
Bu yozuv barcha yorliqlarga ega runner'ni tanlaydi.
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:
| Muammo | Ko'rinishi |
|---|---|
| Eski fayllar qoladi | Test o'chirilgan fayl mavjudligi tufayli o'tib ketadi |
| Global paketlar to'planadi | Versiyalar mojarosi |
| Disk to'ladi | Quvur tushunarsiz xato bilan yiqiladi |
| Bir ish boshqasiga ta'sir qiladi | Parallel joblar bir-birining portini band qiladi |
Yechim - har ishdan keyin tozalash:
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:
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 #
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:
| Qoida | Sabab |
|---|---|
| Faqat yopiq repozitoriyda | Begona PR kod ishlata olmaydi |
| Alohida foydalanuvchi ostida | Zarar chegaralanadi |
| Ichki tarmoqdan ajratilgan | Runner buzilsa, tarmoq ochilmaydi |
| Fork'lardan PR ni tasdiqlash | Settings -> Actions -> Fork pull request workflows |
| Vaqti-vaqti bilan qayta o'rnatish | Iflos va buzilgan holatni tozalaydi |
Bir martalik runner'lar #
Eng xavfsiz yondashuv - har ish uchun yangi runner ko'tarish va ish tugagach uni o'chirish:
./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 kuzatiladi | Nima uchun |
|---|---|
| Disk bo'sh joyi | Eng ko'p uchraydigan nosozlik sababi |
| Runner holati (online) | O'chib qolsa, joblar navbatda qotadi |
| Navbatda kutish vaqti | Uzoq kutish - runner yetishmayotgani belgisi |
| Runner versiyasi | Eskirsa, 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.
- O'z runner'ingiz kerak yoki kerak emasligini uchta dalil bilan asoslang.
- Sinov serveriga runner o'rnating va uni
./run.shbilan ishga tushiring. - Unga
ichkivalinuxyorliqlarini bering. runs-on: [self-hosted, ichki]bilan job yozib, u shu runner'da ishlashini ko'ring.- Runner'ni xizmat sifatida o'rnating va serverni qayta yuklab tekshiring.
- Bir ishda fayl yaratib, keyingi ishda u joyida turganini ko'ring (iflos muhit).
- Tozalash qadamini qo'shib, muammoni yeching.
- Xuddi shu jobni
container:ichida bajarib, farqni solishtiring. --ephemeralbilan bir martalik runner ishga tushiring.- 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
rootostida 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.
--ephemeralrunner 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.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.