Вопрос или проблема
У меня есть CI/CD конвейер в GitHub Actions, который разворачивает код, когда изменения загружаются в ветку production
. Однако я хочу автоматизироватьCertain задачи по обслуживанию (например, очистку Docker, временных файлов и создание резервных копий базы данных) по пятницам, когда развертывания не должны происходить. Поэтому мне нужно пропустить задачу развертывания в конвейере по пятницам.
Вот моя текущая конфигурация рабочего процесса GitHub Actions для шага развертывания:
deploy:
runs-on: ubuntu-latest
needs: [pytest] # Разворачивать только если тесты прошли
if: github.ref_name == 'production' && github.event_name == 'push'
steps:
- name: Проверка кода
uses: actions/checkout@v4
- name: Добавить SSH ключ
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Добавить известные хосты
run: ssh-keyscan -H ${{ secrets.VM_IP }} >> ~/.ssh/known_hosts
- name: Развертывание на продакшн сервере
run: |
ssh -o StrictHostKeyChecking=no ${{ secrets.VM_USER }}@${{ secrets.VM_IP }} << 'EOF'
cd /home/${{ secrets.VM_USER }}/client-portal
git pull origin production
git checkout production
docker compose -f docker-compose.production.yml build
docker compose -f docker-compose.production.yml down --remove-orphans
docker compose -f docker-compose.production.yml up -d
EOF
Вопрос:
Как мне добавить условие в рабочий процесс, чтобы пропустить этот шаг развертывания по пятницам или каждую полночь? Я ищу способ предотвратить выполнение задач развертывания по пятницам, позволяя другим дням работать как обычно. Есть ли способ проверить текущий день недели и применить условие на основе этого в GitHub Actions?
Спасибо заранее!
Ответ или решение
Для того чтобы пропустить выполнение задания развертывания в GitHub Actions по пятницам, вы можете использовать условие if
, которое проверяет текущий день недели. GitHub Actions предоставляет переменную среды RUNNER_ENV
, которая содержит информацию о текущем контексте выполнения, включая день недели.
Вы можете получить день недели в виде числа (0 для воскресенья, 1 для понедельника и так далее до 6 для субботы) и использовать это значение в условии вашего задания. Вот пример того, как вы можете изменить вашу конфигурацию GitHub Actions для пропуска задания развертывания по пятницам:
name: CI/CD Pipeline
on:
push:
branches:
- production
jobs:
pytest:
runs-on: ubuntu-latest
steps:
# Шаги для запуска тестов
- name: Checkout Code
uses: actions/checkout@v4
- name: Run Tests
run: |
# Запуск тестов здесь
echo "Running tests..."
deploy:
runs-on: ubuntu-latest
needs: pytest
if: github.ref_name == 'production' && github.event_name == 'push' && format('{0:dddd}', github.event_head_commit.timestamp) != 'Friday'
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Add SSH Key
uses: webfactory/ssh-agent@v0.5.3
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Add known hosts
run: ssh-keyscan -H ${{ secrets.VM_IP }} >> ~/.ssh/known_hosts
- name: Deploy to Production Server
run: |
ssh -o StrictHostKeyChecking=no ${{ secrets.VM_USER }}@${{ secrets.VM_IP }} << 'EOF'
cd /home/${{ secrets.VM_USER }}/client-portal
git pull origin production
git checkout production
docker compose -f docker-compose.production.yml build
docker compose -f docker-compose.production.yml down --remove-orphans
docker compose -f docker-compose.production.yml up -d
EOF
Разъяснения по коду:
-
Условие
if
: В условии для заданияdeploy
мы добавили проверку на день недели. Функцияformat('{0:dddd}', github.event_head_commit.timestamp)
преобразует дату коммита в день недели. Если день недели равен ‘Friday’, шаги задания развертывания не будут выполнены. -
Параметры:
github.ref_name
проверяет, что ветка —production
, аgithub.event_name
—push
, что соответствует вашему исходному условию. -
Другие части: Остальные шаги остаются без изменений и выполняют свою обычную работу по развертыванию.
С помощью этого подхода, вы сможете эффективно контролировать выполнение вашего задания развертывания в зависимости от дня недели, и исключать его выполнение по пятницам.