Обменивайтесь данными с локальным сервером Bitbucket с помощью AWS.

При работе с AWS CodePipeline AWS предоставляет нам различные варианты подключения к различным источникам репозитория кода, как показано ниже.

Вы можете видеть, что есть выделенный вариант как Bitbucket. Если ваша организация использует Bitbucket Cloud в качестве репозитория кода (это означает, что ваш код размещен в собственной инфраструктуре Bitbucket), вы можете просто выбрать Bitbucket в качестве опции и подключиться к Bitbucket, используя его URL-адрес, выбрать репозиторий, выбрать имя ветки и вы сделано!

Теперь AWS будет напрямую подключаться к вашему облаку Bitbucket и получать обновления всякий раз, когда происходят какие-либо изменения на уровне репозитория или ветки, что приводит к запуску событий CodePipeline для этих изменений.

Просто, не правда ли? Но что, если у вашей организации есть локальный Bitbucket (это означает, что сервер Bitbucket размещен в собственной инфраструктуре организации)?

Для взаимодействия с локальным Bitbucket AWS предоставила совершенно другое решение для достижения этой цели. Давайте рассмотрим это шаг за шагом.

Интеграция Bitbucket Server использует веб-перехватчики, настроенные в репозитории Bitbucket. Предоставляемая функция AWS Lambda может получить исходный код из репозитория Bitbucket Server всякий раз, когда пользователь отправляет новый код push или pull request слияние, а затем сохраняет его в специально разработанной корзине Amazon Simple Storage Service (Amazon S3).

Здесь мы используем веб-перехватчики, чтобы избежать частого опроса для проверки изменений в репозитории.

Давайте посмотрим на архитектурную схему приведенного выше потока.

  1. Пользователь помещает код в репозиторий Bitbucket.
  2. На основе этого действия пользователя сервер Bitbucket генерирует новое событие веб-перехватчика и отправляет его в Elastic Load Balancing или API Gateway в зависимости от того, какой тип конечной точки вы выбрали во время создания стека AWS CloudFormation.
  3. API Gateway или Elastic Load Balancing перенаправляет запрос в функцию Lambda, которая проверяет подпись сообщения, используя секрет, настроенный в веб-перехватчике. Если подпись действительна, функция Lambda переходит к следующему шагу.
  4. Функция Lambda вызывает API-интерфейс сервера Bitbucket и запрашивает создание ZIP-пакета с содержимым ветки, измененным пользователем на шаге 1.
  5. Функция Lambda отправляет ZIP-пакет в корзину Amazon S3.
  6. CodePipeline запускается при обнаружении нового или обновленного файла в пути корзины Amazon S3.

Требования

Перед тем как приступить к настройке решения, убедитесь, что у вас есть:

  • Доступна корзина Amazon S3 для хранения файлов настройки функции лямбда.
  • NPM или Yarn для установки зависимостей пакета
  • AWS CLI

Кроме того, убедитесь, что у вас достаточно разрешений для перечисленных ниже модулей в вашей учетной записи AWS (если нет, обратитесь к администратору AWS, чтобы получить это).

  • Ковш S3 (полный доступ)
  • CloudFront (полный доступ)
  • CloudFormation (полный доступ)
  • Лямбда-функции (полный доступ)
  • API-шлюз (создание, удаление)
  • Ключ KMS (полный доступ)
  • Политика (Создать, Удалить)
  • Роль (создание, удаление)
  • CodePipeline (полный доступ)
  • CodeStar (полный доступ)
  • CodeDeploy (полный доступ)
  • CodeBuild (полный доступ)
  • CloudTrail (полный доступ)
  • CloudWatch (полный доступ)

Настраивать

Создание личного токена на сервере Bitbucket

Создайте личный токен на сервере Bitbucket, который функция Lambda использует для доступа к репозиторию.

  1. Войдите на сервер Bitbucket.
  2. Выберите свой аватар пользователя, затем выберите Управление учетной записью.
  3. На экране Учетная запись выберите Личные токены доступа.
  4. Выберите Создать токен.
  5. Заполните форму с именем токена. В разделе Разрешения оставьте Читать для проектов и репозиториев как есть.
  6. Для завершения выберите Создать.

Запустить стек CloudFormation

Следуя приведенным ниже инструкциям, вы загрузите функцию Lambda и ZIP-файлы уровня Lambda в корзину Amazon S3 и запустите стек AWS CloudFormation для создания ресурсов в своей учетной записи AWS.

  1. Клонируйте репозиторий Git, содержащий исходный код решения

git clone https://github.com/aws-samples/aws-codepipeline-bitbucket-integration.git

