23

我想将我的代码从 Bitbucket 集成到 AWS Code Pipeline。我无法找到相同的适当示例。我的源代码在.Net 中。有人可以指导我。谢谢。

4

8 回答 8

15

您可以使用调用 AWS API Gateway 的 Webhook 将 Bitbucket 与 AWS CodePipeline 集成,该网关调用 Lambda 函数(调用 CodePipeline)。有一个 AWS 博客可以引导您完成此操作:Integrating Git with AWS CodePipeline

于 2017-03-21T14:51:52.573 回答
11

BitBucket 有一个名为的服务PipeLines,可以将代码部署到 AWS 服务。使用管道将更新从您的主分支打包并推送到连接到 S3 存储桶CodePipeline

笔记:

  • PipeLines您必须在存储库中启用

  • PipeLines 需要一个名为的文件,该文件bitbucket-pipelines.yml必须放在您的项目中

  • 确保在 BitBucket Pipelines UI 中设置您的账户 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。这带有一个加密选项,因此一切都是安全的

这是一个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()

这是一个只有一个Source阶段的示例 CodePipeline(您可能想要添加更多):

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

于 2018-05-15T08:22:46.193 回答
10

跟进现在发现此问题的任何人:

AWS CodeBuild 现在支持将 Atlassian Bitbucket Cloud 作为源类型,使其成为现有支持的源中的第四个:AWS CodeCommit、Amazon S3 和 GitHub。

这意味着您不再需要按照@Kirkaiya 的链接中的建议实现 lambda 函数来与 Bitbucket 集成 - 根据您的用例或如果您正在与 Bitbucket 的非云版本集成,它仍然是一个有效的解决方案。

2017 年 8 月 10 日发布在 AWS 博客上 - https://aws.amazon.com/about-aws/whats-new/2017/08/aws-codebuild-now-supports-atlassian-bitbucket-cloud-as-a-源类型/

为了澄清评论者,此链接讨论了与CodeBuild集成而不是CodePipeline:您仍然需要找到一种方法来触发管道,但是当它被触发时,CodeBuild 将从 BitBucket 中提取代码,而不必将代码复制到 S3或 AWS CodeCommit 在触发管道之前。

于 2017-12-13T00:55:34.903 回答
7

如果您正在寻找一种方法来使用 AWS CodePipeline 将源代码作为 bitbucket 而不使用 lambda 来自动化构建部署过程,请执行以下步骤。

  1. 创建目前支持 BitBucket 的 CodeBuild。https://docs.aws.amazon.com/codebuild/latest/userguide/sample-bitbucket-pull-request.html 还创建一个网络挂钩,每次将代码推送到存储库时都会重新构建。如果您使用公共 Bitbucket 存储库,则不能使用 web-hook。
  2. 代码构建将在提交时自动触发,并将创建一个 zip 文件并将其存储在 s3 存储桶中。
  3. 创建源代码为 S3 的代码管道,并使用 codeDeploy 部署它。因为 S3 是一个有效的来源。

注意-1。为了创建一个 webhook ,你需要有 bitbucket 管理员权限所以从提交到部署的过程是完全自动化的。2. 截至目前(2019 年 4 月)CodeBuild 不支持拉取请求合并上的 webhook。如果您愿意,您可以创建触发器,该触发器将触发代码构建,例如每天。

您还可以创建触发器以定期构建代码https://docs.aws.amazon.com/codebuild/latest/userguide/trigger-create.html

更新 -(2019 年 6 月) - CodeBuild 现在支持 PR_Merge 的拉取请求构建。参考:https ://docs.aws.amazon.com/codebuild/latest/userguide/sample-bitbucket-pull-request.html#sample-bitbucket-pull-request-filter-webhook-events 。

于 2019-04-25T16:18:11.373 回答
5

@binary 的答案的替代方案,并澄清了@OllyTheNinja 的答案:

简而言之:让 CodeBuild 监听 Bitbucket 的 Webhook 并写入 S3 对象。在管道中监听后者的更新事件。

在 AWS 代码套件中

  1. 定义一个 CodeBuild 项目,使用

    • 来源:Bitbucket 使用其 WebHook 来监听 git-push 事件。
    • Buildspec:根据 buildspec.yml 构建项目
    • 构建的工件将输出直接存储到 S3 容器。
  2. 定义管道:

    • 来源:监听之前定义的 S3 对象的更新
    • 删除构建步骤
    • 添加其他步骤,配置部署步骤
于 2019-01-23T22:17:55.450 回答
4

AWS CodeBuild 现在支持构建 Bitbucket Pull Requests,我们可以利用它来获得更好的解决方案,而无需使用 webhooks/API Gateway/Lambda

您可以使用 CodeBuild 将代码压缩到 s3 并将其用作 CodePipeline 中的源

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

于 2018-10-11T19:39:24.103 回答
2

对我来说,将 Bitbucket 与任何 AWS 服务集成的最佳方式是使用管道将任何提交镜像到(镜像)AWS CodeCommit 存储库中。从那里,您可以很好地集成到 AWS 上的任何服务中。您可以在此处找到出色的操作方法:

于 2018-05-20T15:08:21.370 回答
0

2019 年 12 月, AWS在 beta 模式下推出了对 Atlassian Bitbucket Cloud 的支持。

因此,现在您可以将 AWS CodePipeline 与 Bitbucket Cloud 本地集成

于 2019-12-23T18:29:34.703 回答