不经常用的东西还是记录一下吧,老了记性差

Jenkins开发团队重要成员之一。

jenkins

jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。官网: http://jenkins-ci.org/

教程环境

CentOS7

GitLab(不多说)

Jenkins安装

安装JDK

jenkins需要依赖JDK,先安装JDK8

yum install java-1.8.0-openjdk

安装目录 /usr/lib/jvm

jenkins安装包

下载页面:[https://jenkins.io/zh/download/

按照提示操作

修改Jenkins配置

vim /etc/syscofig/jenkins
...
#修改
JENKINS_USER="root" 
JENKINS_PORT="82"

启动jenkins

systemctl start jenkins

端口添加到防火墙

firewall-cmd --zone=public --add-port=82/tcp --permanent 
firewall-cmd --reload

打开浏览器访问

http://ip:82

在日志中找到密码

先跳过插件安装

接着创建管理员用户保存完成

修改插件下载地址(国内)

下面这一步要先点击一下让jenkins的官方插件列表下载到本地

Jenkins->Manage Jenkins->Manage Plugins,点击Available

然后替换源

cd /var/lib/jenkins/updates

sed -i 's/http:\/\/updates.jenkinsci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i
's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json

进入插件管理点击 advanced

Update Site改为国内插件下载地址

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

点击sumbit

浏览器输入: http://ip:82/restart ,重启Jenkins。

汉化插件

还是国语舒服

Jenkins->Manage Jenkins->Manage Plugins,点击Available,搜索"Chinese"

jenkins汉化

记得要重启

jenkins用户权限管理

安装Role-based Authorization Strategy 插件来管理。jenkins的插件是真多。。

Role-based

系统管理中就会多出一个菜单

点击Manage Roles

Manage Roles

  • testRole:该角色为全局角色。这个角色需要绑定Overall下面的Read权限,是为了给所有用户绑 定最基本的Jenkins访问权限。注意:如果不给后续用户绑定这个角色,会报错误:用户名 is missing the Overall/Read permission
  • role1:该角色为项目角色。使用正则表达式绑定"api.",意思是只能操作itcast开头的项目。
  • role2:该角色也为项目角色。绑定"api.*"。

创建用户

系统管理->管理用户

分配角色

系统管理->Manage and Assign Roles. 点击Assign Roles. 进行上面创建的角色绑定

创建项目

不同的用户不同的角色看到不同的项目。。

Jenkins凭证管理

就是存一些密码,比如 数据库密码,gitlab密码认证,Docker仓库密码等。

还是要下插件,需要啥下载啥

安装Credentials Binding插件

还是上面安装插件的地方,略略略。。。

安装完后

点击. 系统管理. 里面会有一个 manage Credentials 菜单 点进去,点击全局 就可以添加凭证了

凭证类型

  • Username with password:用户名和密码
  • Gitlab api token :在gitlab中创建access token使用
  • SSH Username with private key: 使用SSH用户和密钥
  • Secret file:需要保密的文本文件,使用时Jenkins会将文件复制到一个临时目录中,再将文件路径 设置到一个变量中,等构建结束后,所复制的Secret file就会被删除。
  • Secret text:需要保存的一个加密的文本串
  • Certificate:通过上传证书文件的方式

安装Git插件和Git工具

在Jenkins的插件管理中搜索 git。安装

CentOS7 安装git工具

yum install git -y 

Gitlab认证

可以使用Username with password类型认证 也可以api token认证,ssh认证

教程使用ssh认证

在Centos上root用户生成公钥和私钥

ssh-keygen -t tsa

在/root/.shh/ 目录中

id_rsa:私钥文件

id_rsa.pub:公钥文件

把生成的公钥放在Gitlab中

用gitlab的root账户登录->点击头像->Settings->SSH Keys

复制id_rsa.pub文件的内容到 文本框中点击 add key

在Jenkins添加一个新的凭证,类型为"SSH Username with private key",把生成私有文件内容复制到‘private key’中 username填入root。点击确认

Maven安装配置

安装Maven来编译和打包项目

在Centos上安装maven,配置环境变量 mvn -v 检查

偷懒不想写了。。

全局工具配置

首页 系统管理->全局工具配置 配置jdk、maven路径

首页 系统管理- >系统配置。配置环境变量

修改Maven的settings.xml

mkdir /root/repo

创建本地仓库目录 vim /opt/maven/conf/settings.xml

本地仓库改为:/root/repo/

添加阿里云私服地址: alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/central

Tomcat安装和配置

安装tomcat8.5。放开防火墙端口。怎么安装不想写

配置Tomcat用户角色权限

默认Tomcat没有配置用户角色权限

Jenkins部署项目到Tomcat服务器,需要用到Tomcat的用户,所以修改tomcat以下配置, 添加用户及权限

vim /opt/tomcat/conf/tomcat-users.xml

添加内容,账户密码为tomcat

<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/>
</tomcat-users>

为了能外部访问还需要修改 注释掉

vim /opt/tomcat/webapps/manager/META-INF/context.xml
<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->

重启tomcat

访问: http://ip:port/manager/html ,输入tomcat和tomcat

Jenkins构建Maven项目

  • 自由风格软件项目(FreeStyle Project) 略。。懒了
  • Maven项目(Maven Project) 略。。懒了
  • 流水线项目(Pipeline Project)

Pipeline流水线项目构建

  • Pipeline 脚本是由 Groovy 语言实现的
  • Pipeline 支持两种语法:Declarative(声明式)和 Scripted Pipeline(脚本式)语法
  • Pipeline 可以在web ui端创建编写。一般都是放在项目中在jenkins设置(SCM)直接载入

安装Pipeline插件

还是老样子 不贴图了

创建项目

jenkins首页点击新建任务

进入项目中配置

流水线 定义可以选择Pipeline Script在web ui上编写脚本

这选择Pipeline Script from SCM

脚本

pipeline {
    agent any
    stages {
        stage('拉取代码') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'ssh', url: 'git@192.168.31.238:bo/api_test.git']]])
            }
        }
        stage('拉取代码') {
            steps {
               sh 'mvn clean package'
            }
        }
        stage('项目部署') {
            steps {
               deploy adapters: [tomcat8(credentialsId: 'tomcat', path: '', url: 'http://192.168.31.238:8081')], contextPath: null, war: 'target/*.war'
            }
        }
    }
}

