Ответ
Да, активно использовал GitHub Actions для построения CI/CD-пайплайнов. Это основной инструмент для проектов, размещенных на GitHub.
Мой опыт включает:
- Создание комплексных workflow для сборки, тестирования, сканирования кода и безопасности, сборки Docker-образов и деплоя в различные среды (Kubernetes, AWS, VPS).
- Использование матричных сборок для тестирования на нескольких версиях языка/ОС одновременно.
- Организацию повторного использования кода через Composite Actions и Reusable Workflows, что значительно упростило поддержку десятков репозиториев.
- Интеграцию с внешними системами через webhooks и GitHub API.
Пример продвинутого workflow для приложения на Go с деплоем в AWS ECS:
name: Go Build, Test, and Deploy
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
go-version: [ '1.19', '1.20' ]
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: ${{ matrix.go-version }}
- run: go mod download
- run: go test -v ./...
build-and-push:
runs-on: ubuntu-latest
needs: test
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: ${{ secrets.ECR_REGISTRY }}/my-app:${{ github.sha }}
- name: Deploy to ECS
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: task-definition.json
service: my-app-service
cluster: production-cluster
Преимущества, которые я ценю: глубокая интеграция с экосистемой GitHub, обширный Marketplace, простота старта. Сложности, с которыми сталкивался: управление секретами для сложных сценариев, ограничения на время выполнения для больших монолитов, необходимость тщательной оптимизации кэширования.
Ответ 18+ 🔞
А, GitHub Actions? Да, конечно, работал, и ещё как. Это ж, можно сказать, мой основной инструмент, когда проект сидит на GitHub. Без него никуда, ёпта.
Что я там понаделал, так это:
- Писал эти самые workflow, чтобы они всё делали: от сборки и тестирования до сканирования кода на уязвимости, сборки докер-образов и выкатывания всего этого добра куда надо — будь то Kubernetes, AWS или какой-нибудь VPS. Овердохуища работы, но зато автоматизировано.
- Использовал матричные сборки — это когда один и тот же тест гоняешь на куче разных версий языка или операционок одновременно. Удобно, конечно, но иногда ждёшь, пока всё прогуляется, и терпения ноль ебать.
- Организовывал повторное использование кода через Composite Actions и Reusable Workflows. Это, блядь, спасение, когда у тебя десятки репозиториев и в каждом одно и то же. Не надо сто раз копипастить, один раз настроил — и работает везде. Красота.
- Интеграции всякие пилил через webhooks и GitHub API. Чтобы если что-то где-то упало, тебе сразу в телегу или слак прилетало сообщение, что всё, приехали.
Вот, смотри, пример одного такого продвинутого workflow для приложения на Go, который потом в AWS ECS заливает:
name: Go Build, Test, and Deploy
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
go-version: [ '1.19', '1.20' ]
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: ${{ matrix.go-version }}
- run: go mod download
- run: go test -v ./...
build-and-push:
runs-on: ubuntu-latest
needs: test
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: ${{ secrets.ECR_REGISTRY }}/my-app:${{ github.sha }}
- name: Deploy to ECS
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: task-definition.json
service: my-app-service
cluster: production-cluster
Что мне в нём нравится, так это то, как он глубоко в экосистему GitHub вшит, этот ваш Marketplace с кучей готовых действий — просто праздник какой-то. И начать работать с ним — раз плюнуть. А вот сложности... Ну, например, управлять секретами в хитрых сценариях — это тот ещё квест. Или когда у тебя монолит здоровенный, а время выполнения workflow ограничено — приходится выкручиваться, оптимизировать кэширование до последнего, чтобы не вылететь по таймауту. Но в целом, инструмент, блядь, мощный.