appspec.yml文件解析

来源:互联网 发布:js计算总金额 编辑:程序博客网 时间:2024/06/11 14:11

appspec.yml是YAML格式、用于定于CodeDeploy服务在整个阶段所做的操作和文件拷贝路径和权限等。首先,这个文档名称必须是appspec.yml,而且文档中的空格个数也有严格的要求,文章最后面会讲到。
appspec.yml文档结构:

version: 0.0os: operating-system-namefiles:  source-destination-files-mappingspermissions:  permissions-specificationshooks:  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-numberos:[1]operating-system-namefiles:[2]-[1]source:[1]source-files-location[4]destination:[1]destination-files-locationpermissions:[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-typehooks:[2]deployment-lifecycle-event-name:[4]-[1]location:[1]script-location[6]timeout:[1]timeout-in-seconds[6]runas:[1]user-name

解析出来就是这样

version: 0.0os: linuxfiles:  - source: /    destination: /var/www/html/WordPresshooks:  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
0 0