【问题标题】:Is there any possibility to use CodeDeploy environment variables in section files of AppSpec file是否有可能在 AppSpec 文件的部分文件中使用 CodeDeploy 环境变量
【发布时间】:2018-01-14 02:31:35
【问题描述】:

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

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

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

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

有什么办法可以做到吗,或者在我的情况下有更好的方法吗?

【问题讨论】:

  • 为两个实例添加标签,例如:生产服务器将有标签 env:prod 和临时服务器将有 env:stage。在您的 appspec 挂钩中,首先获取此标记,然后决定将存档复制到何处。
  • @levchuk-ivan 你有没有得到这个工作?我目前处于类似的情况。谢谢
  • @flopperJ,是的,但我不喜欢这个解决方案。默认情况下应用程序发布复制到一个文件夹,部署脚本后根据部署组名称将源代码移动到文件夹

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


【解决方案1】:

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】:

    我遇到了同样的问题,但我使用源代码管理作为解决方案。 我的工作流程是使用 Gitlab CI > AWS Code Pipeline (S3 Source and 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 应用程序的两个工件。

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

    【讨论】:

      【解决方案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
      fi
      

      【讨论】:

      • 所以我不能使用 appspec 文件的files 部分,我应该自己复制所有文件?
      • 嗨@EmptyArsenal,想法正在运行,但语法错误,应该没有结束
      猜你喜欢
      • 2018-02-26
      • 2016-12-22
      • 2022-01-06
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多