什么是Jenkins?
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作。说白了就是减少人工的干预 利用软件去完成自动化构建的任务,比如web应用发布,一些php/java/js等语言开发的项目 开发完成后需要部署到远程服务器上 从开发者提交代码至git上后,一切的事情都有Jenkins去完成。这就是企业中所说的的持续集成(CI),另外还有持续交付(CD) 持续部署(CD)
安装
安装方式有rpm包和war包 这2中比较普遍。这里采用的是rpm
- 持续集成(Continunous Integration:CI) 代码合并,构建,部署,测试都在一起,不断的执行这个过程,并对结果反馈
持续交付(Continunous Delivery:CD) 部署到生产环境,给用户使用
持续部署(Continunous Deployment:CD) 部署到生产环境
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key yum install jenkins -y systemctl start jenkins
打开浏览器访问 http://172.16.113.146:8080
可以看到 密码存储在 /var/lib/jenkins/secrets/initiaAdminPassword 下
可以按自己的需求定义插件 这里就安装默认插件
常用插件
用户权限管理
插件:Role-based Authorization Strategy
设定权限之前 先允许注册新用户
系统管理 >> 全局安全配置 >> 安全域 >> 允许新用户注册
打开系统管理 进入 Manage and Assign Roles 进入角色权限配置界面
通过角色的权限 来控制用户的权限
Global roles: 全局角色
User:即为新创建的角色 一般来说只需要一个读取权限即可
admin: 默认创建 管理员使用
Project roles:项目角色
Team-A: A-.* # 匹配A开头的每个项目
Team-B: B-.* # 配配B开头的每个项目 (之后将用户添加到项目组里即可)
将新注册的用户 添加到角色中和项目组中
参数化构建
插件:Extended Choice Parameter
添加参数化构建过程 密码参数及文本参数 为常用
Git Parmeter 显示git分支(结合前面定义的参数化构建的branch来使用)
Jenkins slave ( 子节点需要有java环境)
远程工作目录 /var/lib/jenkins
启动方式SSH
添加用户名密码
认证方式 Manually trusted key Verification Strategy
构建项目中配置 限制项目的运行节点 填上slave标签名 就可以指定节点构建
pipeline 流水线构建
pipeline构建 其他配置很少 基本都写在脚本里 node节点 拉取git代码 发布编译等等…
下图就是 构建的过程及展示,每个步骤全都分开 并提供日志查看
pipeline的核心概念:
node:节点
一个node就是一个jenkins节点,或者是master,或者是agent,是执行step的菌体环境
step:步骤
step是一个最基本的操作单元,由各类jenkins plugin提供
stage:阶段
一个pipeline可以划分为若干个stage,每个stage代表一组操作,例如build,test,deploy
stage是一个逻辑分组的概念,可以跨多个node
官方提供的github示例脚本语法:
node { // 如果在从节点构建 在这里声明 def mvnHome stage('Preparation') { // stage是步骤 这是拉取git代码 git 'https://github.com/jglick/simple-maven-project-with-tests.git' mvnHome = tool 'M3' } stage('Build') { //构建 if (isUnix()) { sh "'${mvnHome}/bin/mvn' -Dmaven.test.failure.ignore clean package" } else { bat(/"${mvnHome}\bin\mvn" -Dmaven.test.failure.ignore clean package/) } } stage('Results') { // 结果/打包 junit '**/target/surefire-reports/TEST-*.xml' archive 'target/*.jar' } }
也可以将脚本放到git上 便于指定
# 这是一个以wordpress为例的脚本: node ("slave-172.16.113.149") { stage('git checkout') { checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submodu leCfg: [], userRemoteConfigs: [[url: '[email protected]:/home/git/repos/wordpress.git']]]) } stage('code copy') { sh '''rm -rf ${WORKXPACE}/.git cp -rf /usr/share/nginx/html /data/backup/html-$(date +"%Y-%m-%d") rm -rf /usr/share/nginx/html/* cp -rf ${WORKSPACE} /usr/share/nginx/html echo "ok" >> /usr/share/nginx/html/A-pipeline-wp/status.html''' } stage('test') { sh '''curl http://wps.qxfell.com/status.html''' } }
# 这是一个以maven构建的脚本例子: node ("slave-172.16.113.147") { stage('git checkout') { checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submodu leCfg: [], userRemoteConfigs: [[url: '[email protected]:/home/git/repos/solo.git']]]) } stage('maven build') { sh ''' echo $(hostname) export JAVA_HOME=/usr/local/jdk8u45 /usr/local/maven-3.5/bin/mvn clean package -Dmaven.test.skip=true''' } stage('deploy') { sh '''export JAVA_HOME=/usr/local/jdk8u45 JENKINS_NODE_COOKIE=dontkillme TOMCAT_NAME=tomcat8 TOMCAT_HOME=/usr/local/$TOMCAT_NAME WWWROOT=$TOMCAT_HOME/webapps/ROOT [ -d $WWWROOT ] && mv $WWWROOT /data/backup/${TOMCAT_NAME}-$(date +"%Y-%m-%d") rm -rf $WWWROOT/* unzip ${WORKSPACE}/target/*.war -d $WWWROOT PID=$(ps -ef | grep catalina | grep -v "grep" | awk \'{print $2}\') [ -n "$PID" ] && kill -9 $PID /bin/bash $TOMCAT_HOME/bin/startup.sh echo "ok" >> $WWWROOT/status.html''' }