Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. GitHub Actions: workflow, jobs, steps
github_actions_workflow

GitHub Actions: workflow, jobs, steps

Структура workflow, настройка jobs и steps, передача данных между шагами.

GitHub Actions: workflow, jobs, steps

Понимание структуры workflow — основа эффективной настройки CI/CD в GitHub Actions. Изучите иерархию компонентов и способы передачи данных между ними.

#Иерархия GitHub Actions

Workflow
├── Job 1 (runs-on: ubuntu-latest)
│   ├── Step 1 (uses: actions/checkout@v4)
│   ├── Step 2 (run: npm install)
│   └── Step 3 (run: npm test)
├── Job 2 (runs-on: ubuntu-latest)
│   ├── Step 1 (uses: actions/checkout@v4)
│   └── Step 2 (run: npm run build)

Ключевые принципы:

  • Workflow состоит из одного или нескольких jobs
  • Jobs выполняются параллельно по умолчанию (если нет зависимостей)
  • Steps внутри job выполняются последовательно на одном runner
  • Каждый job запускается на свежем runner

#Структура workflow-файла

Базовая структура YAML-файла workflow:

name: CI/CD Pipeline on: push: branches: [main] jobs: job_id: runs-on: ubuntu-latest steps: - name: Step name uses: action@version - run: shell command

#Обязательные поля

ПолеОписание
nameЧеловекочитаемое название workflow (отображается в UI)
onТриггеры для запуска workflow
jobsСписок jobs для выполнения

#Пример полного workflow

name: Full CI Pipeline on: push: branches: [main, develop] pull_request: branches: [main] jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' - run: npm ci - run: npm run lint test: runs-on: ubuntu-latest needs: lint steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' - run: npm ci - run: npm test build: runs-on: ubuntu-latest needs: test steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' - run: npm ci - run: npm run build

#Jobs: настройка и выполнение

#Базовая конфигурация job

jobs: build: runs-on: ubuntu-latest name: Build Application timeout-minutes: 30 continue-on-error: false steps: - run: echo "Building..."

#Поля job

ПолеТипОписание
runs-onstringТип runner для выполнения job
namestringЧеловекочитаемое название (для UI)
needsarray/stringЗависимости от других jobs
ifstringУсловие выполнения job
timeout-minutesnumberМаксимальное время выполнения
continue-on-errorbooleanПродолжать ли workflow при ошибке
strategyobjectMatrix strategy для параллелизации
outputsobjectВыходные значения job
environmentstring/objectОкружение для деплоя
concurrencyobject/groupОграничение параллельных запусков

#Зависимости между jobs

Jobs выполняются параллельно по умолчанию. Для последовательного выполнения используйте needs:

jobs: lint: runs-on: ubuntu-latest steps: - run: npm run lint test: runs-on: ubuntu-latest needs: lint # Запустится после успешного lint steps: - run: npm test deploy: runs-on: ubuntu-latest needs: [lint, test] # Запустится после обоих jobs steps: - run: ./deploy.sh

Статусы job:

  • success — job завершился успешно
  • failure — job завершился с ошибкой
  • cancelled — job был отменён
  • skipped — job был пропущен

#Steps: типы и конфигурация

#Типы steps

1. Запуск команды (run):

steps: - name: Install dependencies run: npm ci - name: Run tests run: | echo "Running tests..." npm test echo "Tests complete"

2. Использование action (uses):

steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm'

3. Именованный step для outputs:

steps: - name: Get version id: get_version run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT

#Поля step

ПолеТипОписание
namestringЧеловекочитаемое название step
idstringУникальный ID для ссылок в expressions
usesstringAction для использования
runstringShell-команда для выполнения
withobjectВходные параметры для action
envobjectПеременные окружения для step
ifstringУсловие выполнения step
continue-on-errorbooleanПродолжать при ошибке
timeout-minutesnumberТаймаут step
working-directorystringРабочая директория

#Многострочные команды

steps: - name: Build and test run: | npm ci npm run build npm test working-directory: ./frontend

#Условия выполнения (if)

steps: - name: Deploy to production if: github.ref == 'refs/heads/main' && github.event_name == 'push' run: ./deploy.sh - name: Send notification on failure if: failure() run: ./notify-slack.sh - name: Always run cleanup if: always() run: ./cleanup.sh

Функции условий:

  • success() — true, если предыдущие steps успешны (по умолчанию)
  • failure() — true, если предыдущий step неудачен
  • always() — true всегда
  • cancelled() — true, если workflow отменён
  • skipped() — true, если workflow пропущен

#Передача данных между steps

#Через переменные окружения

jobs: build: runs-on: ubuntu-latest steps: - name: Set version id: set_version run: echo "VERSION=1.2.3" >> $GITHUB_ENV - name: Use version run: echo "Building version $VERSION"

Важно: Переменные, записанные в $GITHUB_ENV, доступны только в последующих steps того же job.

#Через outputs step

jobs: build: runs-on: ubuntu-latest steps: - name: Get version id: get_version run: | echo "version=$(cat package.json | jq -r .version)" >> $GITHUB_OUTPUT echo "build_number=${{ github.run_number }}" >> $GITHUB_OUTPUT - name: Use outputs run: | echo "Version: ${{ steps.get_version.outputs.version }}" echo "Build: ${{ steps.get_version.outputs.build_number }}"

#Через файлы

steps: - name: Generate report run: npm test -- --reporter=json > test-results.json - name: Process report run: node process-results.js test-results.json

#Передача данных между jobs

#Через outputs job

jobs: build: runs-on: ubuntu-latest outputs: version: ${{ steps.get_version.outputs.version }} artifact_name: ${{ steps.build.outputs.artifact_name }} steps: - name: Get version id: get_version run: echo "version=1.2.3" >> $GITHUB_OUTPUT - name: Build id: build run: echo "artifact_name=app-1.2.3" >> $GITHUB_OUTPUT deploy: runs-on: ubuntu-latest needs: build steps: - name: Deploy run: | echo "Deploying version ${{ needs.build.outputs.version }}" echo "Artifact: ${{ needs.build.outputs.artifact_name }}"

#Через артефакты

jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm run build - uses: actions/upload-artifact@v4 with: name: build-output path: dist/ retention-days: 5 deploy: runs-on: ubuntu-latest needs: build steps: - uses: actions/download-artifact@v4 with: name: build-output path: dist/ - run: ./deploy.sh

#Обработка ошибок

#continue-on-error

jobs: test: runs-on: ubuntu-latest steps: - run: npm test notify: runs-on: ubuntu-latest needs: test continue-on-error: true steps: - run: ./notify-slack.sh

#Условное выполнение по статусу

jobs: test: runs-on: ubuntu-latest steps: - run: npm test deploy: runs-on: ubuntu-latest needs: test if: success() # Только если test успешен steps: - run: ./deploy.sh cleanup: runs-on: ubuntu-latest needs: test if: always() # Всегда, независимо от статуса test steps: - run: ./cleanup.sh

#Таймауты и ограничения

#timeout-minutes

jobs: long-running: runs-on: ubuntu-latest timeout-minutes: 60 steps: - run: ./long-process.sh

#Concurrency groups

Ограничивает количество параллельных запусков workflow:

concurrency: group: deploy-${{ github.ref }} cancel-in-progress: true jobs: deploy: runs-on: ubuntu-latest steps: - run: ./deploy.sh

Поведение:

  • Если запущен новый workflow с той же группой, предыдущий будет отменён
  • Полезно для деплоя, чтобы избежать конфликтов

#Практический пример: полный CI/CD workflow

name: Full CI/CD Pipeline on: push: branches: [main, develop] pull_request: branches: [main] concurrency: group: ci-${{ github.ref }} cancel-in-progress: true jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - run: npm ci - run: npm run lint test: runs-on: ubuntu-latest needs: lint timeout-minutes: 30 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - run: npm ci - run: npm test -- --coverage - uses: actions/upload-artifact@v4 with: name: coverage-report path: coverage/ build: runs-on: ubuntu-latest needs: test outputs: version: ${{ steps.version.outputs.version }} steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Get version id: version run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT - run: npm ci - run: npm run build - uses: actions/upload-artifact@v4 with: name: build-output path: dist/ deploy-staging: runs-on: ubuntu-latest needs: build if: github.ref == 'refs/heads/develop' environment: staging steps: - uses: actions/download-artifact@v4 with: name: build-output path: dist/ - run: ./deploy.sh staging deploy-production: runs-on: ubuntu-latest needs: build if: github.ref == 'refs/heads/main' environment: production steps: - uses: actions/download-artifact@v4 with: name: build-output path: dist/ - run: ./deploy.sh production notify: runs-on: ubuntu-latest needs: [deploy-staging, deploy-production] if: always() continue-on-error: true steps: - run: ./notify-slack.sh

Далее: GitHub Actions: матрицы, зависимости, контексты