我正在尝试将 Bitbucket 集成到 AWS 代码管道中?最好的方法是什么?



我想将我的代码从Bitbucket集成到AWS代码管道中。我找不到合适的例子。我的源代码在.Net中。有人能指引我吗。谢谢

您可以通过使用webhook将Bitbucket与AWS CodePipeline集成,该webhook调用AWS API网关,该网关调用Lambda函数(该函数调用CodePipeline)。有一个AWS博客可以带你了解这一点:将Git与AWS CodePipeline 集成

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 bucket

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

现在找到这个的人的后续行动:

AWS CodeBuild现在支持Atlassian Bitbucket Cloud作为源类型,使其与现有支持的源(AWS CodeCommit、Amazon S3和GitHub)并列第四。

这意味着你不再需要实现@Kirkaiya链接中建议的lambda函数来与Bitbucket集成——它仍然是一个有效的解决方案,这取决于你的用例或你是否正在与非云版本的Bitbucket进行集成。

发布于AWS博客2017年8月10日-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。

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

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

注-1。为了创建webhook,您需要具有bitbucket管理员访问权限因此,从提交到部署的过程是完全自动化的。2.截至目前(2019年4月),CodeBuild不支持Pull请求合并的webhook。如果你想的话,你可以创建一个触发器,比如每天都会触发代码构建。

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

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

一个替代@binary的答案,并澄清@OllyTheNinja的答案:

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

在AWS代码套件中

  1. 使用定义CodeBuild项目

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

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

AWS CodeBuild现在支持构建Bitbucket Pull请求,我们可以利用它来获得更好的解决方案,而无需使用webhook/neneneba API网关/Lambda

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

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

对我来说,将Bitbucket与任何AWS服务集成的最佳方式是使用Pipelines将任何提交镜像到(镜像)AWS CodeCommit repo中。从那里,您就可以基本集成到AWS上的任何服务中。你可以找到一个优秀的操作方法:这里:

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

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

最新更新