Обменивайтесь данными с локальным сервером 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).
Здесь мы используем веб-перехватчики, чтобы избежать частого опроса для проверки изменений в репозитории.
Давайте посмотрим на архитектурную схему приведенного выше потока.
- Пользователь помещает код в репозиторий Bitbucket.
- На основе этого действия пользователя сервер Bitbucket генерирует новое событие веб-перехватчика и отправляет его в Elastic Load Balancing или API Gateway в зависимости от того, какой тип конечной точки вы выбрали во время создания стека AWS CloudFormation.
- API Gateway или Elastic Load Balancing перенаправляет запрос в функцию Lambda, которая проверяет подпись сообщения, используя секрет, настроенный в веб-перехватчике. Если подпись действительна, функция Lambda переходит к следующему шагу.
- Функция Lambda вызывает API-интерфейс сервера Bitbucket и запрашивает создание ZIP-пакета с содержимым ветки, измененным пользователем на шаге 1.
- Функция Lambda отправляет ZIP-пакет в корзину Amazon S3.
- 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 использует для доступа к репозиторию.
- Войдите на сервер Bitbucket.
- Выберите свой аватар пользователя, затем выберите Управление учетной записью.
- На экране Учетная запись выберите Личные токены доступа.
- Выберите Создать токен.
- Заполните форму с именем токена. В разделе Разрешения оставьте Читать для проектов и репозиториев как есть.
- Для завершения выберите Создать.
Запустить стек CloudFormation
Следуя приведенным ниже инструкциям, вы загрузите функцию Lambda и ZIP-файлы уровня Lambda в корзину Amazon S3 и запустите стек AWS CloudFormation для создания ресурсов в своей учетной записи AWS.
- Клонируйте репозиторий 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-событиях в репозиторий:
- Войдите на сервер Bitbucket и перейдите на страницу репозитория.
- Выберите Настройки репозитория.
- Выберите Веб-перехватчик.
- Выберите Создать веб-перехватчик.
- Заполните форму с именем веб-перехватчика, например CodePipeline.
- Заполните поле URL адресом API Gateway или Load Balancer. Чтобы получить этот URL, выберите вкладку Выходы в стеке AWS CloudFormation.
- Заполните поле Secret тем же значением, что и в стеке AWS CloudFormation.
- В разделе События убедитесь, что выбран вариант Push.
- Для завершения выберите Создать.
- Повторите эти шаги для каждого репозитория, в котором вы хотите включить интеграцию.
Настройка вашего конвейера
Наконец, измените свой конвейер на CodePipeline, чтобы использовать корзину Amazon S3, созданную стеком AWS CloudFormation, в качестве источника вашего конвейера.
Функция Lambda загружает файлы в корзину Amazon S3, используя следующую структуру путей:
Имя проекта / Имя репозитория / Имя ветки.zip
Теперь каждый раз, когда кто-то помещает код в репозиторий Bitbucket, ваш конвейер запускается автоматически.
Убираться
Если вы хотите удалить интеграцию и очистить ресурсы, созданные в AWS, вам необходимо удалить стек CloudFormation. Выполните команду ниже, чтобы удалить стек и связанные ресурсы.
aws cloudformation delete-stack --stack-name CodePipeline-Bitbucket-Integration
Больше контента на plainenglish.io