Бинтаксис 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: push
on: [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 # ЗапускаСтся ΠΏΠΎ ΠΏΡƒΡˆΡƒ Π² Π²Π΅Ρ‚ΠΊΡƒ master

on.<event_name>.types

УточняСт Ρ‚ΠΈΠΏΡ‹ событий, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ workflow. НапримСр, для Ρ€Π΅Π»ΠΈΠ·Π° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ published, edited.

# Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° с пСрСносом ΠΏΠΎ строкам
name: Trigger release
on:
  release:
    types:
      - published
      - edited

on.<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 bats

jobs.<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_environment
environment:
  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: Name

jobs.<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: ./scripts

jobs.<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@master
jobs:
  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-action
jobs:
  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 build

jobs.<job_id>.steps[*].working-directory

Рабочая дирСктория для шага.

- name: Clean temp directory
  run: rm -rf *
  working-directory: ./temp

jobs.<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 name

jobs.<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/executable

jobs.<job_id>.steps[*].env

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния для шага.

steps:
  - name: My first action
    env:
      FIRST_NAME: Name

jobs.<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

ВрСмя оТидания для всСго задания. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

# ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния 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 50

jobs.<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 test
jobs:
  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 --version
jobs:
  example_matrix:
    strategy:
      matrix:
        os: [macos, windows, ubuntu-latest]
        version: [12, 14, 16]
        include:
          - os: windows-latest
            version: 17
jobs:
  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: true

jobs.<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: true

jobs.<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:18

jobs.<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/directory

jobs.<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@v1

jobs.<job_id>.with

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ action.

jobs:
  call-workflow:
    uses: actions/starter-workflows/.gitverse/workflows/deploy_workflows/container-app.yaml@master
    with:
      username: user

jobs.<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: inherit
on:
  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>

ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ сСкрСт, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² Π·Π°Π΄Π°Π½ΠΈΠΈ.

Π’Ρ‹ нашли Ρ‡Ρ‚ΠΎ искали?