9-bo‘lim

Artefaktlar va qurish natijalari

upload-artifact va download-artifact, joblar orasida fayl uzatish, saqlash muddati va artefakt bilan keshning farqi.

🕑 8 daqiqa o‘qish 📄 716 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Eng sodda misol
  2. Joblar orasida fayl uzatish
  3. Artefakt va kesh - chalkashtirmang
  4. Foydali sozlamalar
  5. Xato bo'lganda ham saqlash
  6. Saqlash chegaralari
  7. Artefaktlarni tozalash
  8. Xulosa

Job tugagach, uning mashinasi o'chiriladi va barcha fayllar yo'qoladi. Qurilgan fayl, test hisoboti yoki ekran surati kerak bo'lsa - ularni artefakt sifatida saqlash kerak.

Eng sodda misol #

YAML
name: Qurish

on: push

jobs:
  qurish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm

      - run: npm ci
      - run: npm run build

      - name: Natijani saqlash
        uses: actions/upload-artifact@v4
        with:
          name: sayt
          path: dist/

Ishga tushirish tugagach, uning sahifasida Artifacts bo'limi paydo bo'ladi va sayt nomli arxivni yuklab olish mumkin.

Joblar orasida fayl uzatish #

Artefaktning asosiy vazifasi - bir jobda qurilgan narsani boshqasiga berish:

YAML
jobs:
  qurish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm run build

      - uses: actions/upload-artifact@v4
        with:
          name: sayt
          path: dist/
          retention-days: 7

  sinov:
    needs: qurish
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: sayt
          path: dist/

      - name: Nima kelganini ko'rish
        run: ls -la dist/
Fayl bir jobdan ikkinchisiga qanday o'tadi qurish jobi npm run build dist/ paydo bo'ldi upload GitHub saqlovi arxiv sifatida brauzerdan yuklab olinadi download sinov jobi boshqa mashina dist/ qaytadi Nima uchun shunday kerak Har bir job alohida mashinada ishlaydi - ular bir-birining fayllarini ko'rmaydi Bir marta quriladi, keyin hamma job o'sha natijadan foydalanadi
Artefakt - joblar orasidagi yagona ishonchli fayl yo'li
Bir marta quring, ko'p marta ishlating

Har bir jobda qaytadan qurish - vaqtni behuda sarflash. Undan ham yomoni: sinovdan o'tgan fayl bilan serverga ketadigan fayl boshqa bo'lishi mumkin.

To'g'ri tartib: bir marta quring, artefakt qiling, keyin o'sha aniq nusxani sinang va o'sha nusxani chiqaring.

Artefakt va kesh - chalkashtirmang #

ArtefaktKesh
MaqsadiNatijani saqlash va berishIshni takrorlamaslik
TarkibiQurilgan fayl, hisobot, jurnalBog'liqliklar, oraliq fayllar
Yo'qolsaNatija yo'qoladi - muammoHech narsa - qaytadan yuklanadi
Ko'rinishiIshga tushirish sahifasida, yuklab olinadiKo'rinmaydi, avtomatik ishlaydi
Kim o'qiydiOdam va keyingi joblarFaqat quvurning o'zi

Sodda qoida: natija - artefakt, oraliq ish - kesh.

Foydali sozlamalar #

YAML
      - uses: actions/upload-artifact@v4
        with:
          name: hisobot-${{ matrix.node }}
          path: |
            natijalar/
            qamrov/
            !natijalar/vaqtinchalik/
          retention-days: 14
          if-no-files-found: error
          compression-level: 9
SozlamaNima qiladi
nameArtefakt nomi - matritsada har biri boshqacha bo'lsin
pathBir nechta yo'l; ! bilan istisno qilinadi
retention-daysSaqlash muddati (1-90 kun)
if-no-files-foundwarn (sukut), error yoki ignore
compression-level0-9; katta fayllar uchun yuqori qiymat
Matritsada artefakt nomlari takrorlanmasin

Matritsadagi uchta job bir xil name: hisobot bilan yuklasa, to'rtinchi versiyada xato chiqadi - bir xil nom ikki marta ishlatib bo'lmaydi.

Nomga matritsa qiymatini qo'shing:

YAML
          name: hisobot-${{ matrix.os }}-${{ matrix.node }}

Keyin ularni bitta jobga yig'ib olish mumkin:

YAML
      - uses: actions/download-artifact@v4
        with:
          pattern: hisobot-*
          merge-multiple: true
          path: barcha-hisobotlar/

Xato bo'lganda ham saqlash #

Eng kerakli artefakt - yiqilgan testning jurnali. Lekin sukut bo'yicha qadam qizil bo'lsa, keyingilari ishlamaydi:

