Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ workflow
Π Π°Π·Π±Π΅ΡΠ΅ΠΌΡΡ Π² ΡΠΈΠ½ΡΠ°ΠΊΡΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ workflow.
Π€Π°ΠΉΠ»Ρ workflow Π½Π° GitVerse Π΄ΠΎΠ»ΠΆΠ½Ρ:
- Π±ΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½Ρ Π² ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ YAML;
- ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π² .gitverse/workflows/ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, Π½ΠΎ ΡΠ°Π½Π½Π΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ .yaml-ΡΠ°ΠΉΠ»Ρ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ .github/workflows/.
name
ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ workflow, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ GitVerse Π΄Π»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ Π·Π°ΠΏΡΡΠΊΠΎΠ² Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Β«CI/CDΒ».
run-name
ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ ΡΠ°Π·Π½ΡΠ΅ Π·Π°ΠΏΡΡΠΊΠΈ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ workflow.
run-name: Deploy to dev by @${{ gitverse.actor }}on
Π Π°Π·Π΄Π΅Π», ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΠΉ ΡΡΠΈΠ³Π΅ΡΡ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΡΡ
workflow Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½. ΠΡΠΈΠΌΠ΅ΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ Π²ΠΊΠ»ΡΡΠ°ΡΡ push, pull_request, workflow_dispatch ΠΈ Π΄ΡΡΠ³ΠΈΠ΅.
on: pushon: [push, fork] # ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΠΎ ΠΏΡΡΡ ΠΈΠ»ΠΈ ΡΠΎΡΠΊΡ# workflow Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠΎΡΠΊΠΎΠ²
name: Trigger fork
on:
fork: # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΡΠΊΠ° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ
jobs:
notify-fork:
name: Notify about New Forks
runs-on: ubuntu-latest
steps:
- name: Log fork event
run: |
echo "Trigger: ${{ gitverse.event_name }}"
echo "Actor (who forked): ${{ gitverse.actor }}"
echo "Fork details: ${{ gitverse.event.forkee.full_name }}"
echo "Created at: ${{ gitverse.event.forkee.created_at }}"name: Trigger push
on:
push:
branches:
- master # ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΠΎ ΠΏΡΡΡ Π² Π²Π΅ΡΠΊΡ masteron.<event_name>.types
Π£ΡΠΎΡΠ½ΡΠ΅Ρ ΡΠΈΠΏΡ ΡΠΎΠ±ΡΡΠΈΠΉ, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅Π°Π³ΠΈΡΡΠ΅Ρ workflow. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΡΠ΅Π»ΠΈΠ·Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ published, edited.
# Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΎΠΌ ΠΏΠΎ ΡΡΡΠΎΠΊΠ°ΠΌ
name: Trigger release
on:
release:
types:
- published
- editedon.<pull_request|pull_request_target>.<branches|branches-ignore>
Π€ΠΈΠ»ΡΡΡΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΡΠ»ΠΈΡΠ½ΠΈΠ΅ ΠΏΠΎ Π²Π΅ΡΠΊΠ°ΠΌ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ branches Π΄Π»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ branches-ignore Π΄Π»Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ
Π²Π΅ΡΠΎΠΊ.
# Π’ΡΠΈΠ³Π³Π΅Ρ Π΄Π»Ρ ΡΠΎΠ±ΡΡΠΈΡ pull_request
name: Trigger pull_request
on:
pull_request: # Π·Π°ΠΏΡΠΎΡ Π½Π° ΡΠ»ΠΈΡΠ½ΠΈΠ΅
# Π΅ΡΠ»ΠΈ types Π½Π΅ ΡΠΊΠ°Π·Π°Π½, workflow Π±ΡΠ΄Π΅Ρ ΡΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π½Π° Π²ΡΠ΅ ΡΠΈΠΏΡ ΡΠΎΠ±ΡΡΠΈΠΉ ΡΡΠΈΠ³Π³Π΅ΡΠ°
types:
- opened # ΠΎΡΠΊΡΡΡ
- edited # ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½
- closed # Π·Π°ΠΊΡΡΡ
- reopened # ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΎΡΠΊΡΡΡ
- synchronize # ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½
# Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ:
# - assigned # Π½Π°Π·Π½Π°ΡΠ΅Π½
# - unassigned # Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠΌΠ΅Π½Π΅Π½ΠΎ
# - review_requested # Π·Π°ΠΏΡΠΎΡ Π½Π° ΡΠ΅Π²ΡΡ
# - review_request_removed # Π·Π°ΠΏΡΠΎΡ Π½Π° ΡΠ΅Π²ΡΡ ΠΎΡΠΌΠ΅Π½Π΅Π½
# - converted_to_draft # ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ Π² ΡΠ΅ΡΠ½ΠΎΠ²ΠΈΠΊ
# - ready_for_review # Π³ΠΎΡΠΎΠ² ΠΊ ΡΠ΅Π²ΡΡ
# - locked # Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½
# - unlocked # ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½
# - labeled # ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ ΠΌΠ΅ΡΠΊΠΎΠΉ
# - unlabeled # ΠΌΠ΅ΡΠΊΠ° ΡΠ΄Π°Π»Π΅Π½Π°
# - auto_merge_enabled # Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ
# - auto_merge_disabled # Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΎ
branches:
- master
jobs:
build-test:
name: pull_request
runs-on: 'ubuntu-latest'
steps:
- name: Log PR event
run: |
echo "Trigger: ${{ gitverse.event_name }}"
echo "Action: ${{ gitverse.event.action || 'N/A' }}"
echo "PR #${{ gitverse.event.pull_request.number || gitverse.event.issue.number }}"
echo "Actor: ${{ gitverse.actor }}"on:
pull_request:
branches-ignore: # ΠΈΡΠΊΠ»ΡΡΠ°Π΅ΠΌ Π²Π΅ΡΠΊΠΈ
- 'releases/**-alpha'on:
pull_request:
branches:
- 'releases/**'
- '!releases/**-alpha' # ΠΈΡΠΊΠ»ΡΡΠ°Π΅ΠΌ Π²Π΅ΡΠΊΠΈon.push.<branches|tags|branches-ignore|tags-ignore>
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΠΈΠ³Π³Π΅ΡΠΎΠ² Π½Π° ΡΠΎΠ±ΡΡΠΈΡ push Ρ ΡΠΈΠ»ΡΡΡΠ°ΠΌΠΈ ΠΏΠΎ Π²Π΅ΡΠΊΠ°ΠΌ ΠΈΠ»ΠΈ ΡΠ΅Π³Π°ΠΌ.
name: Trigger push
on:
push:
branches:
- master
tags:
- v[0-9]+.[0-9]+.[0-9]+ # Π ΡΠΈΠ»ΡΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡon:
push:
branches:
- 'releases/**'
- '!releases/**-alpha'on.<push|pull_request|pull_request_target>.<paths|paths-ignore>
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ workflow, ΡΠΈΠ»ΡΡΡΡΡ ΠΏΠΎ ΠΏΡΡΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠ².
on:
push:
paths:
- '**.js' # ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΡΠΈ ΠΏΡΡΠ΅ js-ΡΠ°ΠΉΠ»ΠΎΠ²on:
push:
paths-ignore:
- 'docs/**' # ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΡΠΈ ΠΏΡΡΠ΅ ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌΡ ΠΏΡΡΠΈon:
push:
paths:
- 'sub-project/**'
- '!sub-project/docs/**' # ΠΈΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠΎΠ΄Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΈΠ· ΠΏΡΠ°Π²ΠΈΠ»Π° Π½Π° ΠΏΡΡ# ΠΡΠΈΠΌΠ΅Ρ workflow Π΄Π»Ρ ΠΏΡΡΠ° Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠ΅ΠΉ
name: Trigger push
on:
push:
branches:
- master
tags:
- v[0-9]+.[0-9]+.[0-9]+
paths:
- src/**
branches-ignore:
- gv-pages
tags-ignore:
- beta*
paths-ignore:
- "!src/test/**"
jobs:
monitor-push:
name: Push Notification
runs-on: ubuntu-latest
steps:
- name: Log Push Details
run: |
echo "Trigger: ${{ gitverse.event_name }}"
echo "Branch Name: ${{ gitverse.head_ref || gitverse.ref }}"
echo "Commit SHA: ${{ gitverse.sha }}"
echo "Pusher: ${{ gitverse.actor }}"on.schedule
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΡΠΊ workflow ΠΏΠΎ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ cron-like ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ.
name: Trigger schedule
on:
schedule:
# ΠΠ°ΠΏΡΡΠΊ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄Π΅Π½Ρ Π² 9:00 ΠΏΠΎ UTC
- cron: "0 9 * * *"
jobs:
cleanup:
name: Cleanup Job
runs-on: ubuntu-latest
steps:
- name: Log Schedule Details
run: |
echo "Trigger: ${{ gitverse.event_name }}"
echo "Schedule cron: ${{ gitverse.event.cron }}"on.workflow_call
Π’ΡΠΈΠ³Π³Π΅Ρ Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠΎΠ³ΠΎ workflow ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ workflow.
on.workflow_call.inputs
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π²Ρ ΠΎΠ΄Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ workflow.
name: Trigger workflow_call
on:
workflow_call:
inputs:
message:
description: "Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π°"
required: false
default: "Hello from reusable workflow!"
jobs:
echo-message:
runs-on: ubuntu-latest
steps:
- name: Print input message in base job
run: echo "${{ inputs.message }}"on.workflow_call.inputs.<input_id>.type
Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠΈΠΏ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΡΠΎΠΊΠ° ΠΈΠ»ΠΈ ΡΠΈΡΠ»ΠΎ.
on.workflow_call.outputs
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π²ΡΡ ΠΎΠ΄Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ ΠΏΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ workflow.
on:
workflow_call:
# ΠΠ°ΠΏΠΏΠΈΠ½Π³ Π²ΡΡ
ΠΎΠ΄Π½ΡΡ
ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² workflow ΠΈ Π·Π°Π΄Π°Π½ΠΈΠΉ
outputs:
workflow_output1:
description: "The first job output"
value: ${{ jobs.my_job.outputs.job_output1 }}
workflow_output2:
description: "The second job output"
value: ${{ jobs.my_job.outputs.job_output2 }}on.workflow_call.secrets
Π‘Π΅ΠΊΡΠ΅ΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ workflow.
on:
workflow_call:
secrets:
access-token:
description: 'Π’ΠΎΠΊΠ΅Π½, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠΉ ΠΈΠ· Π²ΡΠ·ΡΠ²Π°Π±ΡΠ΅Π³ΠΎ workflow'
required: false
jobs:
pass-secret-to-action:
runs-on: ubuntu-latest
steps:
# ΠΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ΅ΠΊΡΠ΅Ρ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅
- name: ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠ΅ΠΊΡΠ΅ΡΠ° Π² action
uses: ./.gitverse/actions/my-action
with:
token: ${{ secrets.access-token }}
# ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠ΅ΠΊΡΠ΅ΡΠ° Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΠΌΠ½ΠΎΠ³ΠΎΡΠ°Π·ΠΎΠ²ΡΠΉ workflow
pass-secret-to-workflow:
uses: ./.gitverse/workflows/my-workflow
secrets:
token: ${{ secrets.access-token }}on.workflow_call.secrets.<secret_id>
ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠ΅ΠΊΡΠ΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ workflow.
on.workflow_call.secrets.<secret_id>.required
ΠΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΠ΅ΠΊΡΠ΅Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ workflow.
on.workflow_dispatch
Π’ΡΠΈΠ³Π³Π΅Ρ Π΄Π»Ρ ΡΡΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° workflow ΡΠ΅ΡΠ΅Π· API ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
on.workflow_dispatch.inputs
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π²Ρ ΠΎΠ΄Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΡΡΡΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ°.
name: Trigger workflow_dispatch
on:
workflow_dispatch: # ΠΡΠΎ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΡΡΠ½ΠΎΠΉ Π·Π°ΠΏΡΡΠΊ
inputs:
environment:
type: choice
options:
- dev
- staging
- production
default: staging
description: 'Target deployment environment'
timeout:
type: number
default: 60
description: 'Max time for deployment in seconds'
deploy:
type: boolean
default: true
description: 'To deploy'
deploy_version:
description: 'Application version to deploy'
required: true
default: '1.0.0'
jobs:
manual-trigger:
runs-on: ubuntu-latest
steps:
- name: Show Dispatch Inputs
run: |
echo "Trigger: ${{ gitverse.event_name }}"
echo "Triggered by: ${{ gitverse.actor }}"
echo "Environment: ${{ inputs.environment }}"
echo "Timeout: ${{ inputs.timeout }} seconds"
echo "Deploy: ${{ inputs.deploy }}"
echo "Deploy version: ${{ inputs.deploy_version }}"on.workflow_dispatch.inputs.<input_id>.required
Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ.
on.workflow_dispatch.inputs.<input_id>.type
Π£ΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠΈΠΏ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°.
env
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π² workflow.
# ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ (env:) Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ
name: Env Variables
on:
push:
branches:
- master
jobs:
env usage:
runs-on: ubuntu-latest
# ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ (Π΄Π»Ρ Π²ΡΠ΅ΠΉ Π·Π°Π΄Π°ΡΠΈ)
env:
GLOBAL_VAR: "ΠΡΠΈΠ²Π΅Ρ ΠΈΠ· Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ"
steps:
# ΠΠΎΠΊΠ°Π»ΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ (ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ°Π³Π°)
- name: Print global + local env
env:
LOCAL_VAR: "ΠΡΠΈΠ²Π΅Ρ ΠΈΠ· Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ"
run: |
echo "GLOBAL_VAR = $GLOBAL_VAR"
echo "LOCAL_VAR = $LOCAL_VAR"jobs
Π‘Π΅ΠΊΡΠΈΡ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠ°Ρ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΡΠ΅ Π·Π°Π΄Π°Π½ΠΈΡ Π² workflow.
jobs.<job_id>
ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π·Π°Π΄Π°Π½ΠΈΡ.
jobs:
my_first_job: # ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π·Π°Π΄Π°Π½ΠΈΡ
name: My first job
my_second_job: # ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π·Π°Π΄Π°Π½ΠΈΡ
name: My second job jobs.<job_id>.name
ΠΠΌΡ Π·Π°Π΄Π°Π½ΠΈΡ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΠΎΠ΅ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅.
jobs.<job_id>.needs
ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π·Π°Π΄Π°Π½ΠΈΡ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ Π·Π°Π΄Π°Π½ΠΈΠΉ.
# ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΠ³ΠΎ Π·Π°Π΄Π°Π½ΠΈΡ
jobs:
job1:
job2:
needs: job1
job3:
needs: [job1, job2]# ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΠ³ΠΎ Π·Π°Π΄Π°Π½ΠΈΡ
jobs:
job1:
job2:
needs: job1
job3:
if: ${{ always() }}
needs: [job1, job2]jobs.<job_id>.if
Π£ΡΠ»ΠΎΠ²ΠΈΠ΅, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΎ.
if: ${{ ! startsWith(gitverse.ref, 'refs/tags/') }}# ΠΠ°ΠΏΡΡΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ
name: example-workflow
on: [push]
jobs:
production-deploy:
if: gitverse.repository == 'actions/starter-workflows'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v4
with:
node-version: '14'
- run: npm install -g batsjobs.<job_id>.runs-on
Π‘ΡΠ΅Π΄Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π΄Π°Π½ΠΈΡ (ΠΌΠ΅ΡΠΊΠ° Π΄Π»Ρ ΡΠ°Π½Π½Π΅ΡΠ°).
runs-on: [self-hosted, x64]on:
workflow_dispatch:
inputs:
chosen-os:
required: true
type: choice
options:
- Ubuntu
- macOS
jobs:
test:
runs-on: [self-hosted, "${{ inputs.chosen-os }}"]
steps:
- run: echo Hello world!jobs.<job_id>.environment
Π‘ΡΠ΅Π΄Π°, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π·Π°Π΄Π°Π½ΠΈΠ΅.
environment: staging_environmentenvironment:
name: production_environment
url: ${{ steps.step_id.outputs.url_output }}jobs.<job_id>.outputs
ΠΡΡ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π·Π°Π΄Π°Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π·Π°Π΄Π°Π½ΠΈΡΠΌΠΈ.
jobs:
job1:
runs-on: ubuntu-latest
# ΠΡΠΈΠ²ΡΠ·ΠΊΠ° Π²ΡΡ
ΠΎΠ΄Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
ΡΠ°Π³Π° ΠΊ Π²ΡΡ
ΠΎΠ΄Π½ΡΠΌ Π΄Π°Π½Π½ΡΠΌ Π·Π°Π΄Π°Π½ΠΈΡ
outputs:
output1: ${{ steps.step1.outputs.test }}
output2: ${{ steps.step2.outputs.test }}
steps:
- id: step1
run: echo "test=hello" >> "$GITVERSE_OUTPUT"
- id: step2
run: echo "test=world" >> "$GITVERSE_OUTPUT"
job2:
runs-on: ubuntu-latest
needs: job1
steps:
- env:
OUTPUT1: ${{needs.job1.outputs.output1}}
OUTPUT2: ${{needs.job1.outputs.output2}}
run: echo "$OUTPUT1 $OUTPUT2"jobs:
job1:
runs-on: ubuntu-latest
outputs:
output_1: ${{ steps.gen_output.outputs.output_1 }}
output_2: ${{ steps.gen_output.outputs.output_2 }}
output_3: ${{ steps.gen_output.outputs.output_3 }}
strategy:
matrix:
version: [1, 2, 3]
steps:
- name: Generate output
id: gen_output
run: |
version="${{ matrix.version }}"
echo "output_${version}=${version}" >> "$GITVERSE_OUTPUT"
job2:
runs-on: ubuntu-latest
needs: [job1]
steps:
# Will show
# {
# "output_1": "1",
# "output_2": "2",
# "output_3": "3"
# }
- run: echo '${{ toJSON(needs.job1.outputs) }}'jobs.<job_id>.env
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠ΅ Π΄Π»Ρ Π·Π°Π΄Π°Π½ΠΈΡ.
jobs:
job1:
env:
FIRST_NAME: Namejobs.<job_id>.defaults
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π΄Π»Ρ Π·Π°Π΄Π°Π½ΠΈΡ.
jobs.<job_id>.defaults.run
ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄ Π·Π°Π΄Π°Π½ΠΈΡ.
jobs.<job_id>.defaults.run.shell
ΠΠ±ΠΎΠ»ΠΎΡΠΊΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄ Π·Π°Π΄Π°Π½ΠΈΡ.
jobs.<job_id>.defaults.run.working-directory
Π Π°Π±ΠΎΡΠ°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄ Π·Π°Π΄Π°Π½ΠΈΡ.
jobs:
job1:
runs-on: ubuntu-latest
defaults:
run:
shell: bash
working-directory: ./scriptsjobs.<job_id>.steps
Π¨Π°Π³ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² Π·Π°Π΄Π°Π½ΠΈΠΈ.
name: ΠΠ½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎ Ρ ΡΠ°Π³Π°ΠΌΠΈ
on: push
jobs:
my-job:
name: My Job
runs-on: ubuntu-latest
steps:
- name: ΠΡΠ²Π΅ΡΡΠΈ ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΠΈΠ΅
env:
MY_VAR: ΠΡΠΈΠ²Π΅Ρ! ΠΠ΅Π½Ρ Π·ΠΎΠ²ΡΡ
FIRST_NAME: Name
LAST_NAME: Lastname
run: |
echo $MY_VAR $FIRST_NAME $LAST_NAME.jobs.<job_id>.steps[*].id
ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠ°Π³Π°.
jobs.<job_id>.steps[*].if
Π£ΡΠ»ΠΎΠ²ΠΈΠ΅, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ°Π³ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½.
if: ${{ ! startsWith(gitverse.ref, 'refs/tags/') }} ## Π’ΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΡΠΎΠ±ΡΡΠΈΠ΅ β Π·Π°ΠΏΡΠΎΡ Π½Π° ΡΠ»ΠΈΡΠ½ΠΈΠ΅
steps:
- name: My first step
if: ${{ gitverse.event_name == 'pull_request' }}
run: echo This event is a pull request that had an assignee removed.steps:
- name: My first step
uses: repo-org/action-name@master
- name: My backup step # ΠΠ°ΠΏΡΡΡΠΈΡΡΡ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΡΠ°Π³ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΡΠΈΠ±ΠΊΡ
if: ${{ failure() }}
uses: actions/heroku@1.0.0# ΠΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΠΊΡΠ΅Ρ Π½Π΅ Π½Π°Π·Π½Π°ΡΠ΅Π½
name: Run a step if a secret has been set
on: push
jobs:
my-jobname:
runs-on: ubuntu-latest
env:
super_secret: ${{ secrets.SuperSecret }}
steps:
- if: ${{ env.super_secret != '' }}
run: echo 'This step will only run if the secret has a value set.'
- if: ${{ env.super_secret == '' }}
run: echo 'This step will only run if the secret does not have a value set.'jobs.<job_id>.steps[*].name
ΠΠΌΡ ΡΠ°Π³Π°, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΠΎΠ΅ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅.
jobs.<job_id>.steps[*].uses
Action, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π² ΡΠ°Π³Π΅.
steps:
# ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΌΠΈΡΠ°
- uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3
# ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΌΠ°ΠΆΠΎΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΠ΅Π»ΠΈΠ·Π°
- uses: actions/checkout@v5
# ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠΉ ΡΠ΅Π»ΠΈΠ·
- uses: actions/checkout@v5.2.0
# ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π²Π΅ΡΠΊΠΈ
- uses: actions/checkout@masterjobs:
my_first_job:
runs-on: ubuntu-latest
steps:
# ΠΡΠΎΡ ΡΠ°Π³ Π΄Π΅Π»Π°Π΅Ρ ΠΊΠΎΠΏΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΠΏΠΎ
- name: My first step - check out repository
uses: actions/checkout@v5
# ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΏΡΡΠΈ Π΄ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ action
- name: Use local hello-world-action
uses: ./.gitverse/actions/hello-world-actionjobs:
my_first_job:
steps:
- name: Check out repository
uses: actions/checkout@v5
- name: Python setup
uses: actions/setup-python@v6
with:
python-version: '3.13' jobs.<job_id>.steps[*].run
ΠΠΎΠΌΠ°Π½Π΄Π°, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠ°Ρ Π² ΡΠ°Π³Π΅.
# ΠΠ΄Π½ΠΎΡΡΡΠΎΡΠ½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°
- name: Install Dependencies
run: npm install# ΠΡΠ»ΡΡΠΈΡΡΡΠΎΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
- name: Clean install dependencies and build
run: |
npm ci
npm run buildjobs.<job_id>.steps[*].working-directory
Π Π°Π±ΠΎΡΠ°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π΄Π»Ρ ΡΠ°Π³Π°.
- name: Clean temp directory
run: rm -rf *
working-directory: ./tempjobs.<job_id>.steps[*].with
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ action.
jobs:
my_first_job:
steps:
- name: My first step
uses: actions/hello_world@master
with:
first_name: Name
middle_name: Midle Name
last_name: Last namejobs.<job_id>.steps[*].with.args
ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
steps:
- name: Explain why this job ran
uses: repo-org/action-name@master
with:
entrypoint: /bin/echo
args: The ${{ gitverse.event_name }} event triggered this step.jobs.<job_id>.steps[*].with.entrypoint
Π’ΠΎΡΠΊΠ° Π²Ρ ΠΎΠ΄Π° Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ.
steps:
- name: Run a custom command
uses: repo-org/action-name@master
with:
entrypoint: /a/different/executablejobs.<job_id>.steps[*].env
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ°Π³Π°.
steps:
- name: My first action
env:
FIRST_NAME: Namejobs.<job_id>.steps[*].continue-on-error
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΠΉ, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ Π»ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅.
# Π¨Π°Π³ Ρ continue-on-error: true
name: Fail And Continue
on:
push:
branches:
- master
jobs:
Fails and Continue:
runs-on: ubuntu-latest
steps:
- name: Π¨Π°Π³ ΠΏΠ΅ΡΠ²ΡΠΉ
run: exit 1
continue-on-error: true
- name: Π¨Π°Π³ Π²ΡΠΎΡΠΎΠΉ
run: echo "ΠΡΠΎΡ ΡΠ°Π³ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΠΎΡΠΈΠ±ΠΊΡ Π²ΡΡΠ΅"jobs.<job_id>.steps[*].timeout-minutes
ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ°Π³Π° (Π² ΠΌΠΈΠ½ΡΡΠ°Ρ
), ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° timeout-minutes Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ΅Π»ΡΠΌ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ, Π΄ΡΠΎΠ±Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΡ.
jobs.<job_id>.timeout-minutes
ΠΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ Π·Π°Π΄Π°Π½ΠΈΡ. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠΌΠ°ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ:
- 15 ΠΌΠΈΠ½ΡΡ Π΄Π»Ρ ΠΎΠ±Π»Π°ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π½Π½Π΅ΡΠ°;
- 3 ΡΠ°ΡΠ° Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π½Π½Π΅ΡΠ°.
# ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ job ΡΠ΅ΡΠ΅Π· timeout-minutes
name: Timeout Job
on:
push:
branches:
- master
jobs:
example:
runs-on: ubuntu-latest
timeout-minutes: 1 # ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ 1 ΠΌΠΈΠ½ΡΡΠ° Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ job
steps:
- name: Long task
# Π£ΠΊΠ°Π·Π°Π½ΠΎ 50 ΡΠ΅ΠΊΡΠ½Π΄ Π΄Π»Ρ Π·Π΅Π»Π΅Π½ΡΡ
ΡΠ΅ΡΡΠΎΠ², Π½ΠΎ job Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 1 ΠΌΠΈΠ½ΡΡΡ
run: sleep 50jobs.<job_id>.strategy
Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π΄Π°Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ°ΡΡΠΈΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.
jobs.<job_id>.strategy.matrix
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΌΠ°ΡΡΠΈΡΡ Π΄Π»Ρ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ. ΠΠ°ΡΡΠΈΡΠ° β ΡΠΏΠΎΡΠΎΠ± Π·Π°ΠΏΡΡΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π·Π°Π΄Π°Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
ΠΡΠΎ ΠΌΠΎΡΠ½ΡΠΉ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ Π²Π°ΡΠΈΡ
CI/CD-ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². ΠΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½ΠΈΠΉ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡΡ
ΠΈΠ»ΠΈ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
ΠΠ»Ρ Π·Π°Π΄Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΡΡ Π² GitVerse, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ matrix Π²Π½ΡΡΡΠΈ Π±Π»ΠΎΠΊΠ° strategy ΠΈ runs-on: ${{ matrix.os }}. ΠΠ½ΡΡΡΠΈ matrix ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΉ.
Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΌΠ°ΡΡΠΈΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° Π·Π°Π΄Π°Ρ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ Node.js ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ. ΠΠ°ΠΆΠ΄Π°Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π·Π°Π΄Π°ΡΡ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡΡ
.
jobs:
build:
strategy:
matrix:
node-version: [12, 14, 16] # Π Π°Π·Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Node.js
# !TODO ΠΌΠ°ΡΡΠΈΡΠ½Π°Ρ ΡΠ±ΠΎΡΠΊΠ°
os: [self-hosted, ubuntu-latest] # Π Π°Π·Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npm testjobs:
example_matrix:
strategy:
matrix:
os: [ubuntu-22.04, ubuntu-20.04]
version: [10, 12, 14]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.version }}matrix:
os:
- ubuntu-latest
- macos
node:
- version: 14
- version: 20
env: NODE_OPTIONS=--openssl-legacy-provider- matrix.os: ubuntu-latest
matrix.node.version: 14
- matrix.os: ubuntu-latest
matrix.node.version: 20
matrix.node.env: NODE_OPTIONS=--openssl-legacy-provider
- matrix.os: macos
matrix.node.version: 14
- matrix.os: macos
matrix.node.version: 20
matrix.node.env: NODE_OPTIONS=--openssl-legacy-providerΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» ΠΠ°ΡΡΠΈΡΠ½ΡΠ΅ ΡΠ±ΠΎΡΠΊΠΈ.
jobs.<job_id>.strategy.matrix.include
ΠΠΊΠ»ΡΡΠ°Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² ΠΌΠ°ΡΡΠΈΡΡ.
jobs:
example_matrix:
strategy:
matrix:
os: [windows, ubuntu-latest]
node: [14, 16]
include:
- os: windows-latest
node: 16
npm: 6
runs-on: ${{ matrix.os }}
steps:
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
- if: ${{ matrix.npm }}
run: npm install -g npm@${{ matrix.npm }}
- run: npm --versionjobs:
example_matrix:
strategy:
matrix:
os: [macos, windows, ubuntu-latest]
version: [12, 14, 16]
include:
- os: windows-latest
version: 17jobs:
includes_only:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- site: "production"
datacenter: "site-a"
- site: "staging"
datacenter: "site-b"jobs.<job_id>.strategy.matrix.exclude
ΠΡΠΊΠ»ΡΡΠ°Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΈΠ· ΠΌΠ°ΡΡΠΈΡΡ.
jobs.<job_id>.strategy.fail-fast
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π»ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π½Π΅ΡΠ΄Π°ΡΠ΅.
jobs:
test:
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental }}
strategy:
fail-fast: true
matrix:
version: [6, 7, 8]
experimental: [false]
include:
- version: 9
experimental: truejobs.<job_id>.strategy.max-parallel
ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ Π·Π°Π΄Π°Π½ΠΈΠΉ.
jobs.<job_id>.continue-on-error
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½ΠΈΡ ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅.
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.experimental }}
strategy:
fail-fast: false
matrix:
node: [13, 14]
os: [self-hosted, ubuntu-latest]
experimental: [false]
include:
- node: 15
os: ubuntu-latest
experimental: truejobs.<job_id>.container
ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π΄Π»Ρ Π·Π°Π΄Π°Π½ΠΈΡ.
name: CI
on:
push:
branches: [ master ]
jobs:
container-test-job:
runs-on: ubuntu-latest
container:
image: node:18
env:
NODE_ENV: development
ports:
- 80
volumes:
- my_docker_volume:/volume_mount
options: --cpus 1
steps:
- name: Check for dockerenv file
run: (ls /.dockerenv && echo Found dockerenv) || (echo No dockerenv)jobs:
container-test-job:
runs-on: ubuntu-latest
container: node:18jobs.<job_id>.container.image
ΠΠ±ΡΠ°Π· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π΄Π°Π½ΠΈΡ.
jobs.<job_id>.container.credentials
Π£ΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΎΠ±ΡΠ°Π·Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
container:
image: ghcr.io/owner/image
credentials:
username: ${{ gitverse.actor }}
password: ${{ secrets.gitverse_token }}jobs.<job_id>.container.env
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
jobs.<job_id>.container.ports
ΠΠΎΡΡΡ, ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ.
jobs.<job_id>.container.volumes
Π’ΠΎΠΌΠ°, ΠΌΠΎΠ½ΡΠΈΡΡΠ΅ΠΌΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ.
volumes:
- my_docker_volume:/volume_mount
- /data/my_data
- /source/directory:/destination/directoryjobs.<job_id>.container.options
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
jobs.<job_id>.uses
Action, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π² Π·Π°Π΄Π°Π½ΠΈΠΈ.
jobs:
call-workflow-1-in-local-repo:
uses: repo-org/this-repo/.gitverse/workflows/workflow-1.yml@172239021f7ba04fe7327647b213799853a9eb89
call-workflow-2-in-local-repo:
uses: ./.gitverse/workflows/workflow-2.yml
call-workflow-in-another-repo:
uses: repo-org/another-repo/.gitverse/workflows/workflow.yml@v1jobs.<job_id>.with
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ action.
jobs:
call-workflow:
uses: actions/starter-workflows/.gitverse/workflows/deploy_workflows/container-app.yaml@master
with:
username: userjobs.<job_id>.with.<input_id>
ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π΄Π»Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ.
jobs.<job_id>.secrets
Π‘Π΅ΠΊΡΠ΅ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π² Π·Π°Π΄Π°Π½ΠΈΠΈ.
jobs:
call-workflow:
uses: actions/starter-workflows/.gitverse/workflows/deploy_workflows/container-app.yaml@master
secrets:
access-token: ${{ secrets.CLOUD_RU_PASSWORD }}jobs.<job_id>.secrets.inherit
ΠΠ°ΡΠ»Π΅Π΄ΡΠ΅Ρ Π»ΠΈ ΡΠ΅ΠΊΡΠ΅ΡΡ ΠΈΠ· Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ.
on:
workflow_dispatch:
jobs:
pass-secrets-to-workflow:
uses: ./.gitverse/workflows/called-workflow.yml
secrets: inheriton:
workflow_call:
jobs:
pass-secret-to-action:
runs-on: ubuntu-latest
steps:
- name: Use a repo or org secret from the calling workflow.
run: echo ${{ secrets.CALLING_WORKFLOW_SECRET }}jobs.<job_id>.secrets.<secret_id>
ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΡΠ΅ΠΊΡΠ΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π² Π·Π°Π΄Π°Π½ΠΈΠΈ.