заҳролудшуда-pipeline-иҷрои-II

Ғарқшавии амиқ CI/CD PipelineОсебпазириҳо (II): Заҳролудшавии ғайримустақим Pipeline Иҷро (I-PPE)

Дар паёми қаблии мо, мо дидем, ки чӣ гуна заҳролудшавии мустақимро муайян ва муҳофизат кардан мумкин аст Pipeline Иҷро (D-PPE). Мо инчунин дидем, ки чӣ гуна ин осебпазириро бо истифода аз он муайян кардан мумкин аст Сканери Xygeni, инчунин баъзе механизмҳои муҳофизатӣ. 

 Заҳролуд шудааст Pipeline Иҷро (КУИ) вақте тавлид мешавад, ки ҳамлагар метавонад онро тағйир диҳад pipeline мантиқ бо ҳарду роҳ:

  • Бо тағир додани файли конфигуратсияи CI (the pipeline) -> PPE мустақим (D-PPE)
  • Бо тағир додани файлҳое, ки аз ҷониби онҳо истинод шудаанд pipeline (масалан: скриптҳое, ки аз дохили он истинод шудаанд pipeline файли конфигуратсия) -> ШХБ-и ғайримустақим (ШХБ-и ғайримустақим)
pp2

Дар ин паём, мо ба PPE-и ғайримустақим амиқтар менигарем. Аммо, пеш аз ин, ва ҳамчун илова ба паёми қаблии ман, биёед аввал бубинем, ки GitHub чӣ гуна иҷрои онро идора мекунад pipelineва механизмҳои муҳофизат аз D-PPE кадомҳоянд.

Чӣ тавр GitHub иҷрои онро муҳофизат мекунад? pipelineаз PR-ҳо меояд?

Чӣ тавр GitHub дар мавриди иҷрои тағирёфта кор мекунад pipelines?

дигаргун pipelines метавонад аз Pushes ё Pull Requests (PR). Ҳамчун як амалияи беҳтарин, тавсия дода мешавад, ки аз ҳама гуна "тела"-и мустақим ба шохаи ҳифзшуда ва истифодаи он худдорӣ карда шавад. Pull Requests ҳамчун механизми татбиқи баъзе баррасиҳо пеш аз қабули ягон рамзи саҳмгузор. 

Pull Requests метавонад аз ду манбаъи гуногун ворид шавад:

  • PR-ҳо аз пораҳо
  • PR-ҳо аз филиалҳо

PR-ҳо аз пораҳо метавонад аз ё аз умумӣ or хусусї анборҳо.

Азбаски мо бо PPE сарукор дорем (Заҳролудшуда Pipeline (Иҷро), нуктаи асосии мо "қабул"-и PR нест, балки иҷрои тағйирёфта аст. pipeline дар раванди қабул/тасдиқи PR. Дар асоси ҳамлаи PPE, иҷрои ғайричашмдошти як "зараровар"-и тағйирёфта мавҷуд аст. pipeline. 

Бо чанд калима, заҳролудшуда Pipeline Иҷро (PPE) вақте истеҳсол мешавад, ки ҳамлагар метавонад онро тағир диҳад pipeline мантиқи.

Ду нафар мебошанд вариантҳо:

  • PPE мустақим (D-PPE): Дар сенарияи D-PPE, Ҳамлагар файли конфигуратсияи CI-ро тағир медиҳад дар анборе, ки онҳо ба он дастрасӣ доранд, ё тавассути тела додани тағйирот мустақиман ба шохаи дурдасти ҳифзнашуда дар анбор, ё тавассути пешниҳоди PR бо тағйирот аз шоха ё чангак. Аз замони CI pipeline Иҷро аз ҷониби фармонҳо дар файли конфигуратсияи CI-и тағйирёфта муайян карда мешавад, фармонҳои зараровари ҳамлагар дар ниҳоят пас аз сохтан дар гиреҳи сохтан иҷро мешаванд. pipeline ангехта мешавад.
  • Васоити муҳофизатии ғайримустақим (I-PPE): Дар баъзе ҳолатҳо, имконияти истифодаи D-PPE барои душмане, ки ба SCM анбор (масалан, агар pipeline барои кашидани файли конфигуратсияи CI аз шохаи алоҳида ва ҳифзшуда дар ҳамон анбор танзим шудааст). Дар чунин сенария, ба ҷои заҳролуд кардан pipeline худаш, ҳамлагар рамзи зарароварро ба файлҳое, ки аз ҷониби онҳо истинод карда мешаванд, ворид мекунад pipeline (масалан: скриптҳое, ки аз дохили он истинод шудаанд pipeline файли конфигуратсия)

Дар ҳарду ҳолат, GitHub тағирёфтаро иҷро мекунад pipeline бидуни зарурати баррасии қаблӣ ё тасдиқ.

PR-ҳо аз форкҳо дар умумӣ истироҳат

GitHub имкон медиҳад, ки рафторро ҳангоми коркард танзим кунед PR-ҳо аз форкҳо дар анборҳои оммавӣ меоянд.

Вақте ки PR аз як чангак меояд, GitHub ҳамеша пеш аз иҷрои он сатҳи муайяни "тасдиқ"-ро маҷбур мекунад. pipeline марбут ба PRИн сатҳи тасдиқ аз сатҳи заиф ба сатҳи қатъӣ иваз мешавад.

At Сатҳи ташкилотӣ (Ташкилот>>Танзимот>>Амалҳо>>Умумӣ), шумо метавонед аз байни якчанд имконоти "тасдиқ" интихоб кунед:

ppe3

Сахттаринаш охирин аст ("Тасдиқи ҳамаи ҳамкорони беруна талаб карда мешавад”) зеро GitHub ҳамеша тасдиқро талаб мекунад, вақте ки PR аз форкҳо аз ҳамкорони беруна меояд. 

Аммо ҳатто дар ин ҳолати сахт, вуҷуд доранд фарқиятҳо байни ҳамкорон бо иҷозатҳои хондан ва навиштан.

  • Вақте ки PR аз як меояд хондан корбар, он иҷрои pipeline ҚАТЪ ШУДААСТ то он даме, ки тасдиқи тағйирот сурат гирад. Агар тасдиқ дуруст бошад, пас тағйирёфта pipeline иҷро карда мешавад. 
  • Вақте ки PR аз як меояд навиштан корбар, он тасдиқ лозим нест ва тағйир дода шудааст pipeline ҳамеша иҷро мешавад!! 
pp4

Хулоса, PR-ҳо, ки аз форкҳо дар анборҳои оммавӣ меоянд, аз PPE каме муҳофизат карда мешаванд. Баъзе муҳофизатҳо аз корбарони беруна (хондан) мавҷуданд, аммо ҳеҷ чиз ба корбарони дохилӣ (навиштан) рабт надорад.

Дар бораи чӣ? PR-ҳо аз форкҳо аз анборҳои хусусӣ меоянд?

PR-ҳо аз форкҳо дар хусусї истироҳат

Дар ин сенария, GitHub баъзе танзимоти муфиди конфигуратсияро пешниҳод мекунад.

ppe9

Танзимоти дар боло зикршударо метавон дар ё дар танзим кард Орган ё дар Репозиторий Сатҳи.

Кай Ҳеҷ варианте қайд нашудааст, GitHub хоҳад кард тасдиқ пурсидан ва он тағирёфтаро иҷро намекунад pipelineИн бехатартарин конфигуратсия аст!!

Дар конфигуратсияи ноамнтарин аст, вақте "Ҷараёнҳои кориро аз чангак иҷро кунед pull request"санҷида мешавадДар ин ҳолат, барои корбарони хондан ва навиштан якхела аст, Github ба таври худкор тағирёфтаро иҷро мекунад. pipeline!! Ва ин вазъият метавонад ҳатто бошад бадтар агар "Ирсоли токенҳои навиштан ба ҷараёнҳои корӣ аз чангак pull requests"Ва"Асрорҳо ва тағирёбандаҳоро ба ҷараёнҳои корӣ аз чангак фиристед pull requests"санҷида мешаванд. Ин корро накунед, агар ба таври возеҳ асоснок карда нашуда бошад!!

Агар “Барои чангак тасдиқ лозим аст pull request коргарон" қайд карда мешавад, вазъияти дар боло зикршуда то андозае беҳтар шудааст: GitHub тасдиқро мепурсад ва тағирёфтаро иҷро намекунад pipeline барои корбари хондан, аммо он ҳанӯз ҳам онро барои корбари навиштан иҷро мекунад.

ppe6

Чангакҳо дида шуданд, чӣ мешавад PR-ҳо аз филиалҳо меоянд?

PR-ҳо аз филиалҳо

Барои муҳофизат кардани ин сенария, шумо бояд ба он такя кунед Қоидаҳои ҳифзи филиал

Дар сатҳи репо, шумо метавонед қоидаҳои ҳифзи филиалро барои ҳар як филиал эҷод кунед. Ин қоидаҳо баъзе аз онҳоро илова мекунанд. маҳдудиятҳо барои тағйир додани шохаҳои ҳифзшуда.

Гарчанде ки шумо қоидаеро ба "Талаб кардан а pull request пеш аз муттаҳидшавӣ"Ва"Тасдиқҳоро талаб кунед" тағйирёфта pipeline ҳангоми эҷоди PR ба таври худкор иҷро карда мешавад."Тасдиқ" танҳо ба амали муттаҳидсозӣ дахл дорад.

ppe7

Дар бораи заҳролудшавии ғайримустақим чӣ гуфтан мумкин аст? Pipeline Иҷро

Тавре ки мо дар боло дидем, D-PPE-ро метавон бо истифода аз он коҳиш дод. pull_request_target, аммо он ба I-PPE дахл надорад.

Агар шумо pull_request_target-ро истифода баред, рамзи асосӣ рамзи асосӣ хоҳад буд. Аммо агар шумо хоҳед, ки баъзе санҷишҳоро дар рамзи саҳмгузор (рамзи PR) тасдиқ кунед, шумо бояд рамзи PR-ро ба таври возеҳ тафтиш кунед. Аз ин рӯ, агар рамзи PR ягон скрипти shell-ро, ки аз ҷониби pipeline, «пойгоҳ» (бехатар) pipeline скрипти "тағйирёфта"-и пӯстро → PPE ғайримустақимро истифода мебарад!!

Ҳалли ин масъала каме мураккабтар аст (ягон воситаи ҷодугарӣ ба монанди pull_request_target вуҷуд надорад). 

мо pipeline Акнун барои D-PPE бехатар аст, зеро мо pull_request_target-ро истифода мебарем. Аммо он то ҳол ба I-PPE осебпазир аст. 

Дар мисоли санҷишии мо, мо бояд рамзи PR-ро асосан барои сохтани сохтмон тафтиш кунем, аммо санҷишҳо дар артефакте, ки аз ҷониби сохтмон тавлид шудааст, иҷро карда мешаванд. 

Ҳамин тавр .. Чаро ҳарду пойгоҳи рамзро тафтиш намекунед? 

  • Рамзи PR-ро санҷед, зеро ин рамзи саҳмгузоришудаест, ки мо мехоҳем онро сохта ва санҷем
  • Коди асосӣ барои иҷро кардани версияи аслии онро санҷед pipeline ва скриптҳои сохтмон/озмоиш 

Ин метавонад аз ҷониби тафтиши ин пойгоҳҳои рамз дар ҷузвдонҳои гуногун: рамзи асосӣ метавонад ба ҷузвдони реша ва PR ба ҷузвдони дигар тафтиш карда шавад. Дар ин ҳолат, мо сохтан ва скрипти санҷиширо аз ҷузвдони реша бар зидди рамзи дар ҷузвдони нав ҷойгиршуда иҷро мекунем.

Албатта, ин як роҳи ҳалли осон аст!! Аммо, барои мақсадҳои омӯзишӣ ман мехоҳам як варианти хеле ҷолибро муаррифӣ кунам (…) 

GitHub workflow_run ҳодисаи триггер

Ба ғайр аз pull_request_target, GitHub як рӯйдоди дигари триггерро пешниҳод мекунад: workflow_runИн чорабинӣ имкон медиҳад иҷрои як pipeline ба дигаре шартгузорӣ шудааст pipelineиҷрои

workflow_run ва pull_request_target триггерҳо аз як ҷиҳат монанданд: ҳарду дар ҳолати имтиёзнок иҷро карда мешаванд ва, сарфи назар аз тағйироти PR, пойгоҳ pipeline қатл карда мешавад!! 

Биёед кунунии худро бубинем pipeline:

				
					name: PR TARGET CI


on:
  pull_request_target:
    branches: [ main ]


env:
  MY_SECRET: ${{ secrets.MY_SECRET }}
 
jobs:
  prt_build_test_and_merge:
    runs-on: ubuntu-latest


    steps:
      # checkout PR code
      - name: Checkout repository
        uses: actions/checkout@v4
        with:


          # This is to get the PR code instead of the repo code
          ref: ${{ github.event.pull_request.head.sha }}


      # Simulation of a compilation
      - name: Building ...
        run: |
          mkdir ./bin
          touch ./bin/mybin.exe
          ls -lR
     
      # Simulation of running tests
      - name: Running tests ...
        id : run_tests
        run: |
          echo Running tests..
          chmod +x runtests.sh
          ./runtests.sh 
          echo Tests executed.
         
      #
      # Let’s omit the check conditions at this moment …
      #
      - name: pr_check_conditions_to_merge
        [...]
				
			

Қисмати сохташуда барои D-PPE бехатар аст, аммо қисмати санҷишӣ то ҳол дар муқобили I-PPE осебпазир аст.

Дар pipeline худаш барои D-PPE бехатар аст, зеро pull_request_target триггер. Аммо қадами санҷишӣ то ҳол ба I-PPE осебпазир аст, зеро скрипти берунаи қабати пӯстро истифода мебаранд.

Пешгирӣ аз I-PPE 

Мақсади гуфтаҳои боло pipeline ин сохтан ва санҷидани рамзи саҳмгузор аст, ки барои PPE бехатар аст. 

Ҳамин тавр .. Чаро тақсим намекунед pipeline ба ду ? Яке барои сохтмон ва дигаре барои санҷиш..

  • 1 pipeline (Сохтани CI) мешуд рамзи PR-ро санҷед (барои сохтани он), сохтмонро созед ва артефакт эҷод кунед.
  • 2-ум pipeline (Санҷиши CI) мешуд рамзи асосиро санҷед (барои пешгирӣ аз тағир додани скрипти shell) ва скриптҳои аслиро бар зидди артефакт иҷро кунед. 
  • Барои ҳамоҳангсозии CI-и санҷишӣ pipeline барои иҷро кардан БАЪД аз сохтани CI pipeline, мо истифода хоҳем бурд workflow_run триггер. 
ppe8

Ба ин роҳ:

  • pipeline Сохтани CI is бехатар ба ҳарду D-PPE (бо сабаби pull_request_target) ва I-PPE (зеро он дигар скрипти shell-ро иҷро намекунад).
  • pipeline Санҷиши CI низ мебошад бехатар ба ҳарду D-PPE (бо сабаби workflow_run) ва I-PPE (зеро он рамзи асосиро барои гирифтани скрипти аслии shell тафтиш мекунад) 

Биёед рамзи ҳардуро бубинем pipelineмувофиқи ин тағйиротҳо ...

1st pipeline (Сохтани CI):

				
					name: Build CI


on:
  pull_request_target:
    branches: [ main ]


env:
  MY_SECRET: ${{ secrets.MY_SECRET }}
  GITHUB_PAT: ${{ secrets.GH_PAT }}
 
jobs:
               
  prt_build_and_upload:
    runs-on: ubuntu-latest
    steps:
      - name: Checking out PR code
        uses: actions/checkout@v4
        if: ${{ github.event_name == 'pull_request_target' }}
        with:
          # This is to get the PR code instead of the repo code
          ref: ${{ github.event.pull_request.head.sha }}


      - name: Building ...
        run: |
          mkdir ./bin
          touch ./bin/mybin.exe
	    # Save some PR info for later use by the 2nd pipeline
          echo "${{github.event.pull_request.title}}" > ./bin/PR_TITLE.txt
          echo "${{github.event.number}}" > ./bin/PR_ID.txt
 
	# Upload the binary as a pipeline artifact
      - name: Archive building artifacts
        uses: actions/upload-artifact@v3
        with:
          name: archive-bin
          path: |
            bin
				
			

2nd pipeline (Санҷиши CI):

				
					ame: Test CI


on:
  workflow_run:
    workflows: [ 'PR TARGET CI' ]
    types: [completed]
   
env:
  MY_SECRET: ${{ secrets.MY_SECRET }}
  GITHUB_PAT: ${{ secrets.GH_PAT }}




jobs:
  deploy:
    runs-on: ubuntu-latest
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    steps:
 


      # By default, checks out base code (not PR code)
      - name: Checkout repository
        uses: actions/checkout@v4


	# Download the artifact
      - name: 'Download artifact'
        uses: actions/github-script@v6
        with:
          script: |
            let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
               owner: context.repo.owner,
               repo: context.repo.repo,
               run_id: context.payload.workflow_run.id,
            });
            let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
              return artifact.name == "archive-bin"
            })[0];
            let download = await github.rest.actions.downloadArtifact({
               owner: context.repo.owner,
               repo: context.repo.repo,
               artifact_id: matchArtifact.id,
               archive_format: 'zip',
            });
            let fs = require('fs');
            fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/myartifact.zip`, Buffer.from(download.data));


	# Unzip the artifact
      - name: 'Unzip artifact'
        run: |
          unzip -o myartifact.zip


      # Runs tests
      - name: Running tests ...
        id : run_tests
        run: |
          echo Running tests..
          chmod +x runtests.sh
          ./runtests.sh
          echo Tests executed.


#
      # Let’s omit the check conditions at this moment …
      #
      - name: pr_check_conditions_to_merge
        [...]

				
			

Вой... ҳалли хуб!! Аммо ..... Оё мо дар амон ҳастем? Метарсам, ки не 😭

Дар ҳақиқат, мо як осебпазирии навро муаррифӣ кардем!! Кадомаш? Ин мавзӯи пости навбатии мо хоҳад буд 🙂 … Бо мо бимонед!! 

PS: Бубахшед, ман наметавонам хомӯш бошам 🤐 ..Шумо дар ин бора шунидаед? Заҳролудшавӣ аз артефакт ? 😂

Заҳролудшавӣ бо артефакт ва ворид кардани код

Ғарқшавии амиқ CI/CD PipelineОсебпазириҳо (III)

Муҳофизат аз заҳролудшавӣ аз артефакт тавассути тасдиқи нармафзор

Ғарқшавии амиқ CI/CD PipelineОсебпазириҳо (IV)

Заҳролуд шудааст Pipeline Иҷро (PPE)

Ғарқшавии амиқ CI/CD PipelineОсебпазириҳо (I)​
асбобҳои sca-tools-нармафзор-таҳлили таркиб
Хатарҳои нармафзори худро афзалият диҳед, ислоҳ кунед ва бехатар созед
Ҳисоби ройгони худро дастрас кунед.
Корти кредитӣ лозим нест.

Таҳия ва интиқоли нармафзори худро таъмин кунед

бо маҷмӯи маҳсулоти Xygeni