我正在尝试将 Bitbucket 集成到 AWS Code Pipeline 中?最好的方法是啥?

Posted

技术标签:

【中文标题】我正在尝试将 Bitbucket 集成到 AWS Code Pipeline 中?最好的方法是啥?【英文标题】:I'm trying to integrate Bitbucket into AWS Code Pipeline? What is the best approach?我正在尝试将 Bitbucket 集成到 AWS Code Pipeline 中?最好的方法是什么? 【发布时间】:2017-05-31 21:27:58 【问题描述】:

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

【问题讨论】:

目前我看到的唯一可用的源选项是 github、codecommit 和 s3。可以使用 Bitbucket 管道将代码推送到 S3 或上游到 CodeCommit,然后使用该源。 是的,我也遇到过。但在这个阶段,我无法将我的代码源更改为 CodeCommit。 这里的每个人都假设您在谈论 Cloud Bitbucket。您能否更新问题以澄清它不是您所说的自托管版本? @einarc 我刚刚检查了 bitbucket 服务器有不同的标签 @NigelFds 我看不到:github.com/aws-quickstart/quickstart-git2s3/tree/master 【参考方案1】:

2019 年 12 月 AWS launched a support for Atlassian Bitbucket Cloud 处于测试模式。

所以现在您可以将 AWS CodePipeline 与 Bitbucket Cloud 本地集成

【讨论】:

【参考方案2】:

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

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-source-type/

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

【讨论】:

欢迎提供指向解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及它存在的原因,然后引用最相关的您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted. 但问题是关于 CodePipeline,而不是 CodeBuild 只要我了解 AWS CodePipeline 将使用预配置的 AWS CodeBuild 作为源。 我已经尝试了建议的解决方案。确实,您可以将 AWS CodeBuild 配置为使用 BitBucket 作为源。但它不允许将此配置的 AWS CodeBuild 步骤用作 CodePipeline 的一部分。消息是:AWS CodePipeline 不支持 Bitbucket AWS CodePipeline 无法构建存储在 Bitbucket 中的源代码。如果您希望 AWS CodePipeline 使用此构建项目,请选择其他源提供商。 您不知道 OP 或正在阅读本文的人是使用 Cloud Bitbucket 还是他们自己的 Bitbucket 服务器。虽然支持第一种情况,但不支持第二种情况。【参考方案3】:

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

    创建目前支持 BitBucket 的 CodeBuild。 https://docs.aws.amazon.com/codebuild/latest/userguide/sample-bitbucket-pull-request.html 还要创建一个 web-hook,每次将代码推送到存储库时都会重新构建。 如果您使用公共 Bitbucket 存储库,则无法使用网络挂钩。 代码构建将在提交时自动触发,并将创建一个 zip 文件并将其存储在 s3 存储桶中。 使用 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.

【讨论】:

【参考方案4】:

@binary 答案的替代方案,以及对@OllyTheNinja 答案的澄清:

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

在 AWS 代码套件中

    定义一个 CodeBuild 项目,使用

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

    定义管道:

    来源:监听先前定义的 S3 对象的更新 删除构建步骤 添加其他步骤,配置部署步骤

【讨论】:

【参考方案5】:

AWS CodeBuild Now Supports Building Bitbucket Pull Requests,我们可以利用它来获得更好的解决方案,而无需使用 webhooks/API Gateway/Lambda

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

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

【讨论】:

您现在可以让 BitBucket PR 触发 CodeBuild,但目前,我认为您只能从 UI 而非 CloudFormation 执行此操作。【参考方案6】:

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

注意:

您必须在您的存储库中启用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()

这是一个示例 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

【讨论】:

感谢您的贡献。为什么不使用 aws cli 并使用 pip install awscli 安装它,它会为您提供 aws s3 sync 以及与 AWS 很好集成的其他工具? 注意 - Bitbucket Pipelines 仅支持 Bitbucket Cloud,不支持 Bitbucket Server(自托管)。 BitBucket 集成现在被 CodePipeline 完全支持:aws.amazon.com/about-aws/whats-new/2019/12/…【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

我已按照本指南通过 S3 将 Bitbucket 集成设置到 CodePipeline。效果很好。我唯一的问题是我无法设置单独的分支来穿过管道; “开发”到测试环境,“主”到生产环境。 好的,由于我使用的是 .Net C# 并且有很多配置,因此我在代码管道方面遇到了一些问题。 该教程的代码已更新为处理 Bitbucket webhook 事件,但仅适用于云版本。 OP 没有说明他是在私人仓库中还是在使用 Bitbucket Cloud。 我们在 Bitbucket 服务器上试过这个。你失去了 git 的很多优点。如果您在服务器上,不妨使用 Bamboo 生成并提交到 ECR,然后使用 ECR 作为源。当然,前提是您使用的是微服务,而这正是我们所关注的。

以上是关于我正在尝试将 Bitbucket 集成到 AWS Code Pipeline 中?最好的方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

尝试将元数据添加到对象时,AWS S3 管道中的“无效 JSON”

直接从 Bitbucket 部署到 AWS Elastic Beanstalk

AWS CodePipeline:同时运行多个管道

如何将 Python Lambda 函数集成到 AWS Amplify 的管道中

Bot 与 bitbucket 集成的问题

使用 Amplify 将现有 AWS Cognito 用户池集成到 iOS 项目中