Particularizarea fluxului de lucru cu variabile de mediu

Finalizat

În această unitate, veți afla cum să configurați și să gestionați comportamentul specific mediului utilizând variabile, contexte și scripturi particularizate în fluxurile de lucru Acțiuni GitHub.

Pentru a implementa acest proces, veți afla cum să:

  • Utilizați variabile de mediu implicite și particularizate.
  • Accesarea informațiilor contextuale în fluxurile de lucru.
  • Setați variabile de mediu la diferite domenii de flux de lucru.
  • Utilizați scripturi particularizate cu cuvântul cheie rulare.
  • Aplicați protecții de mediu pentru implementări.

Variabile și contexte implicite de mediu

În fluxul de lucru Acțiuni GitHub, sunt disponibile mai multe variabile de mediu implicite pe care să le utilizați, dar numai în cadrul alergătorului care execută o activitate. Aceste variabile implicite sunt sensibile la litere mari și mici și se referă la valorile de configurare pentru sistem și pentru utilizatorul curent. Vă recomandăm să utilizați aceste variabile de mediu implicite pentru a face referire la sistemul de fișiere în loc să utilizați căi de fișier cu codare hard. Pentru a utiliza o variabilă de mediu implicită, specificați $ urmat de numele variabilei de mediu.

jobs:
  prod-check:
    steps:
      - run: echo "Deploying to production server on branch $GITHUB_REF"

În plus față de variabilele implicite de mediu, puteți utiliza variabile definite ca contexte. Contextele și variabilele implicite sunt similare, pentru că ambele oferă acces la informațiile despre mediu, dar au câteva diferențe importante. Deși variabilele implicite de mediu pot fi utilizate numai în cadrul rulării, puteți utiliza variabile de context în orice moment din fluxul de lucru. De exemplu, variabilele contextuale vă permit să rulați o instrucțiune if pentru a evalua o expresie înainte de executarea alergătorului.

name: CI
on: push
jobs:
  prod-check:
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - run: echo "Deploying to production server on branch $GITHUB_REF"

Acest exemplu utilizează github.ref context pentru a verifica ramura care a declanșat fluxul de lucru. Dacă ramura este main, rulatorul este executat și imprimă "Se implementează pe serverul de producție pe ramura $GITHUB_REF". Variabila $GITHUB_REF de mediu implicită este utilizată în runner pentru a face referire la ramură. Observați că variabilele implicite de mediu sunt majuscule, unde variabilele contextuale sunt toate mici.

Informații contextuale disponibile într-un flux de lucru

Utilizați contexte pentru a accesa informații despre rularea fluxului de lucru, variabilele, mediile de rulare, activitățile și pașii. Fiecare context este un obiect care conține proprietăți care pot fi alte obiecte sau șiruri. Contextele disponibile includ github, , , envvars, job, jobs, steps, runnersecretsstrategy, matrix, needsși .inputs

Următorul tabel listează contextele și descrierile fluxului de lucru:

Context Descriere
github Informații despre rularea fluxului de lucru. Pentru mai multe informații, consultați github contextul.
env Conține variabile pe care le setați într-un flux de lucru, o activitate sau un pas. Pentru mai multe informații, consultați env contextul.
vars Conține variabile pe care le setați la nivel de depozit, organizație sau mediu. Pentru mai multe informații, consultați vars contextul.
job Informații despre activitatea în curs de rulare. Pentru mai multe informații, consultați job contextul.
jobs Doar pentru fluxurile de lucru reutilizabile, conține ieșiri ale lucrărilor din fluxul de lucru reutilizabil. Pentru mai multe informații, consultați jobs contextul.
steps Informații despre pașii care au rulat în activitatea curentă. Pentru mai multe informații, consultați steps contextul.
runner Informații despre alergător care rulează activitatea curentă. Pentru mai multe informații, consultați runner contextul.
secrets Conține numele și valorile secretelor disponibile pentru rularea unui flux de lucru. Pentru mai multe informații, consultați secrets contextul.
strategy Informații despre strategia de executare a matricei pentru activitatea curentă. Pentru mai multe informații, consultați strategy contextul.
matrix Conține proprietățile matricei definite în fluxul de lucru care se aplică activității curente. Pentru mai multe informații, consultați matrix contextul.
needs Conține rezultatele tuturor lucrărilor care sunt definite ca dependență a activității curente. Pentru mai multe informații, consultați needs contextul.
inputs Conține intrările unui flux de lucru reutilizabil sau declanșat manual. Pentru mai multe informații, consultați inputs contextul.

