我有网站,存储在AWS EC2服务器上。
我们有2台服务器,一台用于生产环境,另一台用于开发和登台环境。
位于不同文件夹中的开发和登台环境。例如,存储在/var/www/development
中的开发环境,而存储在/var/www/staging
中的存档。
我想使用AWS CodeDeploy直接从bitbucket上传文件。我把AppSpec文件,将源代码复制到/var/www/html
文件夹并安装所有依赖项和配置。但我希望我的AppSpec文件将源代码复制到/var/www/development
或/var/www/staging
,具体取决于所选的开发组。
有没有办法做到这一点,或者,在我的情况下有更好的方法?
答案 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应用程序的两个相应工件。
不确定这是否是最好的方法,当然欢迎任何更好的建议