feat: Добавлены 3 стадии в CI/CD пайплайны (lint, test, deploy)

- GitHub Actions: добавлены стадии lint, test, deploy с зависимостями
- Azure DevOps: добавлены стадии lint, test, deploy с зависимостями
- Jenkins: добавлены стадии lint, test, deploy с зависимостями
- GitLab CI: создан новый .gitlab-ci.yml с 3 стадиями

Особенности:
- Деплой происходит только после успешного прохождения lint и test
- Деплой выполняется только для main ветки
- Добавлены уведомления о результатах
- Используются make команды для консистентности
- Параллельное тестирование с разными preset'ами
This commit is contained in:
Сергей Антропов
2025-10-25 19:33:37 +03:00
parent bfed0d1ea8
commit 787ab06e25
4 changed files with 514 additions and 66 deletions

View File

@@ -2,7 +2,7 @@
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
name: Ansible Testing
name: AnsibleLab CI/CD Pipeline
on:
push:
@@ -11,44 +11,9 @@ on:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl start docker
sudo usermod -aG docker $USER
- name: Install Python dependencies
run: |
pip install --upgrade pip
pip install molecule[docker] ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Run Molecule tests
run: |
cd molecule/universal
molecule test -s universal
- name: Upload test results
uses: actions/upload-artifact@v3
if: always()
with:
name: molecule-reports
path: molecule/universal/.molecule/
# Стадия 1: Lint проверка
lint:
name: 🔍 Lint Check
runs-on: ubuntu-latest
steps:
@@ -62,9 +27,146 @@ jobs:
- name: Install dependencies
run: |
pip install ansible-lint
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Run Ansible Lint
run: |
ansible-lint molecule/universal/
echo "🔍 Проверка синтаксиса ролей..."
make role lint
- name: Upload lint results
uses: actions/upload-artifact@v3
if: always()
with:
name: lint-results
path: |
.ansible-lint
lint-report.txt
# Стадия 2: Тестирование
test:
name: 🧪 Role Testing
runs-on: ubuntu-latest
needs: lint
strategy:
matrix:
preset: [minimal, default, performance]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y docker.io make
sudo systemctl start docker
sudo usermod -aG docker $USER
- name: Install Python dependencies
run: |
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Setup Docker builder
run: |
make docker setup-builder
- name: Build Docker images
run: |
make docker build
- name: Run Molecule tests
run: |
echo "🧪 Тестирование с preset: ${{ matrix.preset }}"
make role test ${{ matrix.preset }}
- name: Upload test results
uses: actions/upload-artifact@v3
if: always()
with:
name: test-results-${{ matrix.preset }}
path: |
molecule/default/.molecule/
test-report-${{ matrix.preset }}.txt
# Стадия 3: Деплой (только для main ветки)
deploy:
name: 🚀 Deploy Check
runs-on: ubuntu-latest
needs: [lint, test]
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install --upgrade pip
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Create inventory file
run: |
mkdir -p inventory
cat > inventory/hosts.ini << EOF
[test_servers]
localhost ansible_connection=local
[all:vars]
ansible_python_interpreter=python3
EOF
- name: Run deployment check
run: |
echo "🚀 Проверка развертывания (dry-run)..."
make role deploy
- name: Upload deployment results
uses: actions/upload-artifact@v3
if: always()
with:
name: deployment-results
path: |
deployment.log
deployment-report.txt
# Уведомления
notify:
name: 📢 Notifications
runs-on: ubuntu-latest
needs: [lint, test, deploy]
if: always()
steps:
- name: Notify on success
if: needs.lint.result == 'success' && needs.test.result == 'success'
run: |
echo "✅ Все проверки пройдены успешно!"
echo "🔍 Lint: ${{ needs.lint.result }}"
echo "🧪 Test: ${{ needs.test.result }}"
echo "🚀 Deploy: ${{ needs.deploy.result }}"
- name: Notify on failure
if: needs.lint.result == 'failure' || needs.test.result == 'failure'
run: |
echo "❌ Проверки не пройдены!"
echo "🔍 Lint: ${{ needs.lint.result }}"
echo "🧪 Test: ${{ needs.test.result }}"
echo "🚀 Deploy: ${{ needs.deploy.result }}"
exit 1