构建触发器

  • 触发远程构建
  • 其他工程构建后触发(Build after other projects are build)
  • 定时构建(Build periodically)
  • 轮询SCM(Poll SCM)

略。。又懒了

Git hook自动触发构建

目前正常用的方案

安装Gitlab Hook插件。又来了

需要安装两个插件: Gitlab Hook和GitLab

进入项目找到触发器

Gitlab配置webhook

1.gitlab使用root账户登陆 点击Admin Area -> Settings -> Network

勾选"Allow requests to the local network from web hooks and services"

2.在项目添加webhook 点击项目->Settings->Integrations

URL输入上面截图的地址。勾选Push events

3.进入jenkins

系统管理->系统配置。取消勾选Enable authentication for '/project' end-point。保存

Jenkins 邮箱发送构建结果

安装Email Extension插件

系统管理->系统配置

邮件服务器,如qq、163自己开启配置

在项目根目录创建jenkinsEmail.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
</head>
<body leftmargin="8" marginheight="4" marginwidth="0" offset="0"
      topmargin="8">
<table cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sansserif"
       width="95%">
    <tr>
        <td>(本邮件是程序自动下发的,请勿回复!)</td>
    </tr>
    <tr>
        <td><h2>
            <font color="#0000FF">构建结果 - ${BUILD_STATUS}</font>
        </h2></td>
    </tr>
    <tr>
        <td><br/>
            <b><font color="#0B610B">构建信息</font></b>
            <hr align="center" size="2" width="100%"/>
        </td>
    </tr>
    <tr>
        <td>
            <ul>
                <li>项目名称&nbsp;:&nbsp;${PROJECT_NAME}</li>
                <li>构建编号&nbsp;:&nbsp;第${BUILD_NUMBER}次构建</li>
                <li>触发原因:&nbsp;${CAUSE}</li>
                <li>构建日志:&nbsp;<a
                        href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                <li>构建&nbsp;&nbsp;Url&nbsp;:&nbsp;<a
                        href="${BUILD_URL}">${BUILD_URL}</a></li>
                <li>工作目录&nbsp;:&nbsp;<a
                        href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
                <li>项目&nbsp;&nbsp;Url&nbsp;:&nbsp;<a
                        href="${PROJECT_URL}">${PROJECT_URL}</a></li>
            </ul>
        </td>
    </tr>
    <tr>
        <td><b><font color="#0B610B">Changes Since Last
            Successful Build:</font></b>
            <hr align="center" size="2" width="100%"/>
        </td>
    </tr>
    编写Jenkinsfile添加构建后发送邮件
    <tr>
        <td>
            <ul>
                <li>历史变更记录 : <a
                        href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
            </ul>
            ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for
            Build #%n:<br/>%c<br/>",showPaths=true,changesFormat="
            <pre>[%a]<br
            />%m</pre>
            ",pathFormat="&nbsp;&nbsp;&nbsp;&nbsp;%p"}
        </td>
    </tr>
    <tr>
        <td><b>Failed Test Results</b>
            <hr align="center" size="2" width="100%"/>
        </td>
    </tr>
    <tr>
        <td><pre
                style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica,
sans-serif">$FAILED_TESTS</pre>
            <br/></td>
    </tr>
    <tr>
        <td><b><font color="#0B610B">构建日志 (最后 100行):</font></b>
            <hr align="center" size="2" width="100%"/>
        </td>
    </tr>
    <tr>
        <td><textarea cols="80" readonly="readonly" rows="30"
                      style="font-family: Courier New">${BUILD_LOG,
maxLines=100}</textarea>
        </td>
    </tr>
</table>
</body>
</html>
pipeline {
    agent any

    stages {
        stage('pull code') {
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'ssh', url: 'git@192.168.31.238:bo/api_test.git']]])
            }
        }
        stage('build project') {
            steps {
               sh 'mvn clean package'
            }
        }
        stage('publish project') {
            steps {
               deploy adapters: [tomcat8(credentialsId: 'tomcat', path: '', url: 'http://192.168.31.238:8081')], contextPath: null, war: 'target/*.war'
            }
        }
    }
    post {
        always {
            emailext(
                subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
                body: '${FILE,path="email.html"}',
                to: ' 接受的邮箱地址'
            )
        }
    }
}

其实还有钉钉推送(api机器人),安装DingTalk插件

Jenkins还有很多东西,慢慢玩吧

Q.E.D.