Contextele diferite sunt disponibile în momente diferite într-un flux de lucru care rulează. De exemplu, puteți utiliza secrets contextul doar în anumite locuri dintr-o activitate. De asemenea, puteți utiliza unele funcții, cum ar fi funcția hashFiles , doar în anumite locuri.

Următorul tabel listează restricțiile pentru fiecare context și funcție specială dintr-un flux de lucru. Contextele listate sunt disponibile doar pentru cheia de flux de lucru indicată. Nu le puteți utiliza în alt loc. Puteți utiliza o funcție oriunde dacă nu este listată în tabelul următor.

Cheie flux de lucru Context Funcții speciale
run-name github, , inputsvars Niciunul
concurrency github, , inputsvars Niciunul
env github, secrets, inputs, vars Niciunul
jobs.<job_id>.concurrency github, needs, strategy, matrix, inputsvars Niciunul
jobs.<job_id>.container github, needs, strategy, matrix, varsinputs Niciunul
jobs.<job_id>.container.credentials github, needs, strategymatrixenvvarssecretsinputs Niciunul
jobs.<job_id>.container.env.<env_id> github, , needs, strategy, matrix, jobrunner, env, vars, , , secretsinputs Niciunul
jobs.<job_id>.container.image github, needs, strategy, matrix, varsinputs Niciunul
jobs.<job_id>.continue-on-error github, needs, strategy, vars, matrixinputs Niciunul
jobs.<job_id>.defaults.run github, needs, , strategymatrix, envvars,inputs Niciunul
jobs.<job_id>.env github, needs, , strategymatrix, varssecrets,inputs Niciunul
jobs.<job_id>.environment github, needs, strategy, matrix, varsinputs Niciunul
jobs.<job_id>.environment.url github, , needs, strategy, matrix, jobrunner, env, vars, , , stepsinputs Niciunul
jobs.<job_id>.if github, needs, vars, inputs always, canceled, success, failure
jobs.<job_id>.name github, needs, strategy, matrix, varsinputs Niciunul
jobs.<job_id>.outputs.<output_id> github, , needs, , strategymatrix, jobrunner, env, vars, secrets, , stepsinputs Niciunul
jobs.<job_id>.runs-on github, needs, strategy, matrix, varsinputs Niciunul
jobs.<job_id>.secrets.<secrets_id> github, needs, , strategymatrix, secretsinputs,vars Niciunul
jobs.<job_id>.services github, needs, strategy, matrix, varsinputs Niciunul
jobs.<job_id>.services.<service_id>.credentials github, needs, strategymatrixenvvarssecretsinputs Niciunul
jobs.<job_id>.services.<service_id>.env.<env_id> github, , needs, strategy, matrix, jobrunner, env, vars, , , secretsinputs Niciunul
jobs.<job_id>.steps.continue-on-error github, , needs, , strategymatrix, jobrunner, env, vars, secrets, , stepsinputs hashFiles
jobs.<job_id>.steps.env github, , needs, , strategymatrix, jobrunner, env, vars, secrets, , stepsinputs hashFiles
jobs.<job_id>.steps.if github, , needs, strategy, matrix, jobrunner, env, vars, , , stepsinputs always, canceledsuccess, , failure,hashFiles
jobs.<job_id>.steps.name github, , needs, , strategymatrix, jobrunner, env, vars, secrets, , stepsinputs hashFiles
jobs.<job_id>.steps.run github, , needs, , strategymatrix, jobrunner, env, vars, secrets, , stepsinputs hashFiles
jobs.<job_id>.steps.timeout-minutes github, , needs, , strategymatrix, jobrunner, env, vars, secrets, , stepsinputs hashFiles
jobs.<job_id>.steps.with github, needs, , strategy, matrixjob, runner, , env, vars, secrets, stepsinputs hashFiles
jobs.<job_id>.steps.working-directory github, needs, , strategy, matrixjob, runner, , env, vars, secrets, stepsinputs hashFiles
jobs.<job_id>.strategy github, nevoi, vars, inputs Niciunul
jobs.<job_id>.timeout-minutes github, needs, strategy, matrix, varsinputs Niciunul
jobs.<job_id>.with.<with_id> github, needs, strategy, matrix, inputsvars Niciunul
on.workflow_call.inputs.<inputs_id>.default github, , inputsvars Niciunul
on.workflow_call.outputs.<output_id>.value github, locuri de muncă, vars, inputs Niciunul

