新建项目和工程

为了管理方便,在DevOps中将系统分级为两层,项目、工程。 在演示用例中,我们建立一个项目,samples, 里面包含若干工程,hellowar, hellojar, hellohtml等。

以hellowar为例,建立Tomcat项目的自动化部署。

关于hellowar

hellowar是一个简单的tomcat项目,源代码可以在gikoluo/java-tomcat-example-app找到。部署成功后,访问项目首页,会得到一个WEB页面: hello world。

Jenkins项目框架

 HOME  #根
|-- samples #项目名
| |-----builds #这里放置编译任务
| |---- hellowar
| |---- hellojar
| |---- hellowar #这是一个带有pipeline的发布任务
| |---- hellojar
|-- sa #SA项目,用于管理DevOps环境及设备
|---- playbooks 这是一个发布+ant编译的项目。

对于工程,我们把编译和发布分离,一个pipeline中仅关联一次编译,这样有助于减少编译次数,并保证各环境下的部署内容一致。

Playbook项目框架

ROOT
|-- samples #项目名
|-- 22-tomcat8.yml #基础包。用数字作为前缀,表明依赖的先后顺序。
|-- hellowar.yml #工程包。以工程为名。

配置文件结构

ROOT
|-- projects
| |-- samples
| | |-- vars
| | | |-- main.yml #通用配置
| | | |-- uat.yml #环境特殊配置,比如环境IP,数据库IP等
| | |-- hellowar #应用配置模板文件,可以使用vars中的变量
| | | #在发布时进行变量替换。
| | | |-- application.xml

Tomcat基础包部署文件

---
# filename: 22-tomcat8.yml

- hosts: "&samples:hellowar"
become: True
become_user: root
pre_tasks:
- name: include Globals
include: "{{ playbook_dir }}/../includes/global_vars.yml"
vars:
project_name: "samples"
roles:
- app.tomcat
vars:
project_name: "hellowar"
service_name: "{{ hellowar.tomcat.service_name }}"
jdk_home: "{{ jdk8_home }}"
tomcat_version: '8.5.38'
tomcat_env_catalina_home: "{{ opt_root }}/{{ service_name }}/"
tomcat_redis_filename: "apache-tomcat-{{ tomcat_version }}.tar.gz"
tomcat_default_override_uri_encoding: UTF-8
tomcat_service_allow_restart: true
system_type: "systemd"
tomcat_instances:
- name: "{{ service_name }}"
service_name: "{{ service_name }}"
service_file: "{{ service_name }}"
port_ajp: 8009
port_connector: "{{ hellowar.tomcat.port }}"
port_redirect: 8443
port_shutdown: -1
path: "{{ opt_root }}/{{ service_name }}"
tomcat_service_allow_restart: true
tomcat_default_override_uri_encoding: UTF-8

项目部署文件

---
# filename: hellowar.yml

- hosts: &samples:hellowar
pre_tasks:
- name: include Globals
include: "{{ playbook_dir }}/../includes/global_vars.yml"
tags: "always"
roles:
- role: app.config
- role: app.war
vars:
type: "tomcat"
vars:
project_name: "samples"
service_name: "{{ hellowar.tomcat.service_name }}"
workspace: "{{ app_root }}/war/{{ service_name }}"
container:
type: "tomcat"
service_name: "{{ service_name }}"
jdk_home: "{{ jdk8_home }}"
warfile: "hello.war"
TARGET_FILE: "hello-0.0.1-SNAPSHOT.war" #this file path will be replace by jenkins
war_unachive: false
target_type: "war"
configurations_files: "{{ hellowar.configurations_files }}"
service:
name: "{{ service_name }}"
port: "{{ hellowar.tomcat.port }}"

服务器设备配置

#filename: uat/samples

[jdk8]
192.168.10.50 default_link=1

[hellowar]
192.168.10.50

[samples:children]
hellowar

配置文件

---
#repo: configs
#filename: configs/projects/vars/main.yml

hellowar:
tomcat:
service_name: "tomcat-hellowar"
port: 8080
configurations_files: []
log:
home: "{{ log_root }}/tomcat-hellowar"
level: INFO

提交并在Jenkins中发布Playbooks,configs代码

进入发布机,将项目的设备资源及环境进行初始化

ansible-playbook jkt/22-tomcat7.yml -i $INVERNTORY
ansible-playbook jkt/crm.yml -i $INVERNTORY --tags=setup
ansible-playbook jkt/appserver.yml -i $INVERNTORY --tags=setup

配置Jenkins

在Jenkins WEB页面中,如上框所示的目录架构,新建文件夹任务,samples; 再建立文件夹任务builds。

建立hellowar工程,类型为maven项目,配置如下:

源代码: https://github.com/gikoluo/java-tomcat-example-app.git
Build:
ROOT POM: pom.xml
Goals and options: compile war:war
归档成品: target/hellowar.war

保存,编译,等待hellowar.war编译完成

在samples内,建立任务hellowar,类型为 流水线。配置如下:

Prepare an environment for the run: True
Properties Content内填入以下内容:

PROJECT_NAME=samples
SERVICE_NAME=hellowar
BUILD_JOB=${PROJECT_NAME}/builds/hellowar
TARGET_FILE=target/hellowar.war
AUTO_BUILD=true

流水线: Pipeline srcipt from SCM
GIT, Repositories: https://github.com/gikoluo/devops-utils.git
脚本路径: src/jenkinsfile/common/Jenkinsfile.groovy

  • Prepare an environment for the run: 为EnvInject提供的功能,将Properties Content的语法为Key/Value变量,申明内容将注入到全局变量,供Jenkins脚本使用。注意,内容中,不允许有注释。
    • PROJECT_NAME/SERVICE_NAME: 填项目、工程名称。
    • BUILD_JOB: 填上文建立的Maven项目名。形如${PROJECT_NAME}/builds/hellowar。
    • TARGET_FILE: 填BUILD_JOB中编译归档的文件名,注意带上路径。
    • PLAYBOOK: 填写Playbook名称,如不存在则将使用 ${PROJECT_NAME}/${SERVICE_NAME}。
    • AUTO_BUILD: true/false 。 #是否每次发布时都自动执行编译。默认True。
  • 流水线: gikoluo/devops-utils 提供了一些标准通用的流水线文件,可以直接使用,可以获得源代码滞后,将文件内容直接复制到流水线定义里。

保存,构建。顺利的话,你将得到一个如图所示的Pipeline:

确认发布UAT之后,将进入验收阶段。 在浏览器中键入: http://192.168.10.50:8080/hello/ , 得到Hello World。确认UAT验证完成。

接下来继续通过Pipeline,确认Production发布、Production验收阶段,完成上线的全部流程。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据