Anpassa arbetsflödet med miljövariabler
I den här lektionen får du lära dig hur du konfigurerar och hanterar miljöspecifikt beteende med hjälp av variabler, kontexter och anpassade skript i GitHub Actions-arbetsflöden.
Om du vill implementera den här processen får du lära dig att:
- Använd standardvariabler och anpassade miljövariabler.
- Få åtkomst till sammanhangsbaserad information i arbetsflöden.
- Ange miljövariabler i olika arbetsflödesomfång.
- Använd anpassade skript med nyckelordet "kör".
- Tillämpa miljöskyddsåtgärder för utplaceringar.
Standardmiljövariabler och kontexter
I GitHub Actions-arbetsflödet finns flera förinställda miljövariabler tillgängliga för dig att använda, men bara inom den körning som utför ett jobb. Dessa standardvariabler är skiftlägeskänsliga och refererar till konfigurationsvärden för systemet och för den aktuella användaren. Vi rekommenderar att du använder dessa standardmiljövariabler för att referera till filsystemet i stället för att använda hårdkodade filsökvägar. Om du vill använda en standardmiljövariabel anger du $
följt av miljövariabelns namn.
jobs:
prod-check:
steps:
- run: echo "Deploying to production server on branch $GITHUB_REF"
Förutom standardmiljövariabler kan du använda definierade variabler som kontexter. Kontexter och standardvariabler är liknande eftersom de båda ger åtkomst till miljöinformation, men de har några viktiga skillnader. Även om standardmiljövariabler endast kan användas inom löparen kan du använda kontextvariabler när som helst i arbetsflödet. Med kontextvariabler kan du till exempel köra en if
-instruktion för att utvärdera ett uttryck innan löparen körs.
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"
Det här exemplet använder kontexten github.ref
för att kontrollera grenen som utlöste arbetsflödet. Om grenen är main
körs löparen och skriver ut "Distribuera till produktionsservern på grenen $GITHUB_REF". Standardmiljövariabeln $GITHUB_REF
används i löparen för att referera till grenen. Observera att standardmiljövariabler är versaler där kontextvariabler alla är gemener.
Sammanhangsbaserad information som är tillgänglig i ett arbetsflöde
Använd kontexter för att komma åt information om arbetsflödeskörningar, variabler, runner-miljöer, jobb och steg. Varje kontext är ett objekt som innehåller egenskaper som kan vara andra objekt eller strängar. Tillgängliga kontexter är github
, env
, vars
, job
, jobs
, steps
, runner
, secrets
, strategy
, matrix
, , needs
och inputs
.
I följande tabell visas arbetsflödeskontexter och beskrivningar:
Kontext | Beskrivning |
---|---|
github |
Information om arbetsflödeskörningen. Mer information finns i github kontext. |
env |
Innehåller variabler som du anger i ett arbetsflöde, jobb eller steg. Mer information finns i env kontext. |
vars |
Innehåller variabler som du anger på lagringsplats-, organisations- eller miljönivå. Mer information finns i vars kontext. |
job |
Information om det aktuella jobbet. Mer information finns i job kontext. |
jobs |
Endast för återanvändbara arbetsflöden innehåller utdata från jobb från det återanvändbara arbetsflödet. Mer information finns i jobs kontext. |
steps |
Information om de steg som kördes i det aktuella jobbet. Mer information finns i steps kontext. |
runner |
Information om den löpare som kör det aktuella jobbet. Mer information finns i runner kontext. |
secrets |
Innehåller namn och värden för hemligheter som är tillgängliga för en arbetsflödeskörning. Mer information finns i secrets kontext. |
strategy |
Information om matriskörningsstrategin för det aktuella jobbet. Mer information finns i strategy kontext. |
matrix |
Innehåller matrisegenskaperna som definierats i arbetsflödet som gäller för det aktuella jobbet. Mer information finns i matrix kontext. |
needs |
Innehåller utdata för alla jobb som definieras som ett beroende av det aktuella jobbet. Mer information finns i needs kontext. |
inputs |
Innehåller indata för ett återanvändbart eller manuellt utlöst arbetsflöde. Mer information finns i inputs kontext. |
Olika kontexter är tillgängliga vid olika tidpunkter i en arbetsflödeskörning. Du kan till exempel bara använda kontexten secrets
på specifika platser i ett jobb. Du kan också använda vissa funktioner, till exempel hashFiles
funktionen, endast på specifika platser.
I följande tabell visas begränsningar för varje kontext och specialfunktion i ett arbetsflöde. De angivna kontexterna är endast tillgängliga för den angivna arbetsflödesnyckeln. Du kan inte använda dem någon annanstans. Du kan använda en funktion var som helst om den inte visas i följande tabell.
Arbetsflödesnyckel | Kontext | Särskilda funktioner |
---|---|---|
run-name |
github
inputs
vars
|
Ingen |
concurrency |
github
inputs
vars
|
Ingen |
env |
github , secrets , , inputs vars |
Ingen |
jobs.<job_id>.concurrency |
github , needs , strategy , matrix , inputs , vars |
Ingen |
jobs.<job_id>.container |
github , needs , strategy , matrix , vars , inputs |
Ingen |
jobs.<job_id>.container.credentials |
github , needs , strategy , matrix , env , , vars , , secrets inputs |
Ingen |
jobs.<job_id>.container.env.<env_id> |
github , needs , strategy , matrix , job , runner , , env , vars , , secrets inputs |
Ingen |
jobs.<job_id>.container.image |
github , needs , strategy , matrix , vars , inputs |
Ingen |
jobs.<job_id>.continue-on-error |
github , needs , strategy , vars , matrix , inputs |
Ingen |
jobs.<job_id>.defaults.run |
github , needs , strategy , matrix , env , vars , inputs |
Ingen |
jobs.<job_id>.env |
github , needs , strategy , matrix , vars , secrets inputs |
Ingen |
jobs.<job_id>.environment |
github , needs , strategy , matrix , vars , inputs |
Ingen |
jobs.<job_id>.environment.url |
github , needs , strategy , matrix , job , runner , , env , vars , , steps inputs |
Ingen |
jobs.<job_id>.if |
github , needs , , vars inputs |
always , canceled , , success failure |
jobs.<job_id>.name |
github , needs , strategy , matrix , vars , inputs |
Ingen |
jobs.<job_id>.outputs.<output_id> |
github , needs , strategy , matrix , job , runner , env , vars , secrets , steps , inputs |
Ingen |
jobs.<job_id>.runs-on |
github , needs , strategy , matrix , vars , inputs |
Ingen |
jobs.<job_id>.secrets.<secrets_id> |
github , needs , strategy , matrix , secrets , inputs , vars |
Ingen |
jobs.<job_id>.services |
github , needs , strategy , matrix , vars , inputs |
Ingen |
jobs.<job_id>.services.<service_id>.credentials |
github , needs , strategy , matrix , env , , vars , , secrets inputs |
Ingen |
jobs.<job_id>.services.<service_id>.env.<env_id> |
github , needs , strategy , matrix , job , runner , , env , vars , , secrets inputs |
Ingen |
jobs.<job_id>.steps.continue-on-error |
github , needs , strategy , matrix , job , runner , env , vars , secrets , steps , inputs |
hashFiles |
jobs.<job_id>.steps.env |
github , needs , strategy , matrix , job , runner , env , vars , secrets , steps , inputs |
hashFiles |
jobs.<job_id>.steps.if |
github , needs , strategy , matrix , job , runner , , env , vars , , steps inputs |
always , canceled , success , failure , hashFiles |
jobs.<job_id>.steps.name |
github , needs , strategy , matrix , job , runner , env , vars , secrets , steps , inputs |
hashFiles |
jobs.<job_id>.steps.run |
github , needs , strategy , matrix , job , runner , env , vars , secrets , steps , inputs |
hashFiles |
jobs.<job_id>.steps.timeout-minutes |
github , needs , strategy , matrix , job , runner , env , vars , secrets , steps , inputs |
hashFiles |
jobs.<job_id>.steps.with |
github , needs , strategy , matrix , job , runner , env, vars , secrets , steps , inputs |
hashFiles |
jobs.<job_id>.steps.working-directory |
github , needs , strategy , matrix , job , runner , env, vars , secrets , steps , inputs |
hashFiles |
jobs.<job_id>.strategy |
github , behov, vars , inputs , |
Ingen |
jobs.<job_id>.timeout-minutes |
github , needs , strategy , matrix , vars , inputs |
Ingen |
jobs.<job_id>.with.<with_id> |
github , needs , strategy , matrix , inputs , vars |
Ingen |
on.workflow_call.inputs.<inputs_id>.default |
github
inputs
vars
|
Ingen |
on.workflow_call.outputs.<output_id>.value |
github , jobb, vars , inputs |
Ingen |
Anpassade miljövariabler
På samma sätt som med standardmiljövariabler kan du använda anpassade miljövariabler i arbetsflödesfilen. Om du vill skapa en anpassad variabel måste du definiera den i arbetsflödesfilen med hjälp av kontexten env
. Om du vill använda värdet för en miljövariabel i en löpare kan du använda runner-operativsystemets normala metod för att läsa 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
Ange anpassade miljövariabler i ett arbetsflöde
Du kan definiera miljövariabler som är begränsade till hela arbetsflödet med hjälp env
av på den översta nivån i arbetsflödesfilen. Avgränsa innehållet i ett jobb inom ett arbetsflöde med hjälp av jobs.<job_id>.env
. Du kan omfångsbegränsa en miljövariabel i ett specifikt steg i ett jobb med hjälp jobs.<job_id>.steps[*].env
av .
Här är ett exempel som visar alla tre scenarierna i en arbetsflödesfil:
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
Använda en standardkontext i ett arbetsflöde
GitHub-plattformen anger standardmiljövariabler. De definieras inte i ett arbetsflöde, men du kan använda en standardmiljövariabel i ett arbetsflöde i lämplig kontext. De flesta av dessa variabler, förutom CI
, börjar med GITHUB_*
eller RUNNER_*
. De två senare typerna kan inte skrivas över. Dessutom har dessa standardvariabler en motsvarande och liknande namngiven kontextegenskap. Till exempel RUNNER_*
har serien med standardvariabler en matchande kontextegenskap för runner.*
.
Här är ett exempel på hur du får åtkomst till standardvariabler i ett arbetsflöde genom att använda följande metoder:
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."
Mer information finns i Standardmiljövariabler.
Skicka anpassade miljövariabler till ett arbetsflöde
Du kan skicka anpassade miljövariabler från ett steg i ett arbetsflödesjobb till efterföljande steg i jobbet. Generera ett värde i ett steg i ett jobb och tilldela värdet till en befintlig eller ny miljövariabel. Därefter skriver du variabel/värde-paret till GITHUB_ENV miljöfilen. Du kan använda miljöfilen i en åtgärd eller från ett gränssnittskommando i arbetsflödesjobbet med hjälp av nyckelordet run
.
Steget som skapar eller uppdaterar miljövariabeln har inte åtkomst till det nya värdet, men alla efterföljande steg i ett jobb har åtkomst.
Här är ett exempel:
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'
Lägga till miljöskydd
Du kan lägga till skyddsregler för miljöer som definierats för din GitHub-lagringsplats.
Om du vill lägga till en miljö på lagringsplatsen:
Välj Inställningar.
I den vänstra rutan väljer du Miljö.
Välj knappen Ny miljö för att lägga till och konfigurera en miljö och lägga till skydd.
Om miljöer
Använd miljöer för att beskriva ett allmänt distributionsmål som produktion, mellanlagring eller utveckling. När ett GitHub Actions-arbetsflöde distribueras till en miljö visas miljön på huvudsidan på lagringsplatsen. Du kan använda miljöer för att kräva godkännande för ett jobb för att fortsätta, begränsa vilka grenar som kan utlösa ett arbetsflöde, begränsa distributioner med hjälp av anpassade skyddsregler för distribution eller begränsa åtkomsten till sekretessbelagda uppgifter.
Varje jobb i ett arbetsflöde kan referera till en miljö. Alla skyddsregler som du ställer in för miljön måste godkännas innan ett jobb som använder miljön skickas till en löpare. Jobbet kan komma åt miljöns hemligheter först när jobbet har skickats till en löpare.
När ett arbetsflöde refererar till en miljö visas miljön i lagringsplatsens distributioner.
Regler för miljöskydd
Skyddsreglerna för miljöimplementering kräver specifika villkor för att uppfyllas innan en uppgift som refererar till miljön fortsätter. Du kan använda regler för skydd av distribution för att kräva ett manuellt godkännande, fördröja en process eller begränsa distributionsmiljön till specifika grenar. Du kan också skapa och implementera anpassade skyddsregler som drivs av GitHub Apps för att använda partnersystem för att styra distributioner som refererar till miljöer som är konfigurerade på GitHub.
Här är en förklaring av dessa skyddsregler:
Nödvändiga skyddsregler för granskare. Använd den här regeln om du vill kräva att en viss person eller ett visst team godkänner arbetsflödesjobb som refererar till miljön. Du kan lista upp till sex användare eller team som granskare. Granskarna måste ha minst läsbehörighet till lagringsplatsen. Endast en nödvändig granskare måste godkänna jobbet för att det ska fortsätta.
Du kan också förhindra självgranskningar för distributioner till en skyddad miljö. Om du aktiverar den här inställningen kan användare som initierar en distribution inte godkänna distributionsjobbet, även om de är en nödvändig granskare. Genom att aktivera självgranskningar säkerställer det att fler än en person granskar distributioner till skyddade miljöer.
Mer information om hur du granskar jobb som refererar till en miljö med nödvändiga granskare finns i Granska distributioner.
Projektionsregler för väntetider. Du kan använda en väntetidsskyddsregel för att fördröja ett jobb under en viss tid efter att jobbet först utlöstes innan miljödistributionen fortsätter. Tiden (i minuter) måste vara ett heltal mellan 1 och 43 200 (30 dagar). Väntetiden räknas inte mot din fakturerbara tid.
Regler för gren- och taggskydd. Du kan använda distributionsgrenar och taggskyddsregler för att begränsa vilka grenar och taggar som används för att distribuera till den aktuella miljön. Du har flera alternativ för distributionsgrenen och taggskyddsregler för en miljö.
- Ingen begränsning anger ingen begränsning för vilken gren eller tagg som kan distribueras till miljön.
- Endast skyddade grenar tillåter grenar med aktiverade grenskyddsregler att implementeras i miljön. Om inga regler för grenskydd har definierats för någon gren på lagringsplatsen kan alla grenar distribueras. Inställningen Valda grenar och taggar säkerställer att endast grenar och taggar som matchar dina angivna namnmönster kan distribueras till miljön.
- Om du anger
releases/*
som en distributionsgren eller taggregel kan endast en gren eller tagg med ett namn som börjar medreleases/
distribueras till miljön. (Jokertecken matchar inte/
. För att matcha grenar eller taggar som börjar medrelease/
och innehåller ett enda snedstreck, användrelease/*/*
.) Om du lägger tillmain
som en grenregel kan en gren med namnetmain
även utplaceras till miljön.
Anpassade distributionsskyddsregler. Du kan skapa anpassade skyddsregler för att reglera distributioner och använda partnertjänster. Du kan till exempel använda observerbarhetssystem, ändringshanteringssystem, kodkvalitetssystem eller andra manuella konfigurationer som du använder för att utvärdera beredskapen och tillhandahålla automatiserade godkännanden för distributioner till GitHub.
När du har skapat anpassade distributionsskyddsregler och installerat dem på en lagringsplats kan du aktivera regeln för anpassat distributionsskydd för alla miljöer på lagringsplatsen.
Anmärkning
Om du har en kostnadsfri GitHub-, GitHub Pro- eller GitHub-teamplan är reglerna för projektion av miljödistribution endast tillgängliga för offentliga lagringsplatser. med undantag för regler för gren- och taggskydd. För användare som har GitHub Pro- eller GitHub-teamplaner är regler för gren- och taggskydd också tillgängliga för privata lagringsplatser.
Skript i arbetsflödet
I föregående exempel på arbetsflödesfragment används nyckelordet run
för att skriva ut en textsträng. Eftersom nyckelordet run
instruerar jobbet att köra ett kommando på löparen använder du nyckelordet run
för att köra åtgärder eller skript.
jobs:
example-job:
steps:
- run: npm install -g bats
I det här exemplet använder du npm för att installera bats
programvarutestningspaketet med hjälp av nyckelordet run
. Du kan också köra ett skript som en åtgärd. Du kan lagra skriptet på lagringsplatsen, som ofta görs i en .github/scripts/
katalog, och sedan ange sökvägen och gränssnittstypen med hjälp av nyckelordet run
.
jobs:
example-job:
steps:
- name: Run build script
run: ./.github/scripts/build.sh
shell: bash