AWS Linux CodeDeploy 权限问题(w. Bitbucket,Tomcat,Shell 脚本)
AWS Linux CodeDeploy Permission Issues (w. Bitbucket, Tomcat, Shell Script)
我正在尝试使用 CodeDeploy 将文件部署到我安装了 Tomcat 的 AWS Beanstalk 服务器。除了 appspec.yml 调用我的 .sh 脚本并执行 mvn install 命令时发生的异常外,一切都配置良好。我已经尝试了我想象的所有权限组合(以及我找到的每个 Whosebug 答案),但没有任何效果。
Cannot create resource output directory: /opt/codedeploy-agent/deployment-root/f953d455-9712-454b-84b0-2533cf87f79a/d-3UFCDLD0D/deployment-archive/target/classes
我还希望 appspec.yml 的文件部分在 .sh 脚本执行之前执行。它应该是这样工作的:
- appspec.yml 将所有文件移动到 webapps 文件夹
- build.sh 被处决
- mvn 运行并创建 .war 文件
- build.sh 做一些清理工作
appspec.yml(我试过其他多个)
version: 0.0
os: linux
files:
- source: /
destination: /var/lib/tomcat8/webapps
permissions:
- object: /opt/codedeploy-agent/deployment-root
pattern: "**"
owner: ec2-user
group: root
mode: 755
type:
- directory
- object: /var/lib/tomcat8/webapps
pattern: "**"
owner: ec2-user
group: root
mode: 755
type:
- directory
hooks:
BeforeInstall:
- location: scripts/build.sh
runas: ec2-user
build.sh
export LANG=en_US.UTF-8
SCRIPTPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo "Script path: $SCRIPTPATH"
PROJECT_SOURCE_DIR=$SCRIPTPATH/../
cd $PROJECT_SOURCE_DIR
mvn clean install
cd $PROJECT_SOURCE_DIR/target
ls -a
for file in *.war; do
mv $file /usr/share/tomcat8/webapps/ROOT.war
done;
rm -rf $PROJECT_SOURCE_DIR/target
rm -rf $SCRIPTPATH
从异常中可以明显看出,maven 试图在没有权限的情况下创建文件夹 target。所以问题是为什么它首先要尝试在这个文件夹中执行它,然后是如何获得适当的访问权限。
解决问题的方法是在运行 "mvn clean install"之前添加命令切换到正确的目录,而不是PROJECT_SOURCE_DIR。
Install 是 AWS CodeDeploy 代理将修订文件从临时位置复制到最终目标文件夹的生命周期事件。此事件是为 AWS CodeDeploy 代理保留的,不能用于 运行 脚本。相关文档在这里:http://docs.aws.amazon.com/codedeploy/latest/userguide/app-spec-ref.html
您遇到错误的目录实际上位于部署存档目录下,如下所示:https://github.com/aws/aws-codedeploy-agent/blob/master/lib/instance_agent/plugins/codedeploy/hook_executor.rb#L174
你得到错误的原因是因为 build.sh 脚本在当前目录 运行ning 需要 root 权限并且 scripts/build.sh 只有ex2-用户权限,导致权限问题
我正在尝试使用 CodeDeploy 将文件部署到我安装了 Tomcat 的 AWS Beanstalk 服务器。除了 appspec.yml 调用我的 .sh 脚本并执行 mvn install 命令时发生的异常外,一切都配置良好。我已经尝试了我想象的所有权限组合(以及我找到的每个 Whosebug 答案),但没有任何效果。
Cannot create resource output directory: /opt/codedeploy-agent/deployment-root/f953d455-9712-454b-84b0-2533cf87f79a/d-3UFCDLD0D/deployment-archive/target/classes
我还希望 appspec.yml 的文件部分在 .sh 脚本执行之前执行。它应该是这样工作的:
- appspec.yml 将所有文件移动到 webapps 文件夹
- build.sh 被处决
- mvn 运行并创建 .war 文件
- build.sh 做一些清理工作
appspec.yml(我试过其他多个)
version: 0.0
os: linux
files:
- source: /
destination: /var/lib/tomcat8/webapps
permissions:
- object: /opt/codedeploy-agent/deployment-root
pattern: "**"
owner: ec2-user
group: root
mode: 755
type:
- directory
- object: /var/lib/tomcat8/webapps
pattern: "**"
owner: ec2-user
group: root
mode: 755
type:
- directory
hooks:
BeforeInstall:
- location: scripts/build.sh
runas: ec2-user
build.sh
export LANG=en_US.UTF-8
SCRIPTPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo "Script path: $SCRIPTPATH"
PROJECT_SOURCE_DIR=$SCRIPTPATH/../
cd $PROJECT_SOURCE_DIR
mvn clean install
cd $PROJECT_SOURCE_DIR/target
ls -a
for file in *.war; do
mv $file /usr/share/tomcat8/webapps/ROOT.war
done;
rm -rf $PROJECT_SOURCE_DIR/target
rm -rf $SCRIPTPATH
从异常中可以明显看出,maven 试图在没有权限的情况下创建文件夹 target。所以问题是为什么它首先要尝试在这个文件夹中执行它,然后是如何获得适当的访问权限。
解决问题的方法是在运行 "mvn clean install"之前添加命令切换到正确的目录,而不是PROJECT_SOURCE_DIR。
Install 是 AWS CodeDeploy 代理将修订文件从临时位置复制到最终目标文件夹的生命周期事件。此事件是为 AWS CodeDeploy 代理保留的,不能用于 运行 脚本。相关文档在这里:http://docs.aws.amazon.com/codedeploy/latest/userguide/app-spec-ref.html
您遇到错误的目录实际上位于部署存档目录下,如下所示:https://github.com/aws/aws-codedeploy-agent/blob/master/lib/instance_agent/plugins/codedeploy/hook_executor.rb#L174
你得到错误的原因是因为 build.sh 脚本在当前目录 运行ning 需要 root 权限并且 scripts/build.sh 只有ex2-用户权限,导致权限问题