2. Установите пакеты NodeJS с помощью npm.

cd code

npm install

cd ..

3. Подготовьте пакеты к развертыванию.

Создайте одну корзину для хранения кода CloudFormation и укажите имя этой корзины в приведенной ниже команде.

aws cloudformation package --template-file ./infra/infra.yaml --s3-bucket <your_bucket_name> --output-template-file package.yaml

4. Отредактируйте файл параметров AWS CloudFormation.

Откройте файл, расположенный по адресу infra / parameters.json, в вашем любимом текстовом редакторе и замените параметры следующим образом:

BitbucketSecret - секрет веб-перехватчика Bitbucket, используемый для подписи событий веб-перехватчика. Вы должны определить секрет и использовать одно и то же значение здесь и в веб-перехватчике сервера Bitbucket.
BitbucketServerUrl - URL-адрес вашего сервера Bitbucket, например, как http://112.108.32.34/bitbucket (получите правильный URL-адрес от администратора Bitbucket, поскольку необязательно, чтобы URL-адрес, отображаемый в браузере, совпадал с URL-адресом для доступа к API-интерфейсам Bitbucket)
BitbucketToken - сервер Bitbucket личный токен, используемый функцией Lambda для доступа к API Bitbucket.
EndpointType - выберите тип конечной точки для интеграции с функцией Lambda. Это может быть балансировщик нагрузки приложения или шлюз API.
LambdaSubnets - подсети, в которых работает функция Lambda.
LBCIDR - CIDR разрешен обмен данными с Балансировщик нагрузки. Он должен разрешить IP-адрес сервера Bitbucket. Оставьте это поле пустым, если вы используете тип конечной точки API Gateway.
LBSubnets - подсети, в которых работает Application Load Balancer. Оставьте это поле пустым, если вы используете тип конечной точки API Gateway.
LBSSLCertificateArn - сертификат SSL для связи с балансировщиком нагрузки приложения. Оставьте поле пустым, если вы используете тип конечной точки API Gateway.
S3BucketCodePipelineName - имя корзины Amazon S3, которую этот стек создает для хранения содержимого репозитория Bitbucket.
VPCID - идентификатор VPC, на котором выполняется Application Load Balancer и функция Lambda.
WebProxyHost - имя хоста вашего прокси-сервера, используемого функцией Lambda для доступа к серверу Bitbucket, например myproxy .mydomain.com . Если вам не нужен веб-прокси, оставьте это поле пустым.
WebProxyPort - порт вашего прокси-сервера, используемый функцией Lambda для доступа к серверу Bitbucket, например 8080. Если вы не используете не нужен веб-прокси, оставьте поле пустым.

5. Создайте стек CloudFormation.

aws cloudformation create-stack --stack-name CodePipeline-Bitbucket-Integration --template-body file://package.yaml --parameters file://infra/parameters.json --capabilities CAPABILITY_NAMED_IAM

Создание веб-перехватчика на сервере Bitbucket

Затем создайте веб-перехватчик на сервере Bitbucket, чтобы уведомлять функцию Lambda о push-событиях в репозиторий:

  1. Войдите на сервер Bitbucket и перейдите на страницу репозитория.
  2. Выберите Настройки репозитория.
  3. Выберите Веб-перехватчик.
  4. Выберите Создать веб-перехватчик.
  5. Заполните форму с именем веб-перехватчика, например CodePipeline.
  6. Заполните поле URL адресом API Gateway или Load Balancer. Чтобы получить этот URL, выберите вкладку Выходы в стеке AWS CloudFormation.
  7. Заполните поле Secret тем же значением, что и в стеке AWS CloudFormation.
  8. В разделе События убедитесь, что выбран вариант Push.
  9. Для завершения выберите Создать.
  10. Повторите эти шаги для каждого репозитория, в котором вы хотите включить интеграцию.

Настройка вашего конвейера

Наконец, измените свой конвейер на CodePipeline, чтобы использовать корзину Amazon S3, созданную стеком AWS CloudFormation, в качестве источника вашего конвейера.

Функция Lambda загружает файлы в корзину Amazon S3, используя следующую структуру путей:

Имя проекта / Имя репозитория / Имя ветки.zip

Теперь каждый раз, когда кто-то помещает код в репозиторий Bitbucket, ваш конвейер запускается автоматически.

Убираться

Если вы хотите удалить интеграцию и очистить ресурсы, созданные в AWS, вам необходимо удалить стек CloudFormation. Выполните команду ниже, чтобы удалить стек и связанные ресурсы.

aws cloudformation delete-stack --stack-name CodePipeline-Bitbucket-Integration

Больше контента на plainenglish.io