Variabile de mediu particularizate

Similar cu utilizarea variabilelor implicite de mediu, puteți utiliza variabile de mediu particularizate în fișierul flux de lucru. Pentru a crea o variabilă particularizată, trebuie să o definiți în fișierul flux de lucru utilizând env context. Dacă doriți să utilizați valoarea unei variabile de mediu în interiorul unui alergător, puteți utiliza metoda normală a sistemului de operare pentru citirea variabilelor de mediu.

name: CI
on: push
jobs:
  prod-check:
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - run: echo "Nice work, $First_Name. Deploying to production server on branch $GITHUB_REF"
        env:
          First_Name: Mona

Setarea variabilelor de mediu particularizate într-un flux de lucru

Aveți posibilitatea să definiți variabile de mediu care sunt definite pentru întregul flux de lucru, utilizând env la nivelul superior al fișierului flux de lucru. Întindeți conținutul unei activități dintr-un flux de lucru utilizând jobs.<job_id>.env. Puteți să întindeți o variabilă de mediu la un anumit pas dintr-o activitate, utilizând jobs.<job_id>.steps[*].env.

Iată un exemplu care afișează toate cele trei scenarii dintr-un fișier de flux de lucru:

name: Greeting on variable day

on:
  workflow_dispatch

env:
  DAY_OF_WEEK: Monday

jobs:
  greeting_job:
    runs-on: ubuntu-latest
    env:
      Greeting: Hello
    steps:
      - name: "Say Hello Mona it's Monday"
        run: echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!"
        env:
          First_Name: Mona

Utilizarea unui context implicit într-un flux de lucru

Platforma GitHub setează variabile de mediu implicite. Acestea nu sunt definite într-un flux de lucru, dar puteți utiliza o variabilă de mediu implicită într-un flux de lucru în contextul corespunzător. Cele mai multe dintre aceste variabile, altele decât CI, începe cu GITHUB_* sau RUNNER_*. Ultimele două tipuri nu pot fi suprascrise. De asemenea, aceste variabile implicite au o proprietate de context corespunzătoare și denumită similar. De exemplu, RUNNER_* seria de variabile implicite au o proprietate contextuală corespunzătoare pentru runner.*.

Iată un exemplu despre cum să accesați variabilele implicite dintr-un flux de lucru, aplicând aceste metode:

on: workflow_dispatch

jobs:
  if-Windows-else:
    runs-on: macos-latest
    steps:
      - name: condition 1
        if: runner.os == 'Windows'
        run: echo "The operating system on the runner is $env:RUNNER_OS."
      - name: condition 2
        if: runner.os != 'Windows'
        run: echo "The operating system on the runner is not Windows, it's $RUNNER_OS."

Pentru mai multe informații, consultați Variabile implicite de mediu.

Trecerea variabilelor de mediu particularizate la un flux de lucru

