Jenkins 中自动构建项目的类型有很多,常用的有以下三种:
每种类型的构建其实都可以完成一样的构建过程与结果,只是在操作方式、灵活度等方面有所区别,在实际开发中可以根据自己的需求和习惯来选择。(PS:个人推荐使用流水线类型,因为灵活度非常高)
创建一个自由风格项目来完成项目的集成过程:
拉取代码 -》编译 -》打包 -》部署
使用 ssh 方式从 gitlab 拉取代码,配置完成后,点击应用并保存。
构建 -> 添加构建步骤 -> Executor Shell
,设置完成后,点击应用并保存
echo "开始编译和打包"
mvn clean package
echo "编译和打包结束"
安装 Deploy to container 插件
Jenkins 本身无法实现远程部署到 Tomcat 的功能,需要安装 Deploy to container 插件实现
添加构建后操作
http://192.168.10.40:8080/web_demo/
http://192.168.10.40:8080/web_demo/
这个插件安装需要一些时间,如果需要你更新 Jenkins 版本的会有提示信息
拉取代码和远程部署的过程和自由风格项目一样,只是 构建
部分不同
重新构建配置
访问:
http://192.168.10.40:8080
Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
代码
:Pipeline 以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流程。持久
:无论是计划内的还是计划外的服务器重启,Pipeline 都是可恢复的。可停止
:Pipeline 可接收交互式输入,以确定是否继续执行 Pipeline。多功能
:Pipeline 支持现实世界中复杂的持续交付要求。它支持 fork/join、循环执行、并行执行任务的功能。可扩展
:Pipeline 插件支持其 DSL 的自定义扩展 ,以及与其他插件集成的多个选项。SCM
中直接载入 Jenkinsfile Pipeline 这种方法)。Manage Jenkins -> Manage Plugins -> 可选插件
安装完重启,中间的报错忽略
安装插件后,创建项目的时候多了 “流水线” 类型。
流水线 -> 选择 HelloWorld 模板
生成模板如下,仅作示例
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
编写一个简单声明式 Pipeline
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
echo '拉取代码'
}
}
stage('编译构建') {
steps {
echo '编译构建'
}
}
stage('项目部署') {
steps {
echo '项目部署'
}
}
}
}
继续返回配置,这次选择 Scripted Pipeline
脚本示例
node {
def mvnHome
stage('Preparation') { // for display purposes
// Get some code from a GitHub repository
git 'https://github.com/jglick/simple-maven-project-with-tests.git'
// Get the Maven tool.
// ** NOTE: This 'M3' Maven tool must be configured
// ** in the global configuration.
mvnHome = tool 'M3'
}
stage('Build') {
// Run the maven build
withEnv(["MVN_HOME=$mvnHome"]) {
if (isUnix()) {
sh '"$MVN_HOME/bin/mvn" -Dmaven.test.failure.ignore clean package'
} else {
bat(/"%MVN_HOME%\bin\mvn" -Dmaven.test.failure.ignore clean package/)
}
}
}
stage('Results') {
junit '**/target/surefire-reports/TEST-*.xml'
archiveArtifacts 'target/*.jar'
}
}
编写一个简单的脚本式 Pipeline
node {
def mvnHome
stage('pull code') {
echo 'pull code'
}
stage('build project') {
echo 'build project'
}
stage('publish project') {
echo 'publish project'
}
}
正常生产环境声明式使用较多
一些参数还是要自己写的,例如:用户、密码、路径等等。
pipeline {
agent any
stages {
stage('pull code') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '87946319-4d01-457e-b308-1639491e20e6', url: '[email protected]:test-group/web_demo.git']]])
}
}
stage('build project') {
steps {
echo "build project"
}
}
stage('deploy item') {
steps {
echo "deploy item"
}
}
}
}
构建和发布两步先略过,这里只拉取代码到 Jenkins 服务器。
pipeline {
agent any
stages {
stage('pull code') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '87946319-4d01-457e-b308-1639491e20e6', url: '[email protected]:test-group/web_demo.git']]])
}
}
stage('build project') {
steps {
sh 'mvn clean package'
}
}
stage('deploy item') {
steps {
echo "deploy item"
}
}
}
}
pipeline {
agent any
stages {
stage('pull code') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '87946319-4d01-457e-b308-1639491e20e6', url: '[email protected]:test-group/web_demo.git']]])
}
}
stage('build project') {
steps {
sh 'mvn clean package'
}
}
stage('deploy item') {
steps {
deploy adapters: [tomcat8(credentialsId: '0125416d-3d7d-4d0c-9877-f22bbd02cf41', path: '', url: 'http://192.168.10.40:8080/')], contextPath: null, war: 'target/*.war'
}
}
}
}
访问:http://192.168.10.40:8080/web_demo
刚才我们都是直接在 Jenkins 的 UI 界面编写 Pipeline 代码,这样不方便脚本维护,脚本容易丢失,建议把 Pipeline 脚本放在项目中(一起进行版本控制)。
在项目根目录建立 Jenkinsfile 文件,把内容复制到该文件中
我们修改一下源代码,解决 Tomcat 中文乱码问题
<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="UTF-8" %>
<html>
<body>
<h2>welcome devops world!</h2>
<h2>SCM 方式构建</h2>
</body>
</html>
访问:http://192.168.10.40:8080/web_demo/
有时候构建 SCM 项目报错,可以从以下几个角度思考问题:
Jenkins 前四章安装的所有插件:
> Git --- Jenkins 本身不具备从 Gitlab 拉取代码的能力,需要借助插件(服务器上也需要安装yum)。
> Deploy to container --- Jenkins 本身无法实现远程部署到 Tomcat 的功能。
Role-Based Strategy --- 管理 Jenkins 用户权限。
Credentials Binding --- 凭证管理功能。
Maven Integration --- 构建 Maven 项目需要的插件。
> Pipeline --- 构建流水线项目需要的插件。
Chinese --- 中文汉化插件。
">" 标记的就是创建流水线 pipeline 项目需要的插件。
Jenkins 安装完成必要操作: