Tilpasse arbeidsflyten med miljøvariabler
I denne enheten lærer du hvordan du konfigurerer og administrerer miljøspesifikk atferd ved hjelp av variabler, kontekster og egendefinerte skript i Arbeidsflyter for GitHub-handlinger.
Hvis du vil implementere denne prosessen, lærer du hvordan du gjør følgende:
- Bruk standard og egendefinerte miljøvariabler.
- Få tilgang til kontekstuell informasjon i arbeidsflyter.
- Angi miljøvariabler i ulike arbeidsflytomfang.
- Bruk egendefinerte skript med nøkkelordet kjør.
- Bruk miljøbeskyttelse for distribusjoner.
Standard miljøvariabler og kontekster
I arbeidsflyten For GitHub-handlinger er flere standard miljøvariabler tilgjengelige for bruk, men bare innenfor løperen som utfører en jobb. Disse standardvariablene skiller mellom store og små bokstaver, og de refererer til konfigurasjonsverdier for systemet og for gjeldende bruker. Vi anbefaler at du bruker disse standard miljøvariablene til å referere til filsystemet i stedet for å bruke hardkodede filbaner. Hvis du vil bruke en standard miljøvariabel, angir du $ etterfulgt av navnet på miljøvariabelen.
jobs:
prod-check:
steps:
- run: echo "Deploying to production server on branch $GITHUB_REF"
I tillegg til standard miljøvariabler kan du bruke definerte variabler som kontekster. Kontekster og standardvariabler er like ved at begge gir tilgang til miljøinformasjon, men de har noen viktige forskjeller. Selv om standard miljøvariabler bare kan brukes i løperen, kan du bruke kontekstvariabler når som helst i arbeidsflyten. Kontekstvariabler lar deg for eksempel kjøre en if setning for å evaluere et uttrykk før løperen kjøres.
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"
Dette eksemplet bruker github.ref kontekst til å kontrollere grenen som utløste arbeidsflyten. Hvis grenen er main, kjøres løperen og skriver ut «Distribuering til produksjonsserver på gren $GITHUB_REF». Standard miljøvariabel $GITHUB_REF brukes i løperen til å referere til grenen. Legg merke til at standard miljøvariabler er store bokstaver der kontekstvariabler er små bokstaver.
Kontekstavhengig informasjon som er tilgjengelig i en arbeidsflyt
Bruk kontekster for å få tilgang til informasjon om arbeidsflytkjøringer, variabler, løpermiljøer, jobber og trinn. Hver kontekst er et objekt som inneholder egenskaper som kan være andre objekter eller strenger. Tilgjengelige kontekster inkluderer github, , env, vars, jobjobs, steps, runner, secrets, strategy, matrix, needsog inputs.
Tabellen nedenfor viser arbeidsflytkontekster og beskrivelser:
| Kontekst | Beskrivelse |
|---|---|
github |
Informasjon om arbeidsflytkjøringen. Hvis du vil ha mer informasjon, kan du se github kontekst. |
env |
Inneholder variabler som du angir i en arbeidsflyt, jobb eller et trinn. Hvis du vil ha mer informasjon, kan du se env kontekst. |
vars |
Inneholder variabler som du angir på repositorium, organisasjon eller miljønivå. Hvis du vil ha mer informasjon, kan du se vars kontekst. |
job |
Informasjon om den gjeldende jobben. Hvis du vil ha mer informasjon, kan du se job kontekst. |
jobs |
Bare for gjenbrukbare arbeidsflyter inneholder utdata for jobber fra arbeidsflyten som kan brukes på nytt. Hvis du vil ha mer informasjon, kan du se jobs kontekst. |
steps |
Informasjon om trinnene som kjørte i gjeldende jobb. Hvis du vil ha mer informasjon, kan du se steps kontekst. |
runner |
Informasjon om løperen som kjører den gjeldende jobben. Hvis du vil ha mer informasjon, kan du se runner kontekst. |
secrets |
Inneholder navnene og verdiene til hemmeligheter som er tilgjengelige for en arbeidsflytkjøring. Hvis du vil ha mer informasjon, kan du se secrets kontekst. |
strategy |
Informasjon om strategi for kjøring av matriser for den gjeldende jobben. Hvis du vil ha mer informasjon, kan du se strategy kontekst. |
matrix |
Inneholder matriseegenskapene som er definert i arbeidsflyten som gjelder for gjeldende jobb. Hvis du vil ha mer informasjon, kan du se matrix kontekst. |
needs |
Inneholder utdataene for alle jobber som er definert som en avhengighet av gjeldende jobb. Hvis du vil ha mer informasjon, kan du se needs kontekst. |
inputs |
Inneholder inndataene for en gjenbrukbar eller manuelt utløst arbeidsflyt. Hvis du vil ha mer informasjon, kan du se inputs kontekst. |
Ulike kontekster er tilgjengelige på forskjellige tidspunkt i en arbeidsflytkjøring. Du kan for eksempel bare bruke konteksten secrets på bestemte steder i en jobb. Du kan også bruke enkelte funksjoner, for hashFiles eksempel funksjonen, bare på bestemte steder.
Tabellen nedenfor viser begrensninger for hver kontekst og spesialfunksjon i en arbeidsflyt. De oppførte kontekstene er bare tilgjengelige for den angitte arbeidsflytnøkkelen. Du kan ikke bruke dem noe annet sted. Du kan bruke en funksjon hvor som helst med mindre den er oppført i tabellen nedenfor.
| Arbeidsflytnøkkel | Kontekst | Spesielle funksjoner |
|---|---|---|
run-name |
github, , inputsvars |
Ingen |
concurrency |
github, , inputsvars |
Ingen |
env |
github, , secrets, inputsvars |
Ingen |
jobs.<job_id>.concurrency |
github, needs, , strategymatrix, inputs, ,vars |
Ingen |
jobs.<job_id>.container |
github, needs, , strategymatrix, vars, ,inputs |
Ingen |
jobs.<job_id>.container.credentials |
github, needs, , strategy, matrixenvvarssecretsinputs |
Ingen |
jobs.<job_id>.container.env.<env_id> |
github, needs, strategy, matrix, job, runner, env, vars, , secretsinputs |
Ingen |
jobs.<job_id>.container.image |
github, needs, , strategymatrix, vars, ,inputs |
Ingen |
jobs.<job_id>.continue-on-error |
github, needs, , strategyvars, matrix, ,inputs |
Ingen |
jobs.<job_id>.defaults.run |
github, needs, strategy, matrix, env, varsinputs |
Ingen |
jobs.<job_id>.env |
github, needs, strategy, matrix, vars, secretsinputs |
Ingen |
jobs.<job_id>.environment |
github, needs, , strategymatrix, vars, ,inputs |
Ingen |
jobs.<job_id>.environment.url |
github, needs, strategy, matrix, job, runner, env, vars, , stepsinputs |
Ingen |
jobs.<job_id>.if |
github, , needs, varsinputs |
always, , canceled, successfailure |
jobs.<job_id>.name |
github, needs, , strategymatrix, vars, ,inputs |
Ingen |
jobs.<job_id>.outputs.<output_id> |
github, needs, strategy, matrix, job, runner, env, vars, , secrets, stepsinputs |
Ingen |
jobs.<job_id>.runs-on |
github, needs, , strategymatrix, vars, ,inputs |
Ingen |
jobs.<job_id>.secrets.<secrets_id> |
github, needs, strategy, matrix, secrets, inputsvars |
Ingen |
jobs.<job_id>.services |
github, needs, , strategymatrix, vars, ,inputs |
Ingen |
jobs.<job_id>.services.<service_id>.credentials |
github, needs, , strategy, matrixenvvarssecretsinputs |
Ingen |
jobs.<job_id>.services.<service_id>.env.<env_id> |
github, needs, strategy, matrix, job, runner, env, vars, , secretsinputs |
Ingen |
jobs.<job_id>.steps.continue-on-error |
github, needs, strategy, matrix, job, runner, env, vars, , secrets, stepsinputs |
hashFiles |
jobs.<job_id>.steps.env |
github, needs, strategy, matrix, job, runner, env, vars, , secrets, stepsinputs |
hashFiles |
jobs.<job_id>.steps.if |
github, needs, strategy, matrix, job, runner, env, vars, , stepsinputs |
always, canceled, success, , failurehashFiles |
jobs.<job_id>.steps.name |
github, needs, strategy, matrix, job, runner, env, vars, , secrets, stepsinputs |
hashFiles |
jobs.<job_id>.steps.run |
github, needs, strategy, matrix, job, runner, env, vars, , secrets, stepsinputs |
hashFiles |
jobs.<job_id>.steps.timeout-minutes |
github, needs, strategy, matrix, job, runner, env, vars, , secrets, stepsinputs |
hashFiles |
jobs.<job_id>.steps.with |
github, needs, strategy, matrix, job, runnerenv, vars, , secrets, stepsinputs |
hashFiles |
jobs.<job_id>.steps.working-directory |
github, needs, strategy, matrix, job, runnerenv, vars, , secrets, stepsinputs |
hashFiles |
jobs.<job_id>.strategy |
github, behov, vars, , inputs |
Ingen |
jobs.<job_id>.timeout-minutes |
github, needs, , strategymatrix, vars, ,inputs |
Ingen |
jobs.<job_id>.with.<with_id> |
github, needs, , strategymatrix, inputs, ,vars |
Ingen |
on.workflow_call.inputs.<inputs_id>.default |
github, , inputsvars |
Ingen |
on.workflow_call.outputs.<output_id>.value |
github, jobber, vars, inputs |
Ingen |
Egendefinerte miljøvariabler
I likhet med bruk av standard miljøvariabler kan du bruke egendefinerte miljøvariabler i arbeidsflytfilen. Hvis du vil opprette en egendefinert variabel, må du definere den i arbeidsflytfilen ved hjelp av env kontekst. Hvis du vil bruke verdien til en miljøvariabel i en løper, kan du bruke det vanlige systemet for å lese miljøvariabler.
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
Angi egendefinerte miljøvariabler i en arbeidsflyt
Du kan definere miljøvariabler som er begrenset til hele arbeidsflyten, ved å bruke env på øverste nivå i arbeidsflytfilen. Omfang innholdet i en jobb i en arbeidsflyt ved hjelp jobs.<job_id>.envav . Du kan begrense en miljøvariabel på et bestemt trinn i en jobb ved hjelp jobs.<job_id>.steps[*].envav .
Her er et eksempel som viser alle tre scenariene i en arbeidsflytfil:
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
Bruke en standardkontekst i en arbeidsflyt
GitHub-plattformen angir standard miljøvariabler. De er ikke definert i en arbeidsflyt, men du kan bruke en standard miljøvariabel i en arbeidsflyt i riktig kontekst. De fleste av disse variablene, bortsett fra CI, begynner med GITHUB_* eller RUNNER_*. De to sistnevnte typene kan ikke overskrives. Disse standardvariablene har også en tilsvarende kontekstegenskap med tilsvarende navn. Serien med standardvariabler har for eksempel RUNNER_* en samsvarende kontekstegenskap for runner.*.
Her er et eksempel på hvordan du får tilgang til standardvariabler i en arbeidsflyt ved å bruke disse metodene:
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."
Hvis du vil ha mer informasjon, kan du se Standard miljøvariabler.
Sende egendefinerte miljøvariabler til en arbeidsflyt
Du kan sende egendefinerte miljøvariabler fra ett trinn i en arbeidsflytjobb til påfølgende trinn i jobben. Generer en verdi i ett trinn i en jobb, og tilordne verdien til en eksisterende eller ny miljøvariabel. Deretter skriver du variabel-/verdiparet til miljøfilen GITHUB_ENV. Du kan bruke miljøfilen i en handling eller fra en skallkommando i arbeidsflytjobben run ved hjelp av nøkkelordet.
Trinnet som oppretter eller oppdaterer miljøvariabelen, har ikke tilgang til den nye verdien, men alle etterfølgende trinn i en jobb har tilgang.
Her er et eksempel:
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'
Legg til miljøbeskyttelse
Du kan legge til beskyttelsesregler for miljøer som er definert for GitHub-repositoriet.
Slik legger du til et miljø i repositoriet:
Velg Innstillinger.
Velg Miljø i den venstre ruten.
Velg Nytt miljø-knappen for å legge til og konfigurere et miljø og legge til beskyttelser.
Om miljøer
Bruk miljøer til å beskrive et generelt distribusjonsmål som produksjon, oppsamling eller utvikling. Når en Arbeidsflyt for GitHub-handlinger distribueres til et miljø, vises miljøet på hovedsiden i repositoriet. Du kan bruke miljøer til å kreve godkjenning for en jobb for å fortsette, begrense hvilke grener som kan utløse en arbeidsflyt, gatedistribusjoner ved hjelp av egendefinerte distribusjonsbeskyttelsesregler eller begrense tilgangen til hemmeligheter.
Hver jobb i en arbeidsflyt kan referere til ett miljø. Alle beskyttelsesregler som du angir for miljøet, må bestå før en jobb som refererer til miljøet, sendes til en løper. Jobben kan få tilgang til miljøets hemmeligheter først etter at jobben er sendt til en løper.
Når en arbeidsflyt refererer til et miljø, vises miljøet i repositoriets distribusjoner.
Regler for miljøvern
Beskyttelsesregler for miljødistribusjon krever bestemte betingelser før en jobb som refererer til miljøet, fortsetter. Du kan bruke regler for distribusjonsbeskyttelse til å kreve manuell godkjenning, forsinke en jobb eller begrense miljøet til bestemte grener. Du kan også opprette og implementere egendefinerte beskyttelsesregler drevet av GitHub Apps for å bruke partnersystemer til å kontrollere distribusjoner som refererer til miljøer som er konfigurert på GitHub.
Her er en forklaring av disse beskyttelsesreglene:
Obligatoriske beskyttelsesregler for korrekturlesere. Bruk denne regelen til å kreve at en bestemt person eller gruppe godkjenner arbeidsflytjobber som refererer til miljøet. Du kan liste opp opptil seks brukere eller team som korrekturlesere. Korrekturleserne må minst ha lesetillatelser til repositoriet. Bare én nødvendig korrekturleser må godkjenne jobben for at den skal fortsette.
Du kan også forhindre selvvurderinger for distribusjoner til et beskyttet miljø. Hvis du aktiverer denne innstillingen, kan ikke brukere som starter en distribusjon godkjenne distribusjonsjobben, selv om de er en nødvendig korrekturleser. Ved å aktivere selvvurderinger sikrer den at mer enn én person gjennomgår distribusjoner til beskyttede miljøer.
Hvis du vil ha mer informasjon om gjennomgang av jobber som refererer til et miljø med nødvendige korrekturlesere, kan du se Se gjennom distribusjoner.
Vent tidtakerprojeksjonsregler. Du kan bruke en regel for ventetidstidtakerbeskyttelse til å utsette en jobb i en bestemt tidsperiode etter at jobben først utløses før miljødistribusjonen fortsetter. Klokkeslettet (i minutter) må være et heltall mellom 1 og 43 200 (30 dager). Ventetiden teller ikke mot fakturerbar tid.
Beskyttelsesregler for gren og kode. Du kan bruke regler for distribusjonsgren og kodebeskyttelse til å begrense hvilke grener og merker som brukes til å distribuere til miljøet. Du har flere alternativer for distribusjonsgren og kodebeskyttelsesregler for et miljø.
- Ingen begrensninger angir ingen begrensning for hvilken gren eller kode som kan distribueres til miljøet.
- Beskyttede grener tillater bare grener med regler for grenbeskyttelse aktivert for distribusjon til miljøet. Hvis ingen regler for grenbeskyttelse er definert for noen gren i repositoriet, kan alle grener distribueres. Innstillingen for valgte grener og koder sikrer at bare grener og merker som samsvarer med de angitte navnemønstrene, kan distribueres til miljøet.
- Hvis du angir
releases/*som en distribusjonsgren eller koderegel, kan bare en gren eller kode med et navn som begynner medreleases/distribueres til miljøet. (Jokertegn samsvarer/ikke . Hvis du vil sammenligne grener eller merker som begynner medrelease/og inneholder en annen enkelt skråstrek, brukerrelease/*/*du .) Hvis du legger tilmainsom en grenregel, kan en gren kaltmainogså distribuere til miljøet.
Egendefinerte beskyttelsesregler for distribusjon. Du kan opprette egendefinerte beskyttelsesregler for gatedistribusjoner for å bruke partnertjenester. Du kan for eksempel bruke observerbarhetssystemer, endre administrasjonssystemer, kodekvalitetssystemer eller andre manuelle konfigurasjoner som du bruker til å vurdere beredskap og gi automatiserte godkjenninger for distribusjoner til GitHub.
Når du har opprettet egendefinerte beskyttelsesregler for distribusjon og installert dem på et repositorium, kan du aktivere den egendefinerte distribusjonsbeskyttelsesregelen for alle miljøer i repositoriet.
Merk deg
Hvis du har en GitHub Free-, GitHub Pro- eller GitHub-teamplan, er projeksjonsreglene for miljødistribusjon bare tilgjengelige for offentlige repositorier. bortsett fra regler for gren- og kodebeskyttelse. For brukere som har GitHub Pro- eller GitHub-teamplaner, er avdelings- og merkebeskyttelsesregler også tilgjengelige for private repositorier.
Skript i arbeidsflyten
I eksemplene på den foregående arbeidsflytsnutten brukes nøkkelordet run til å skrive ut en tekststreng. Fordi nøkkelordet run forteller jobben å utføre en kommando på løperen, bruker du nøkkelordet run til å kjøre handlinger eller skript.
jobs:
example-job:
steps:
- run: npm install -g bats
I dette eksemplet bruker du npm til å installere bats programvaretestpakken ved hjelp run av nøkkelordet. Du kan også kjøre et skript som en handling. Du kan lagre skriptet i repositoriet, ofte gjort i en .github/scripts/ katalog, og deretter angi banen og skalltypen ved hjelp av nøkkelordet run.
jobs:
example-job:
steps:
- name: Run build script
run: ./.github/scripts/build.sh
shell: bash