Puteți trece variabilele de mediu particularizate de la un pas al unei activități de flux de lucru la pașii următori din activitate. Generați o valoare într-un pas al unei activități și atribuiți valoarea unei variabile de mediu existente sau noi. În continuare, scrieți perechea variabilă/valoare la fișierul de mediu GITHUB_ENV. Puteți utiliza fișierul de mediu într-o acțiune sau dintr-o comandă shell din activitatea fluxului de lucru utilizând run cuvântul cheie.

Pasul care creează sau actualizează variabila de mediu nu are acces la noua valoare, dar toți pașii următori dintr-o lucrare au acces.

Iată un exemplu:

steps:
  - name: Set the value
    id: step_one
    run: |
      echo "action_state=yellow" >> "$GITHUB_ENV"
  - name: Use the value
    id: step_two
    run: |
      printf '%s\n' "$action_state" # This will output 'yellow'

Adăugarea protecțiilor de mediu

Puteți adăuga reguli de protecție pentru mediile definite pentru depozitul dvs. GitHub.

Pentru a adăuga un mediu, în depozit:

  1. Selectați Setări.

    Bara de meniu a unei interfețe web cu file precum Cod, Probleme și Wiki; Setările sunt evidențiate.

  2. În panoul din stânga, selectați Mediu.

    Captură de ecran a unui meniu Setări de sub General, cu secțiuni pentru Acces, Cod și automatizare, Securitate și Integrări. Opțiunea Medii este evidențiată.

  3. Selectați butonul Mediu nou pentru a adăuga și a configura un mediu și a adăuga protecții.

    Captură de ecran a paginii Setări depozit GitHub afișând secțiunea Medii cu un mesaj care indică faptul că nu există medii și un buton Mediu nou evidențiat.

Despre medii

Utilizați medii pentru a descrie un obiectiv general de implementare, cum ar fi producția, paginarea sau dezvoltarea. Atunci când un flux de lucru Acțiuni GitHub se implementează într-un mediu, mediul apare pe pagina principală a depozitului. Puteți utiliza medii pentru a solicita aprobarea unei activități pentru a continua, a restricționa ramurile care pot declanșa un flux de lucru, implementări de poartă utilizând reguli de protecție a implementării particularizate sau puteți limita accesul la secrete.

Fiecare activitate dintr-un flux de lucru poate face referire la un mediu. Orice reguli de protecție pe care le setați pentru mediu trebuie să treacă înainte ca o activitate care face referire la mediu să fie trimisă unui alergător. Activitatea poate accesa secretele mediului numai după ce activitatea este trimisă unui alergător.

Atunci când un flux de lucru face referire la un mediu, mediul apare în implementările depozitului.

Reguli de protecție a mediului

Regulile de protecție a implementării mediului necesită condiții specifice de transfer înainte de o activitate care face referire la mediu. Puteți utiliza regulile de protecție a implementării pentru a solicita o aprobare manuală, a amâna o activitate sau a restricționa mediul la anumite ramuri. De asemenea, puteți să creați și să implementați reguli de protecție particularizate susținute de aplicațiile GitHub pentru a utiliza sistemele partenere pentru a controla implementările care fac referire la medii care sunt configurate pe GitHub.

