Есть ли возможность использовать переменные среды CodeDeploy в файлах разделов файла AppSpec

У меня есть сайт, который хранится на серверах AWS EC2.

У нас есть 2 сервера, один для производственной среды, а другой для среды разработки и промежуточной среды.

Среды разработки и подготовки, расположенные в разных папках. Например, среда разработки хранится в /var/www/development, а промежуточная - в /var/www/staging.

Я хотел бы использовать AWS CodeDeploy для загрузки файлов прямо из битбакета. Я помещаю файл AppSpec, который копирует исходный код в папку /var/www/html и устанавливаю все зависимости и конфигурации. Но я хочу, чтобы мой файл AppSpec копировал исходный код в /var/www/development или /var/www/staging в зависимости от выбранной группы разработчиков.

Есть ли способ сделать это или, может быть, есть какой-то лучший подход в моей ситуации?


person Liauchuk Ivan    schedule 06.08.2017    source источник
comment
Добавьте тег для обоих экземпляров, например: производственный сервер будет иметь тег _1 _: _ 2_, а промежуточный сервер будет иметь _3 _: _ 4_. В ваших хуках appspec сначала получите этот тег, а затем решите, куда скопировать ваш архив.   -  person Ravi    schedule 11.08.2017
comment
@ levchuk-ivan у тебя когда-нибудь это работало? Я сейчас в похожей ситуации. Спасибо   -  person flopperJ    schedule 05.04.2018
comment
@flopperJ, да, но решение мне не нравится. По умолчанию копия релиза приложения находится в одной папке, а после развертывания скрипта исходный код перемещается в папку в соответствии с именем группы развертывания.   -  person Liauchuk Ivan    schedule 09.04.2018


Ответы (3)


Рекомендуемый способ изменить поведение AppSpec или пользовательских сценариев - использовать переменные среды, предоставляемые агентом CodeDeploy. У вас есть доступ к имени группы развертывания и имени приложения.

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
person EmptyArsenal    schedule 22.08.2017
comment
Значит, я не могу использовать разделы files файла appspec. Я должен сам скопировать все файлы? - person Liauchuk Ivan; 19.11.2017
comment
Привет @EmptyArsenal, Идея работает, но синтаксис неправильный, не должно быть конца - person Harsh Patel; 19.09.2019

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 вам также понадобятся команды, которые вы хотите запустить в производственной среде. Удалено для простоты.

person ajtrichards    schedule 22.08.2020

У меня была та же проблема, но я использовал систему контроля версий в качестве решения. В моем рабочем процессе используется Gitlab CI> AWS Code Pipeline (S3 Source и 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, и он в основном сжимает мою папку проекта и загружает в 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.

Не уверен, что это лучший способ, конечно, приветствую любые предложения, которые лучше

person daisura99    schedule 03.11.2019