AWS appspec.yml文件解析
appspec.yml是YAML格式、用于定于CodeDeploy服务在整个阶段所做的操作和文件拷贝路径和权限等。首先,这个文档名称必须是appspec.yml
,而且文档中的空格个数也有严格的要求,文章最后面会讲到。
appspec.yml文档结构:
version: 0.0 os: operating-system-name files: source-destination-files-mappings permissions: permissions-specifications hooks: deployment-lifecycle-event-mappings
version这里,类似于aws api的版本号,目前只能写0.0
os这里可接受的选项是linux和windows,全小写
files段,定于文件映射关系,例如下面这段
files: - source: Config/config.txt destination: /webapps/Config - source: source destination: /webapps/myApp
source文件路径是是相对于本版包的相对路径,如果是/
,表示本版包里的全部文件和目录
destination这里是被部署服务器的完整路径(绝对路径)
permission段:用于定义和描述被拷贝到目标服务器上的文件拷贝后的权限
例如下面这个例子
permissions: - object: /home/webapp/tomcat/webapps/cms-front pattern: "**" except: /home/webapp/tomcat/webapps/cms-front/version.ini owner: webapp group: webapp mode: 644 acls: - u:read-only:r - u:wangfei:rw context: user: unconfined_u type: httpd_sys_content_t range: s0 type: - file
object是必选项,也就是你的版本包部署路径
pattern是可选项,用于匹配想要赋权的文件,"**"
和不填,表示匹配所有文件(可选项)
except就是排除在pattern中被匹配的文件(可选项)
owner和group好理解,改变文件属主(可选项)
mode这里可接受类似644和755这样的权限,或者4755这样的带粘滞位的赋权(可选项)
acls中设置Access Control List,这里我们可以给read-only用户只读权限(可选项)
context是给SELinux用的,不熟悉(可选项)
type可选项是file和directory,用于表述被赋权对象类型,只是文件,还是只是目录,不填表示版本包里的所有文件和目录
hooks区段就是定义各个阶段执行的操作
先介绍下CodeDeploy整个部署过程
1. Start,不可自定义操作
2. ApplicationStop,可定义停服过程
3. DownloadBundle,下载版本包,不可自定义该阶段操作,linux系统下,版本包会被下载到/opt/codedeploy-agent/deployment-root/deployment-group-id/deployment-id/deployment-archive
,windows系统会被下载到C:\ProgramData\Amazon\CodeDeploy\deployment-group-id\deployment-id\deployment-archive
4. BeforeInstall,定义版本包文件复制到目标目录之前的操纵,这里可定义备份操作
5. Install,该过程不可被hook,只能通过appspec.yml中的路径和权限等来定义,例如file区段,定义文件拷贝路径
6. AfterInstall,文件复制完之后的操作,可以吧permisson中的定义在此处用脚本来实现
7. ApplicationStart,可被hook来进行起服前的自定义行为
8. ValidateService,部署被验证完成之后可被hook,可用于定义完成之后清理现场。
9. End,结束,不可被hook
hooks: deployment-lifecycle-event-name - location: script-location timeout: timeout-in-seconds runas: user-name
hook里面的deployment-lifecycle-event-name
,可选项为:
ApplicationStop,BeforeInstall,AfterInstall,ApplicationStart,ValidateService
。
location写该阶段需要执行的脚本文成和路径,相对版本包的相对路径,例如scripts/full_backup.sh
,location可以写多个,每行一个。
timeout时间为超时的秒数,超过指定时间脚本还没完成就算部署失败,默认是1800秒。注意hook阶段的总超时时间是1小时,也就是说在该阶段所有脚本的执行时间必须在1小时内完成,否则会被认为是失败了。
runas,可选项,定义脚本执行的身份
关于文件中的空格必须是指定的个数,例如下面例子中,[4]表示4个空格,不能多也不能少
version:[1]version-number os:[1]operating-system-name files: [2]-[1]source:[1]source-files-location [4]destination:[1]destination-files-location permissions: [2]-[1]object:[1]object-specification [4]pattern:[1]pattern-specification [4]except:[1]exception-specification [4]owner:[1]owner-account-name [4]group:[1]group-name [4]mode:[1]mode-specification [4]acls: [6]-[1]acls-specification [4]context: [6]user:[1]user-specification [6]type:[1]type-specification [6]range:[1]range-specification [4]type: [6]-[1]object-type hooks: [2]deployment-lifecycle-event-name: [4]-[1]location:[1]script-location [6]timeout:[1]timeout-in-seconds [6]runas:[1]user-name
解析出来就是这样
version: 0.0 os: linux files: - source: / destination: /var/www/html/WordPress hooks: BeforeInstall: - location: scripts/install_dependencies.sh timeout: 300 runas: root AfterInstall: - location: scripts/change_permissions.sh timeout: 300 runas: root ApplicationStart: - location: scripts/start_server.sh timeout: 300 runas: root ApplicationStop: - location: scripts/stop_server.sh timeout: 300 runas: root