是否有可能在AppSpec文件的节文件中使用CodeDeploy环境变量

时间:2017-08-06 19:30:30

标签: amazon-web-services deployment bitbucket web-deployment aws-code-deploy

我有网站,存储在AWS EC2服务器上。

我们有2台服务器,一台用于生产环境,另一台用于开发和登台环境。

位于不同文件夹中的开发和登台环境。例如,存储在/var/www/development中的开发环境,而存储在/var/www/staging中的存档。

我想使用AWS CodeDeploy直接从bitbucket上传文件。我把AppSpec文件,将源代码复制到/var/www/html文件夹并安装所有依赖项和配置。但我希望我的AppSpec文件将源代码复制到/var/www/development/var/www/staging,具体取决于所选的开发组。

有没有办法做到这一点,或者,在我的情况下有更好的方法?

3 个答案:

答案 0 :(得分:3)

更改AppSpec或自定义脚本行为的推荐方法是使用environment variables provided by the CodeDeploy agent。您可以访问部署组名称和应用程序名称。

if [ "$DEPLOYMENT_GROUP_NAME" == "Staging" ]; then
  # Copy to /var/www/staging
elif [ "$DEPLOYMENT_GROUP_NAME" == "Development" ]; then
  # Copy to /var/www/development
elif [ "$DEPLOYMENT_GROUP_NAME" == "Production" ]; then
  # Copy to /var/www/html
else
  # Fail the deployment
end

答案 1 :(得分:0)

appspec.yml有点不灵活,因此请使用以下代码将代码部署到同一实例的不同文件夹中。

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/my-temp-dir
permissions:
  - object: /var/www/my-temp-dir
    owner: ec2-user
    group: ec2-user
hooks:
  BeforeInstall:
    - location: ci/integrations-deploy-pre.sh
      runas: root
  AfterInstall:
    - location: ci/integrations-deploy-post.sh
      runas: root

然后在我的integrations-deploy-post.sh文件中,使用CodeDeploy环境变量将文件移到所需的位置;

#!/bin/bash
    
if [ "$DEPLOYMENT_GROUP_NAME" == "Staging" ]
then
    cp -R /var/www/my-temp-dir /var/www/my-staging-dir
    chown -R ec2-user:ec2-user /var/www/my-staging-dir

    # Insert other commands that need to run...
fi

if [ "$DEPLOYMENT_GROUP_NAME" == "UAT" ]
then
    cp -R /var/www/my-temp-dir /var/www/my-uat-dir
    chown -R ec2-user:ec2-user /var/www/my-uat-dir

    # Insert other commands that need to run...
fi

注意:在我的integrations-deploy-post.sh中,您还需要要在生产环境中运行的命令。为简单起见,将其删除。

答案 2 :(得分:-1)

我遇到了同样的问题,但是我使用源代码控制来解决此问题。 我的工作流使用的是Gitlab CI> AWS Code Pipeline(S3源代码和CodeDeploy)。

因此在我的开发分支中,我的AppSpec文件如下所示:-

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/my-project-dev
hooks:
  AfterInstall:
    - location: scripts/after_install.sh
      timeout: 400
      runas: root

在我的暂存分支中:-

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/my-project-staging
hooks:
  AfterInstall:
    - location: scripts/after_install.sh
      timeout: 400
      runas: root

我的Gitlab-CI只是对我的EC2实例使用一个shell执行程序,它基本上压缩了我的项目文件夹并上传到S3。

.gitlab-ci.yml

stages:
  - deploy
setup dependencies:
  stage: .pre
  script:
    - echo "Setup Dependencies"
    - pip install awscli
deploy to s3:
  stage: deploy
  script:
    - tar -cvzf /tmp/artifact_$CI_COMMIT_REF_NAME.tar ./*
    - echo "Copy artifact to S3"
    - aws s3 cp /tmp/artifact_$CI_COMMIT_REF_NAME.tar s3://project-artifacts/

clean up:
  stage: .post
  script:
    - echo "Removing generated artifact"
    - rm /tmp/artifact_$CI_COMMIT_REF_NAME.tar

请注意,$CI_COMMIT_REF_NAME用于区分正在生成的工件文件。在开发分支中,它将是artifact_development.tar,在暂存分支中是artifact_staging.tar

然后,我有2个管道来侦听部署到2个不同CodeDeploy应用程序的两个相应工件。

不确定这是否是最好的方法,当然欢迎任何更好的建议