Я пытаюсь интегрировать Bitbucket в AWS Code Pipeline? Каков наилучший подход?

Я хочу интегрировать свой код из Bitbucket в AWS Code Pipeline. Я не могу найти подходящие примеры на том же. Мой исходный код находится в .Net. Может кто-нибудь, пожалуйста, направьте меня. Благодарю.

Ответ 1

Вы можете интегрировать Bitbucket с AWS CodePipeline, используя веб-подключения, которые вызывают AWS API Gateway, который вызывает функцию Lambda (которая вызывает CodePipeline). Существует блог AWS, который поможет вам в этом: интеграция Git с AWS CodePipeline

Ответ 2

BitBucket имеет сервис под названием PipeLines который может развертывать код в сервисах AWS. Используйте конвейеры для упаковки и отправки обновлений из вашей основной ветки в CodePipeline S3, которая подключена к CodePipeline

Замечания:

  • Вы должны включить PipeLines в своем хранилище

  • PipeLines ожидает файл с именем bitbucket-pipelines.yml который должен быть размещен внутри вашего проекта

  • Убедитесь, что вы установили свои учетные записи AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY в пользовательском интерфейсе BitBucket Pipelines. Это поставляется с возможностью шифрования, так что все в безопасности

Вот пример bitbucket-pipelines.yml который копирует содержимое каталога с именем DynamoDb в корзину S3

pipelines:
  branches:
    master:
      - step:
          script:
            - apt-get update # required to install zip
            - apt-get install -y zip # required if you want to zip repository objects
            - zip -r DynamoDb.zip .
            - apt-get install -y python-pip
            - pip install boto3==1.3.0 # required for s3_upload.py
            # the first argument is the name of the existing S3 bucket to upload the artefact to
            # the second argument is the artefact to be uploaded
            # the third argument is the the bucket key
            - python s3_upload.py LandingBucketName DynamoDb.zip DynamoDb.zip # run the deployment script

Вот рабочий пример скрипта загрузки Python, который должен быть развернут вместе с bitbucket-pipelines.yml в вашем проекте. Выше я назвал свой скрипт Python s3_upload.py:

from __future__ import print_function
import os
import sys
import argparse
import boto3
from botocore.exceptions import ClientError

def upload_to_s3(bucket, artefact, bucket_key):
    """
    Uploads an artefact to Amazon S3
    """
    try:
        client = boto3.client('s3')
    except ClientError as err:
        print("Failed to create boto3 client.\n" + str(err))
        return False
    try:
        client.put_object(
            Body=open(artefact, 'rb'),
            Bucket=bucket,
            Key=bucket_key
        )
    except ClientError as err:
        print("Failed to upload artefact to S3.\n" + str(err))
        return False
    except IOError as err:
        print("Failed to access artefact in this directory.\n" + str(err))
        return False
    return True


def main():

    parser = argparse.ArgumentParser()
    parser.add_argument("bucket", help="Name of the existing S3 bucket")
    parser.add_argument("artefact", help="Name of the artefact to be uploaded to S3")
    parser.add_argument("bucket_key", help="Name of the S3 Bucket key")
    args = parser.parse_args()

    if not upload_to_s3(args.bucket, args.artefact, args.bucket_key):
        sys.exit(1)

if __name__ == "__main__":
    main()

Вот пример CodePipeline только с одним этапом Source (вы можете добавить больше):

Pipeline:
  Type: "AWS::CodePipeline::Pipeline"
  Properties:
    ArtifactStore:
      # Where codepipeline copies and unpacks the uploaded artifact
      # Must be versioned
      Location: !Ref "StagingBucket"
      Type: "S3"
    DisableInboundStageTransitions: []
    RoleArn:
      !GetAtt "CodePipelineRole.Arn"
    Stages:
      - Name: "Source"
        Actions:
          - Name: "SourceTemplate"
            ActionTypeId:
              Category: "Source"
              Owner: "AWS"
              Provider: "S3"
              Version: "1"
            Configuration:
              # Where PipeLines uploads the artifact
              # Must be versioned
              S3Bucket: !Ref "LandingBucket"
              S3ObjectKey: "DynamoDb.zip" # Zip file that is uploaded
            OutputArtifacts:
              - Name: "DynamoDbArtifactSource"
            RunOrder: "1"

LandingBucket:
  Type: "AWS::S3::Bucket"
  Properties:
    AccessControl: "Private"
    VersioningConfiguration:
      Status: "Enabled"
