PHP程序自动化部署
应用服务器准备
应用服务器提前部署好PHP环境,并定义好用户权限及应用程序目录,不同环境的应用部署应该标准化,应用程序目录、配置文件目录、日志目录等都需保持一致且单独存放,标准化后程序发布代码可以复用,PHP程序不涉及编译打包仅需要将代码下载下来打包,上传服务器解压即可。
应用服务器地址:10.198.40.104
应用程序用户:xshop
应用程序目录:/home/xshop/yzg
配置文件目录(我这里配置文件目录页未标准化,这里是将配置文件单独列出。由于不同环境配置文件不同,程序打包时会将配置文件目录忽略掉):
/home/xshop/yzg/application/admin/config.php
/home/xshop/yzg/application/admin/database.php
/home/xshop/yzg/application/api/config.php
/home/xshop/yzg/application/api/database.php
Ansible配置
登陆ansible服务器配置基础信息,包括应用服务器IP、账号密码及发布脚本等。
创建Inverntory
点击inventory创建test,用于存放test环境内的应用服务器。
创建group
在test inventory创建yzg group,这里的组对应的就是应用系统。
创建host
host对应的应用服务器,有多台输入多个IP地址。
主机与组关联
点击Add host进行主机添加,可以选择已经存在的主机也可以这里直接添加主机,由于我们前期定义了主机,这里选择已经存在的主机进行添加。
创建服务器凭据
点击Crendentials,点击创建凭据。
其中Name字段是后续jenkins发布时候需要使用。
创建Projects
Project是存放发布脚本的地方,支持本地和gitlab多种方式,这里我们使用本地project。
由于是本地存放,需要将在ansible 服务器上创建local目录存放。
按照以下内容输入相关信息即可。
创建Template
Template是存放具体的发布脚本,发布脚本提前写好放置在/var/lib/awx/projects/local下,按照每个应用一个目录存放。
Local目录下创建对应应用程序目录,用于存放发布脚本使用,这里我们创建yzg应用,并将yzg发布脚本上传至该目录,具体如下:
Yzg.yml文件说明:
文件内容如下:
--- - hosts: yzg serial: 50% remote_user: root become: yes become_user: xshop vars: app_user: xshop app_name: yzg app_home: /home/xshop backup_home: /home/xshop/backup app_dir: /home/xshop tasks: - name: create backup directory file: path={{backup_home}} state=directory - name: backup app shell: chdir={{app_dir}} tar -zcvf {{backup_home}}/{{app_name}}_`date '+%Y%m%d%H%M'`.tar.gz {{app_name}} - name: rm exprie backupfile shell: find {{backup_home}} -name "*.tar.gz" -type f -mtime +90 -exec rm -f {} \; > /dev/null 2>&1 - name: copy file copy: src=/release/{{app_name}}/{{app_name}}.zip dest={{app_dir}}/{{app_name}}.zip owner={{app_user}} mode=755 - name: unzip file unarchive: src={{app_dir}}/{{app_name}}.zip dest={{app_dir}} copy=no mode=0755 - name: rm zip file file: path={{app_dir}}/{{app_name}}.zip state=absent
按照红色框进行选择和标注,其中蓝色框勾选代表通过传参的方式。
至此ansible的配置完成。
Jenkins配置
Ansible配置完成后,就可以在jenkins上面进行发布程序的配置了,我们通过pipline进行发布,通过改代码的方式完成。
应用目录创建
登陆到jenkins服务器,进入/release目录,创建yzg应用程序目录。
配置节点名称
为节点设置一个标签名称。
创建Job
点击新建job
输入任务名称,任务名称可以按照环境_应用的方式,选择流水线类别。
创建完job,出现如图页面:
切换到流水线标签,将pipline脚本复制进来,具体pipline如下:
pipeline { agent {node { label 'jenkins-slave1'}} parameters { string(name: 'BRANCH_NAME', defaultValue: "develop", description: '选择分支名称') string(name: 'PROJECT', defaultValue: "yzg", description: '项目打包名称') string(name: 'GIT_URL', defaultValue: "http://gitlab.i.demo.com/wangdong/driver.git", description: '项目打包名称') string(name: 'PACKAGE_DIR', defaultValue: "/release", description: '项目打包名称') string(name: 'SOURCE_FILE', defaultValue: "application", description: '项目打包名称') } stages { stage('获取代码') { steps { echo "========================开始拉取代码========================" git branch: 'develop', credentialsId: 'de61f050-ec46-441a-a756-2496257e6cbd', url: 'http://gitlab.i.demo.com/wangdong/driver.git' //git credentialsId: '"${GIT_KEY}"', url: '“${GIT_URL}”' echo "代码git地址:" + "${GIT_URL}" echo "分支名称:" + "${BRANCH_NAME}" echo "========================结束拉取代码========================" } } stage('编译代码') { steps { echo "========================开始编译代码========================" sh label: '', script: '''echo $PATH cd ${WORKSPACE}/${PROJECT}/${SOURCE_FILE}/ rm -fr * cd ${WORKSPACE}/ rm -fr ${WORKSPACE}/${SOURCE_FILE}/admin/config.php rm -fr ${WORKSPACE}/${SOURCE_FILE}/admin/database.php rm -fr ${WORKSPACE}/${SOURCE_FILE}/api/config.php rm -fr ${WORKSPACE}/${SOURCE_FILE}/api/database.php mv ${SOURCE_FILE}/* ${PROJECT}/${SOURCE_FILE}/ zip -r ${PROJECT}.zip ${PROJECT}/''' echo "========================结束编译代码========================" } } stage('上传代码') { steps { echo "========================开始上传代码========================" sh label: '', script: ''' rm -fr ${PACKAGE_DIR}/${PROJECT}/"${PROJECT}".zip cd ${WORKSPACE} mv ${PROJECT}.zip ${PACKAGE_DIR}/${PROJECT}''' echo "========================结束拉取代码========================" } } stage('代码发布') { steps { echo "========================开始发布========================" ansibleTower async: false, credential: 'nuoyifu_test_root', extraVars: '', importTowerLogs: false, importWorkflowChildLogs: false, inventory: 'nuoyifu_test', jobTags: '', jobTemplate: '104', jobType: 'run', limit: '', removeColor: false, scmBranch: '', skipJobTags: '', templateType: 'job', throwExceptionWhenFail: false, towerCredentialsId: 'fd97ab14-7276-4855-879c-7eb680a364f0', towerServer: 'AnsibleTower', verbose: false echo "========================结束发布========================" } } } post { success { dingtalk ( robot: 'a3a9e19d-962b-4a69-a327-15fb3a8d1ab2', type: 'LINK', title: '项目${JOB_BASE_NAME}构建成功', text: [ '项目${JOB_BASE_NAME}在构件编号${BUILD_DISPLAY_NAME}上构建成功,点击查看详细内容。' ], messageUrl: '${JOB_DISPLAY_URL}', picUrl: 'https://www.picdiet.com/img/photographer_compressed.jpg' ) } failure { dingtalk ( robot: 'a3a9e19d-962b-4a69-a327-15fb3a8d1ab2', type: 'LINK', title: '项目${JOB_BASE_NAME}构建失败', text: [ '项目${JOB_BASE_NAME}在构件编号${BUILD_DISPLAY_NAME}上构建失败,点击查看详细内容。' ], messageUrl: '${JOB_DISPLAY_URL}', picUrl: 'https://www.picdiet.com/img/photographer_compressed.jpg' ) } } }
以下内容需要根据实际就行修改
Credential:为ansible tower里面的定义的凭据;
Inventory:为tower里面的环境;
jobTemplate:为改应用发布的job模板id;
towerCredentialsId:为jenkins里面定义的连接ansibletower的凭据,点击右上角admin,左边凭据,可以看到此凭据的id。
ansibleTower async: false, credential: 'nuoyifu_test_root', extraVars: '', importTowerLogs: false, importWorkflowChildLogs: false, inventory: 'test', jobTags: '', jobTemplate: '7', jobType: 'run', limit: '', removeColor: false, scmBranch: '', skipJobTags: '', templateType: 'job', throwExceptionWhenFail: false, towerCredentialsId: 'd506b694-6503-4d8c-940a-6dee405bb6d9', towerServer: 'AnsibleTower', verbose: false
点击保存完成。
点击立即构建进行任务构建。