安装
Tomcat安装:
tar zxvf jdk-8u45-linux-x64.tar.gz
mv jdk1.8.0_45 /usr/local/jdk
tar zxf apache-maven-3.5.0-bin.tar.gz
mv apache-maven-3.5.0 /usr/local/maven
vi /etc/profile
JAVA_HOME=/usr/local/jdk
PATH=$JAVA_HOME/bin:$PATH:/usr/local/maven/bin
export JAVA_HOME PATH
source /etc/profile
Docker安装:
tar zxvf jdk-8u45-linux-x64.tar.gz
mv jdk1.8.0_45 /usr/local/jdk
tar zxf apache-maven-3.5.0-bin.tar.gz
mv apache-maven-3.5.0 /usr/local/maven
docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -u root -v /opt/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /usr/local/maven:/usr/local/maven -v /usr/local/jdk:/usr/local/jdk -v /etc/localtime:/etc/localtime --restart=always --name jenkins jenkins/jenkins:lts
jenkins基本配置
-
插件安装
由于国外源比较慢需要要修改为清华源
cd /var/lib/jenkins/updates
由于每个版本不一样下面这一步按照实际修改
sed -i 's/https://updates.jenkins.io/download/https://mirrors.tuna.tsinghua.ed u.cn/jenkins/g' default.json && sed -i 's/http://www.google.com/https://www.baidu.com/g' default.json
同时修改页面的json(主要是做搜索展示用的)
在Dashboard-->>插件管理--->>高级-->>升级站点
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json完成之后重启 可以利用api重启
-
在插件里面搜索 Localization: Chinese (Simplified)
默认是安装的 如果没有安装 安装上即可
安装完成页面如下
jenkins常见插件
Jnkines核心功能应用
项目管理
新建一个项目 新建项目--->选择风格输入名称--->源码管理选择git输入代码地址(按照需求选择参数 比如丢弃旧的构建)-->配置账号密码-->指定分支
如果没问题 那么一个简单的CD就完成了
如果账号密码输入错误想要修改可以在 Dashboard--->凭据---->系统---->全局凭据里面找到对应的账号密码修改
用户与权限
Jenkins使用Role-based Authorization Strategy插件来实现基于角色的用户权限控制。
首先安装插件 (Role-based Authorization Strategy)
安装插件之后在Dashboard-->全局安全配置里面打开策略
-
激活基于角色策略
Manage and Assign Roles
Global roles 意思是登录和展示项目 这里只选Read即可
Item roles 是项目权限 利用正则添加
-
创建角色 分配角色到用户(权限集合)
这里主要是吧用户和上面的权限进行结合
管理参数化
这里列举常用的2个
-
选项参数
这里将会把你选择的结果传递给变量env 你在后期就可以直接使用这个变量 除此之外jenkins还有很多自带的变量可以引用
-
字符串参数化构建 大同小异
GitParameter:
自动获取当前Git地址所有分支,并提供下拉框可选
同样的道理 这里会把你的选择赋值给branch 这里需要在高级里面自定义匹配规则
因为如果不这样指定 匹配出来的结果就是 origin/XXX 这样后续就不太去应用这个变量
ExtendedChoiceParameter:
功能强大,支持单选、多选,读取文件作为值,支持Groovy脚本
-
扩展分布式构建(Master/Slave)
在系统管理-->节点管理-->新建节点
这里用ssh连接 需要配置对应的账号密码
这里需要注意最好把JAVA路径和HOST KEY配置上。要不然会有各种问题
如上图所示表示连接成功
可以在构建项目的时候选择 限制项目的运行节点 然后选择对应的标签,但是大部分时候还是在pipline里面使用
拷贝构建文件到远程服务器
Publish Over SSH插件:基于SSH发送文件并在远程服务器上执行命令。
配置SSH密钥对实现免交互认证:
-
生成密钥对:ssh-keygen
-
将id_rsa.pub公钥内容添加到目标服务器(ssh-copy-id)
-
将id_rsa私钥保存到插件配置里
在系统管理--->系统配置--->Publish over SSH 放入私钥
同时在下方配置需要登录的目标服务器信息,当然也可以在项目里配置
在远程服务器执行Shell命令
pipeline
声明式:支持大部分Groovy,具有丰富的语法特性,易于编写和设计。pipeline { }
脚本式:遵循与Groovy相同语法。node { }
目前主流 声明式
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
Stages是Pipeline中最主要的组成部分,Jenkins将会按照Stages中描述的顺序
从上往下的执行。
Stage:阶段,一个Pipeline 可以划分为若干个Stage,每个Stage 代表一组操作,
比如:Build、Test、Deploy
Steps:步骤,Steps 是最基本的操作单元,可以是打印一句话,也可以是构建一个Docker 镜像,由各类Jenkins 插件提供,比如命令:sh ‘mvn',就相当于我们平时shell 终端中执行mvn命令一样。
利用blue ocean可视化pipeline
.......
pipeline 语法生成
可以利用如图的方式方便生成pipeline脚本
agent any 后面跟标签可以指定服务器执行
agent {
label : test
}
agent 指定流水线的执行节点
options 流水线选项,一般用于设置阶段超时时间
environment 定义所有步骤的环境变量,或者特定步骤
parameters 触发流水线时提供的参数列表
triggers 自动化触发
tools 使用配置的工具,只支持maven、jdk、gradle
input 用户交互输入
script 使用脚本式语法
post 流水线执行完成后执行
withCredentials 从凭据中读取数据并赋值变量
指令示例:https://www.jenkins.io/zh/doc/book/pipeline/syntax/#parameters-example
一个简单的pipeline脚本示例
pipeline {
agent {
label "test"
}
environment {
gitlab_address = "http://192.168.31.90:88/microservice/demo.git"
gitlab_auth = "d09717ec-47c2-48f2-9c1c-f182b4589e74"
ansible_ssh_auth = "84ea22bc-c2c6-4f8f-88bb-9ed885819f9e"
}
parameters {
gitParameter branch: '', branchFilter: '.*', defaultValue: 'master', description: '请选择要发布的分支名称', name: 'selectBranch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH'
choice choices: ['webservers1', 'webservers2', 'webservers3'], description: '灰度发布策略,分批次部署', name: 'ENV'
}
triggers {
pollSCM('*/1 * * * *')
}
stages {
stage('拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: "${params.selectBranch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${gitlab_auth}", url: "${gitlab_address}"]]])
}
}
stage('编译构建') {
steps {
sh "/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true"
}
}
stage('拷贝构建文件到远程主机并部署') {
steps {
// 读取连接Jenkins服务器用户名和密码
withCredentials([usernamePassword(credentialsId: '3e642bd1-ac6d-4c08-b01f-1125bf5bed9d', passwordVariable: 'password', usernameVariable: 'username')]) {
// ===========================================
sh """
###################### 主机清单文件 ############################
cat > /opt/jenkins_home/.hosts << EOF
[webservers1]
192.168.31.72
192.168.31.73
[webservers2]
192.168.31.72
[webservers3]
192.168.31.72
EOF
###################### Playbook文件 ############################
cat > /opt/jenkins_home/.playbook.yaml << "EOF"
- hosts: $ENV # Jenkins参数化变量
gather_facts: no
vars: # 定义playbook变量,下面{{}}引用这里的变量
workspace: $WORKSPACE # WORKSPACE和BUILD_NUMBER引用Jenkins变量
build_number: $BUILD_NUMBER
tomcat_dir: "/usr/local/tomcat" # 自定义变量
backup_dir: "/data/backup"
backup_filename: "demo-ROOT-$(date +%F)-{{ build_number }}.war" # 格式:项目名-文件名-日期-构建编号
tasks:
- name: 推送部署包到远程服务器
copy: src="{{ item }}" dest={{ tomcat_dir }}/webapps
with_fileglob:
- "{{ workspace }}/target/*.war"
- name: 部署新程序并重启Tomcat
# 脚本中$必须转义,否则会认为是Jenkins变量
shell: |
cd {{ tomcat_dir }}/webapps
mv ROOT.war {{ backup_dir }}/{{ backup_filename }}
mv *.war ROOT.war
pid=$(ps -ef |grep {{ tomcat_dir }} |egrep -v 'grep' |awk '{print $2}')
[ -n "$pid" ] && kill -9 $pid
export JAVA_HOME=/usr/local/jdk
nohup {{ tomcat_dir }}/bin/startup.sh
EOF
"""
// ===========================================
}
ansiblePlaybook(
playbook: '/opt/jenkins_home/.playbook.yaml',
inventory: '/opt/jenkins_home/.hosts',
credentialsId: "${ansible_ssh_auth}"
)
}
}
}
}