YAML
      - name: Testlar
        run: npm test

      - name: Jurnalni saqlash
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: test-jurnali
          path: |
            jurnallar/
            ekran-suratlari/
          if-no-files-found: ignore

if: always() bo'lmasa, aynan xato bo'lgan paytda hech narsa saqlanmaydi - bu eng ko'p uchraydigan sozlash xatosi.

Saqlash chegaralari #

ChegaraQiymat
Sukutdagi saqlash muddati90 kun (sozlamalarda o'zgartiriladi)
Maksimal muddat90 kun (jamoat repozitoriylarida)
Bepul joyOchiq repozitoriylarda cheksiz
Yopiq repozitoriydaHisobga kiritiladi - joy sarfi hisoblanadi
Artefaktga sir tushib qolmasin

Artefakt ochiq repozitoriyda hamma uchun yuklab olinadi - hatto muallifi bo'lmaganlar uchun ham.

path: . yoki path: ./ deb yozish xavfli: unga .env, sozlama fayllari va hatto .git papkasi ham tushadi. Har doim aniq papkani ko'rsating:

XavfliXavfsiz
path: .path: dist/
path: ./**path: natijalar/*.xml

Sir tushib qolsa - uni darhol almashtiring: artefaktni o'chirish yetarli emas, u allaqachon yuklab olingan bo'lishi mumkin.

Artefaktlarni tozalash #

Eski artefaktlar joy egallaydi. Ularni jadval bo'yicha tozalash mumkin:

YAML
name: Eski artefaktlarni tozalash

on:
  schedule:
    - cron: '0 2 * * 0'

permissions:
  actions: write

jobs:
  tozalash:
    runs-on: ubuntu-latest
    steps:
      - name: 14 kundan eskisini o'chirish
        uses: actions/github-script@v7
        with:
          script: |
            const chegara = Date.now() - 14 * 24 * 60 * 60 * 1000;
            const javob = await github.rest.actions.listArtifactsForRepo({
              owner: context.repo.owner,
              repo: context.repo.repo,
              per_page: 100,
            });
            for (const a of javob.data.artifacts) {
              if (new Date(a.created_at).getTime() < chegara) {
                await github.rest.actions.deleteArtifact({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  artifact_id: a.id,
                });
                console.log('o\'chirildi: ' + a.name);
              }
            }

Bu yerda permissions: actions: write majburiy - usiz API o'chirishga ruxsat bermaydi. Ruxsatlar haqida 19-bo'limda batafsil gaplashamiz.

Amaliy topshiriq
  1. Qurish natijasini artefakt sifatida saqlang va uni brauzerdan yuklab oling.
  2. retention-days: 5 qo'yib, artefakt sahifasida muddat ko'rsatilishini tekshiring.
  3. Ikkinchi job qo'shib, artefaktni download-artifact bilan oling va ls qiling.
  4. Artefaktsiz uzatishga urinib ko'ring - ikkinchi jobda fayl yo'qligini ko'ring.
  5. Matritsada uchta job uchun bir xil nom bering va chiqqan xatoni o'qing.
  6. Nomga matritsa qiymatini qo'shib, xatoni tuzating.
  7. pattern va merge-multiple bilan barcha hisobotlarni bitta jobga yig'ing.
  8. Testni ataylab yiqitib, if: always() siz jurnal saqlanmasligini ko'ring.
  9. if: always() qo'shib, farqni tekshiring.
  10. Artefakt va kesh farqini o'z so'zingiz bilan jadval qilib yozing.

Xulosa #

  • Job tugagach mashina o'chadi - saqlanishi kerak bo'lgan hamma narsa artefakt bo'lishi kerak.
  • actions/upload-artifact saqlaydi, actions/download-artifact qaytarib beradi.
  • Artefakt - joblar orasida fayl uzatishning yagona ishonchli yo'li.
  • Qoida: bir marta quring, keyin o'sha aniq nusxani sinang va chiqaring.
  • Artefakt - natija, kesh - oraliq ish; keshning yo'qolishi muammo emas, artefaktniki muammo.
  • Matritsada artefakt nomlari takrorlanmasligi kerak - nomga matritsa qiymatini qo'shing.
  • pattern va merge-multiple bir nechta artefaktni bitta joyga yig'adi.
  • Yiqilgan testning jurnalini saqlash uchun if: always() shart.
  • path: . yozmang - unga .env va boshqa sirlar tushishi mumkin.
  • Eski artefaktlarni jadval bo'yicha tozalash mumkin; buning uchun actions: write ruxsati kerak.

Keyingi bo'limda quvur natijasini PR ga bog'laymiz: holat tekshiruvlari va tarmoq himoyasi.

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.