StagingBucket:
  Type: "AWS::S3::Bucket"
  Properties:
    AccessControl: "Private"
    VersioningConfiguration:
      Status: "Enabled"

Ссылку на этот код Python вместе с другими примерами можно найти здесь: https://bitbucket.org/account/user/awslabs/projects/BP

Ответ 3

Следите за тем, чтобы кто-нибудь нашел это сейчас:

AWS CodeBuild теперь поддерживает Atlassian Bitbucket Cloud в качестве типа источника, что делает его четвертым среди существующих поддерживаемых источников: AWS CodeCommit, Amazon S3 и GitHub.

Это означает, что вам больше не нужно реализовывать лямбда-функцию, как предложено в ссылке @Kirkaiya, для интеграции с Bitbucket - это все еще допустимое решение в зависимости от вашего варианта использования или если вы интегрируетесь с не облачной версией Bitbucket.

Опубликовано в блоге AWS 10 августа 2017 г. - https://aws.amazon.com/about-aws/whats-new/2017/08/aws-codebuild-now-supports-atlassian-bitbucket-cloud-as-a-source-type/

И для пояснения для комментаторов, эта ссылка говорит об интеграции с CodeBuild, а не с CodePipeline: вам все равно нужно найти способ запуска конвейера, но при его запуске CodeBuild будет извлекать код из BitBucket, а не копировать код в S3 или AWS CodeCommit перед запуском конвейера.

Ответ 4

AWS CodeBuild теперь поддерживает создание запросов на вытягивание Bitbucket, и мы можем использовать это для лучшего решения без использования webhooks/API Gateway/Lambda

Вы можете использовать CodeBuild, чтобы заархивировать ваш код на s3 и использовать его как источник в вашей CodePipeline

https://lgallardo.com/2018/09/07/codepipeline-bitbucket

Ответ 5

альтернатива ответу @binary и уточнение к ответу @OllyTheNinja:

вкратце: позвольте CodeBuild прослушивать Bitbucket Webhook и записывать в объект S3. в конвейере слушайте событие обновления последнего.

В коде AWS

  1. определить проект CodeBuild, с

    • Источник: Bitbucket, который использует свой WebHook для прослушивания событий git-push.
    • Buildspec: построить проект в соответствии с buildspec.yml
    • Артефакт хранит выходные данные сборки непосредственно в контейнере S3.
  2. определить конвейер:

    • Источник: прослушивание обновлений ранее определенного объекта S3
    • удалить шаг сборки
    • добавить другие шаги, настроить шаг развертывания

Ответ 6

Если вы ищете способ автоматизации процесса развертывания сборки с использованием AWS CodePipeline с исходным кодом в виде битовой корзины без использования лямбда-выражений, выполните следующие действия.

  1. Создайте CodeBuild, который поддерживает BitBucket на данный момент. https://docs.aws.amazon.com/codebuild/latest/userguide/sample-bitbucket-pull-request.html Также создайте веб-хук, который перестраивает каждый раз, когда код помещается в репозиторий. Вы не можете использовать веб-хук, если используете публичный репозиторий Bitbucket.
  2. Code Build автоматически сработает при коммите, создаст zip файл и сохранит его в корзине s3.
  3. Создайте конвейер кода с исходным кодом S3 и разверните его с помощью codeDeploy. Поскольку S3 является действительным источником.

Примечание -1. Чтобы создать веб-крючок, вам нужно иметь доступ администратора BitBucket, поэтому процесс от фиксации до развертывания полностью автоматизирован. 2. На данный момент (апрель'19) CodeBuild не поддерживает webhook при объединении запросов Pull. Если вы хотите, вы можете создать триггер, который будет запускать сборку кода, скажем, каждый день.

Вы также можете создавать триггеры для периодической сборки кода https://docs.aws.amazon.com/codebuild/latest/userguide/trigger-create.html

Обновление - (июнь'19) - Сборки запроса на извлечение для PR_Merge теперь поддерживаются в CodeBuild. Ссылка: https://docs.aws.amazon.com/codebuild/latest/userguide/sample-bitbucket-pull-request.html#sample-bitbucket-pull-request-filter-webhook-events.

Ответ 7

Для меня лучший способ интеграции Bitbucket с любой службой AWS - это использовать конвейеры для зеркального отражения любого коммита в (зеркальном) репозитории CodeSommit AWS. Оттуда у вас есть первичная интеграция в любой сервис на AWS. Вы можете найти отличные инструкции: здесь: