Цепочка робочих процесів у GitHub Actions: запуск одного робочого процесу після іншого

pic

GitHub Actions став незамінним інструментом для автоматизації CI/CD пайплайнів. Однією з найпоширеніших вимог у CI/CD робочих процесах є можливість запускати один робочий процес після іншого, забезпечуючи безперервну послідовність кроків у процесі розгортання. У цій статті ми розглянемо практичну реалізацію цього випадку використання та розберемо, як запустити другий робочий процес тільки після успішного завершення першого.

Сценарій

Уявіть, що у вас є два робочих процеси:

  1. Створення та завантаження образу в ECR — цей робочий процес створює Docker-образ і завантажує його в AWS Elastic Container Registry (ECR).
  2. Розгортання на сервері — цей робочий процес розгортає Docker-образ на вашому сервері.

Метою є забезпечити, щоб другий робочий процес (Розгортання на сервері) запускався лише після того, як перший робочий процес (Створення та завантаження образу в ECR) буде успішно завершено. Давайте розглянемо, як це налаштувати.

Робочий процес 1: Створення та завантаження образу в ECR

Цей робочий процес будує та завантажує Docker-образ в ECR, коли зміни надходять у гілку develop або при ручному запуску.

# File: .github/workflows/build.yml  
name: Build and Push Image to ECR  
on:  
 push:  
 branches:  
 - develop  
 workflow_dispatch:  

jobs:  
 build:  
 name: Build and Push  
 runs-on: ubuntu-latest  
 steps:  
 - name: Checkout Code  
 uses: actions/checkout@v4  

 - name: Log in to AWS ECR  
 id: login-ecr  
 uses: aws-actions/amazon-ecr-login@v1  

 - name: Build and Push Docker Image  
 run: |  
 docker build -t : .  
 docker tag : .dkr.ecr..amazonaws.com/:  
 docker push .dkr.ecr..amazonaws.com/:

Робочий процес 2: Розгортання на сервері

Цей робочий процес налаштовано таким чином, щоб він запускався після завершення першого робочого процесу. Однак ми хочемо, щоб він виконувався лише у випадку успішного завершення першого процесу.

# File: .github/workflows/deploy.yml  
name: Deploy to Server  
on:  
 workflow_dispatch:  
 workflow_run:  
 workflows: ["Build and Push Image to ECR"] #Це назва робочого процесу  
 types:  
 - completed  
jobs:  
 deploy:  
 name: Deploy to Server  
 runs-on: self-hosted  
 if: ${{ github.event.workflow_run.conclusion == 'success' }}  
 steps:  
 - name: Deploy Application  
 run: |  
 echo "Deploying application to server..."  
 # Додайте тут свій скрипт для розгортання

Основні моменти

  1. workflow_run:
  2. Подія workflow_run використовується у файлі deploy.yml, щоб вказати, що цей робочий процес має бути запущений після завершення робочого процесу "Build and Push Image to ECR".
  3. Умова if
  4. Умова if: ${{ github.event.workflow_run.conclusion == 'success' }} забезпечує, що робочий процес розгортання запускається лише в тому випадку, якщо попередній процес завершився зі статусом success.
  5. Підтримка ручного запуску
  6. Обидва робочі процеси містять workflow_dispatch, що дозволяє запускати їх вручну для додаткової гнучкості під час тестування чи обслуговування.

Загальні проблеми та рішення

  • Запуск після невдалих робочих процесів: За замовчуванням подія workflow_run запускається кожного разу, коли вказаний робочий процес завершується, незалежно від його статусу. Для того, щоб уникнути розгортання після невдалого створення, критично важливо використовувати умову if.
  • Налагодження тригерів робочих процесів: Використовуйте логи Actions, щоб переконатися, що робочі процеси правильно з'єднані та їх тригери працюють як очікується.

Висновок

З цією конфігурацією ви можете створити надійний CI/CD пайплайн, де робочі процеси з'єднані безперервно, а дії виконуються лише після успішного завершення попередніх етапів. Такий підхід забезпечує більшу надійність і запобігає непотрібним розгортанням у разі помилок на етапі створення.

GitHub Actions пропонує неймовірну гнучкість і потужність, а поєднуючи workflow_run з умовними виразами, ви можете будувати робочі процеси, що точно відповідають вашим потребам.
Спробуйте це і поділіться своїм досвідом у коментарях нижче!

Будь ласка, розгляньте можливість підтримати мене:

  1. Поставити 50 оплесків за цю статтю
  2. Залишити коментар з вашими думками
  3. Підкреслити вашу улюблену частину цієї серії

Перекладено з: Chaining Workflows in GitHub Actions: Triggering One Workflow After Another

Leave a Reply

Your email address will not be published. Required fields are marked *