Iată o explicație a acestor reguli de protecție:

  • Reguli obligatorii de protecție a recenzenților. Utilizați această regulă pentru a solicita unei anumite persoane sau unei echipe să aprobe activități de flux de lucru care fac referire la mediu. Puteți lista până la șase utilizatori sau echipe ca recenzenți. Recenzenții trebuie să aibă cel puțin permisiuni citire la depozit. Numai un recenzent necesar trebuie să aprobe activitatea pentru ca aceasta să continue.

    De asemenea, puteți preveni auto-recenziile pentru implementările într-un mediu protejat. Dacă activați această setare, utilizatorii care inițiază o implementare nu pot aproba activitatea de implementare, chiar dacă sunt recenzenți necesari. Prin activarea auto-revizuirilor, se asigură că mai multe persoane revizuiesc implementările în medii protejate.

    Pentru mai multe informații despre revizuirea lucrărilor care fac referire la un mediu cu recenzenții necesari, consultați Revizuirea implementărilor.

  • Reguli de proiectare a cronometrului de așteptare. Puteți utiliza o regulă de protecție a cronometrului de așteptare pentru a întârzia o activitate pentru o anumită perioadă de timp după ce se declanșează inițial activitatea înainte de a continua implementarea mediului. Timpul (în minute) trebuie să fie un număr întreg între 1 și 43.200 (30 de zile). Timpul de așteptare nu se contorizează în timpul facturabil.

  • Reguli de protecție a ramurilor și etichetelor. Puteți utiliza regulile de implementare ramură și protecție etichete pentru a restricționa ramurile și etichetele utilizate pentru a implementa în mediu. Aveți mai multe opțiuni pentru implementarea ramurii și regulile de protecție a etichetelor pentru un mediu.

    • Nicio restricție nu setează nicio restricție pe ce ramură sau etichetă se poate implementa în mediu.
    • Ramurile protejate permit numai ramuri cu reguli de protecție a ramurilor activate pentru implementare în mediu. Dacă nu sunt definite reguli de protecție pentru ramură pentru orice ramură din depozit, atunci toate ramurile se pot implementa. Setarea Ramuri și etichete selectate asigură doar ramurile și etichetele care corespund modelelor de nume specificate se pot implementa în mediu.
    • Dacă specificați releases/* ca regulă de implementare sau etichetă, doar o ramură sau o etichetă cu un nume care începe cu releases/ poate fi implementată în mediu. (Caracterele wildcard nu se potrivesc /. Pentru a potrivi ramurile sau etichetele care încep cu release/ și care conțin o altă bară oblică unică, utilizați release/*/*.) Dacă adăugați main ca regulă de ramură, o ramură numită main se poate implementa și în mediu.
  • Reguli de protecție pentru implementarea particularizată. Puteți crea reguli de protecție particularizate pentru a implementa implementările pentru a utiliza serviciile partenere. De exemplu, puteți utiliza sisteme de observare, sisteme de gestionare a modificărilor, sisteme de calitate a codului sau alte configurații manuale pe care le utilizați pentru a evalua pregătirea și a furniza aprobări automate pentru implementări la GitHub.

    După ce creați reguli de protecție a implementării particularizate și le instalați într-un depozit, puteți activa regula de protecție a implementării particularizate pentru orice mediu din depozit.

    Captură de ecran care afișează pagina Setări pentru configurarea Mediului1 cu opțiuni pentru recenzenți, cronometru de așteptare, reguli particularizate și restricții de ramură.

Notă

Dacă aveți un plan de echipă GitHub gratuit, GitHub Pro sau GitHub, regulile de proiectare a implementării mediului sunt disponibile doar pentru depozitele publice; cu excepția regulilor de protejare a etichetelor și a ramurilor. Pentru utilizatorii care au planuri de echipă GitHub Pro sau GitHub, regulile de ramură și de protecție a etichetelor sunt disponibile și pentru depozitele private.

Scripturi în fluxul de lucru

În exemplele precedente ale fragmentului de flux de lucru, cuvântul cheie run este utilizat pentru a imprima un șir de text. Deoarece cuvântul cheie run spune activității să execute o comandă în rulare, utilizați run cuvânt cheie pentru a rula acțiuni sau scripturi.

jobs:
  example-job:
    steps:
      - run: npm install -g bats

În acest exemplu, utilizați npm pentru a instala bats pachetul de testare software utilizând run cuvântul cheie. De asemenea, puteți rula un script ca acțiune. Puteți să stocați scriptul în depozit, adesea efectuat într-un director .github/scripts/, apoi să furnizați calea și tipul shell utilizând cuvântul cheie run.

jobs:
  example-job:
    steps:
      - name: Run build script
        run: ./.github/scripts/build.sh
        shell: bash