Работал ли с GitHub Actions

Ответ

Да, активно использовал 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 ограничено — приходится выкручиваться, оптимизировать кэширование до последнего, чтобы не вылететь по таймауту. Но в целом, инструмент, блядь, мощный.