Был ли у вас опыт работы с Post-Hook в CI/CD?

«Был ли у вас опыт работы с Post-Hook в CI/CD?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, я активно использовал post-hook'и (или этапы after_script/post) в пайплайнах CI/CD для выполнения действий после завершения основной задачи, таких как уведомления, очистка и сбор метрик.

Практические примеры из моего опыта:

  1. Уведомление о статусе сборки/деплоя в Slack/Teams:

    # .gitlab-ci.yml (GitLab CI)
    deploy_to_staging:
      script:
        - ansible-playbook deploy-staging.yml
      after_script:
        - |
          if [ "$CI_JOB_STATUS" == "success" ]; then
            curl -X POST -H 'Content-type: application/json' --data "{"text":"✅ Деплой на staging успешно завершен для $CI_COMMIT_REF_NAME"}" $SLACK_WEBHOOK_URL
          else
            curl -X POST -H 'Content-type: application/json' --data "{"text":"❌ Деплой на staging провален для $CI_COMMIT_REF_NAME. Лог: $CI_JOB_URL"}" $SLACK_WEBHOOK_URL
          fi
  2. Очистка временных ресурсов в облаке после прогона интеграционных тестов:

    # GitHub Actions
    - name: Cleanup AWS resources (Post-Hook)
      if: always() # Выполнять всегда, даже если предыдущие шаги упали
      run: |
        aws ec2 terminate-instances --instance-ids ${{ env.TEST_INSTANCE_ID }}
        aws s3 rb s3://temp-test-bucket-${{ github.run_id }} --force
  3. Сбор и отправка метрик (например, длительность выполнения) в Prometheus PushGateway:

    # Скрипт, выполняемый после основной задачи
    DURATION=$((SECONDS - START_TIME))
    echo "ci_job_duration_seconds{job="$CI_JOB_NAME", status="$CI_JOB_STATUS"} $DURATION" | curl --data-binary @- http://pushgateway.example.org:9091/metrics/job/ci_pipeline

Ключевой принцип: post-hook должен быть идемпотентным (безопасным для повторного запуска) и не должен блокировать основной процесс. Его задача — выполнить финализирующие действия, которые важны, но не критичны для успеха самого деплоя или сборки.