使用CodeDeploy和Bitbucket管道在EC2上自动部署

时间:2019-05-17 07:21:51

标签: git bitbucket aws-code-deploy bitbucket-pipelines

我有一个用 Django(Python框架)编写的项目,并且存储库在 Bitbucket

我必须通过以下操作设置一个位桶管道:

  1. 在Staging服务器中部署,并提交到 staging 分支
  2. 仅当发行版是master分支的草稿时,才部署到生产服务器。

我不确定可以像Github一样在Bitbucket中将发布发布到何处。

我有以下 bitbucket-pipelines.yml 文件

image: python:3.7

pipelines:
  branches:
    staging:
      - step:
          deployment: staging
          script: 
            - apt-get update
            - apt-get install -y zip # required for packaging up the application
            - pip install boto3==1.3.0 # required for codedeploy_deploy.py
            - zip -r /tmp/artifact.zip * # package up the application for deployment
            - python codedeploy_deploy.py # run the deployment script

现在,在Django应用程序中,我正在使用.env提供凭据和设置。对于不同的环境(例如开发,登台和生产),我每个人都有不同的环境文件

development.env
staging.env
production.env

我需要根据部署类型将相应文件重命名/复制到.env

如何在Bitbucket管道中进行设置以执行此步骤?

appspec.yml 的内容是:

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/project/
permissions:
  - object: /var/www/html
    pattern: "**"
    owner: ubuntu
    group: ubuntu
hooks:
  BeforeInstall:
    - location: scripts/clean_instance.sh
      timeout: 6000
      runas: root
  AfterInstall:
    - location: scripts/install_os_dependencies.sh
      timeout: 6000
      runas: root
    - location: scripts/install_python_dependencies.sh
      timeout: 6000
      runas: ubuntu
    - location: scripts/setup_environment.sh
      timeout: 6000
      runas: ubuntu
    - location: scripts/migrate.sh
      timeout: 6000
      runas: ubuntu
    - location: scripts/ngnix.sh
      timeout: 6000
      runas: ubuntu
  ApplicationStart:
    - location: scripts/start_application.sh
      timeout: 6000
      runas: ubuntu
  ApplicationStop:
    - location: scripts/stop_application.sh
      timeout: 6000
      runas: ubuntu

我可以根据部署类型拥有多个appspec.yml文件吗?

2 个答案:

答案 0 :(得分:0)

在应用程序版本名称下具有多个目录可能是一个很好的解决方案。

1.0.0->
      appspec.yml
      files/
      scripts/

答案 1 :(得分:0)

如果您可以为整个团队指定命名约定,那么基于约定的方法可以解决这个问题。

首先,使部署分支与环境具有相同的名称。如示例代码中所述,当分支名称为“ staging”时,应用程序将选择staging.env进行部署。 在bitbucket管道中,您可以使用$ BITBUCKET_BRANCH默认变量来引用分支名称。

https://confluence.atlassian.com/bitbucket/variables-in-pipelines-794502608.html

  

Bitbucket管道提供了一组默认变量以及定义自己的变量的能力。您可以将变量标记为安全,以进一步保护密码,令牌和其他值。您也可以在手动运行管道时更新变量。

第二,用环境设置脚本中的变量替换对env文件的引用。例如:$ filename.env

将分支名称传递给您的python脚本codedeploy_deploy.py,并用此替换设置脚本中的变量。

该解决方案仅在您可以保持约定的情况下才有效。