原创

Jenkins基础

Jenkins基础

一.Jenkins概念

1.什么是Jenkins?

Jenkins是Java语言开发的一款开源 CI/CD 软件,用于自动化各种任务,包括项目的拉取、项目构建、以及项目部署等功能。

中文官网地址:https://www.jenkins.io/zh/

2持续集成的流程说明

首先开发人员代码提交到仓库;

然后Jenkins 作为持续集成工具,使用 Git 工具到仓库拉取代码到集成服务器,再配合 JDK,Maven 等完成代码编译、测试、审查、打包等工作;

最后Jenkins把生成的 jar 或 war 包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用;

3.Jenkins版本介绍

jenkins LTS(长期支持):每3个月更新一次,适合在企业生产环境使 用

jenkins普通版:每周更新一次,适合开发人员测试使用

清华大学下载Jenkins稳定版地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/

二.Jenkins安装

1.安装jdk环境

Jenkins需要依赖JDK,安装jdk环境(fontconfig是Jenkins web界面字体包)

yum install fontconfig java-11-openjdk -y
2.安装Jenkins
yum localinstall jenkins-2.332.3-1.1.noarch.rpm -y
#docekr安装Jenkins
docker run -id -p 8089:8080 --name jenkins --restart=always -v /opt/jenkins/data:/var/jenkins_home jenkins/jenkins:2.332.3
docker pull jenkins/jenkins:2.433-jdk11
3.启动jenkins
systemctl start jenkins && systemctl enable jenkins
4.访问
#默认端口:8080(可修改)
ip:8080
5.配置参数
/etc/sysconfig/jenkins #主配置文件,主要配置Jenkins的工作目录、启动用户、启动端口。
/var/lib/jenkins/plugins/ #插件存放目录
/var/lib/jenkins/users/ #用户信息存放目录
/var/lib/jenkins #默认的Jenkins家目录(存放项目及插件)
/var/log/jenkins #日志文件目录
6.初始配置
Jenkins是一个引擎,他本身的功能很简单,是通过各种不同的插件实现编译部署项目, 例如从 Gitlab 拉取代码,使用 Maven 构建项目等功能需要依靠插件完成 。
如果选择安装推荐的插件,这样大部分常用的插件将会被安装,如果你对Jenkins很熟悉可以自定义插件安装

三.构建任务

1.创建Item

Jenkins的任务可以让我们实现很多工作流程的自动化,例如 打包、持续集成、部署、定时运行等工作,点击左侧栏新建Item(新建任务)

2.构建一个简单的web项目
1.创建新Item

点击新建Item——》输入一个名称——》选择Freestyle project——》点击确定

2.选择复选框Discard old builds

在General(常规):复选框中 Discard old builds(丢弃旧版本)每次构建都会生成很多构建产物,如果频繁建会占用很多的空间,可以通过这几个选项控制构建产物的保留,一般建议选择保留最近5-10天的构建历史记录为宜。

3.配置git

点击git,把仓库地址复制进去,然后添加Credentials凭证,(Jenkins主机需要安装一下git工具)——》点击build now测试是否可以拉取代码,构建成功后代码会拉取到/var/lib/jenkins/workspace/choujiang

4.准备应用机

准备好一台装应用服务器,用来部署拉取的代码,安装好相应的环境,我这里使用Nginx

5.创建脚本

创建一个脚本,让Jenkins通过shell脚本进行部署,此操作在Jenkins服务器执行

#创建一个目录,用于存放项目的发布脚本 
[root@jenkins ~]# mkdir /var/lib/jenkins/script && cd /var/lib/jenkins/script 
#以下是项目发布的脚本内容 
cat jenkins-nginx.sh 
#!/bin/bash 
#发布项目到Nginx 
#定义Nginx网页根目录 
WEB_DIR=/usr/share/nginx 
#定义Jenkins项目所在路径 
CODE_DIR=/var/lib/jenkins/workspace/choujiang 
#项目发布时间 
TIME=`date +%F-%H-%M`
#打包项目 
cd $CODE_DIR && tar -zcf /tmp/web-$TIME.tar.gz ./* 
#发布项目 
for IP in `cat /var/lib/jenkins/script/nginx.txt` 
do 
scp /tmp/web-$TIME.tar.gz root@$IP:$WEB_DIR 
ssh root@$IP "cd $WEB_DIR && mkdir web-$TIME" 
ssh root@$IP "cd $WEB_DIR && tar -xf web-$TIME.tar.gz -C web-$TIME && rm -rf web-$TIME.tar.gz"
ssh root@$IP "cd $WEB_DIR && rm -rf html && ln -s web-$TIME html" 
done 
#把nginx主机的IP地址写到这个文件里 
vim nginx.txt 
server_ip 
#添加执行权限 
chmod +x jenkins-nginx.sh
4.配置Jenkins用户免密发布项目到Nginx的服务器
#切换到Jenkins用户 
usermod -s /bin/sh jenkins && su - jenkins 
#生成密钥文件 
-sh-4.2$ ssh-keygen 
#将公钥传给Nginx 
-sh-4.2$ ssh-copy-id root@server_ip 
#切换到脚本路径执行脚本(主要是首次连接需要确认yes,否则Jenkins直接 构建会失败) 
-sh-4.2$ cd script/ 
-sh-4.2$ ./jenkins-nginx.sh
5.构建shell脚本执行

回到 Jenkins的choujiang任务点击 设置→构建→增加构建步骤→Execute shell(shell命令)→保存→点击build now测试

6.Jenkins+GitLab自动发布项目

本实验实现只要GitLab的master分支有新代码提交,Jenkins 自动触发Build New(立即构建)功能,实现代码自动发布。

安装GitLab构建触发器插件→点击左侧Manage Jenkins→Manage Plugins→可选插件→安装(gitlab和Generic Webhook Trigger)

构建webhook触发器:选择构建触发器→勾选Build when a change is pushed to GitLab. GitLab webhook→高级→勾选Filter branches by name填写Include(master分支)→点击Secret token里面的generate→保存

GitLab设置webhook:

回到GitLab的choujiang项目中点击左侧 设置→webhooks 粘贴Jenkins的令牌到Secret token处→网址填写Jenkins项目中的网址

7.jenkins返回构建状态到GitLab

Jenkins每次自动构建完成后可以把构建的结果反馈给Gitlab,这样在Gitlab上就可以查看每一次构建的结果。

首先在Jenkins上配置,打开 Manage jenkins(管理Jenkins)→confifigure System(系统设置)下拉找到GitLab部分→自定义名称→gitlab服务器地址→再去gitlab生成一个apitoken

Jenkins增加构建后操作步骤:进到任务中点击 配置→构建后操作

四.java项目发布

1.maven

maven是Apache基金会开源的一款项目综合管理工具,主要是服务java项目构建,依赖管理等工作。

官网:https://maven.apache.org/

下载地址:https://maven.apache.org/download.cgi(这里使用apache-maven-3.8.1-bin.tar.gz)

1.maven安装
# 上传安装包并解压
[root@jenkins ~]# tar -xf apache-maven-3.8.1-bin.tar.gz
#移动解压后的maven并改名
[root@jenkins ~]# mv apache-maven-3.8.1 /usr/local/maven
#将maven添加到环境变量
[root@jenkins ~]# vim /etc/profile
export PATH=/usr/local/maven/bin/:$PATH #在文件末尾添加
#使用source使配置生效
[root@jenkins ~]# source /etc/profile
#验证
[root@jenkins ~]# mvn -v

2.maven目录结构
bin:该目录包含了 mvn 运行的脚本,在命令行输入任何一条 mvn 命令时,实际上就是在调用这些脚本。
boot:该目录只包含一个文件plexus-classworlds-2.5.2.jar是一个类加载器框架,Maven使用该框架加载自己的类库,对于一般的 Maven 用户来说,不必关心该文件。
conf:该目录包含了一个非常重要的settings.xml文件,是Maven的全局配置文件。
lib:该目录包含了所有 Maven 运行时需要的 Java 类库。
LICENSE:记录了 Maven 使用的软件许可证 。
NOTICE:记录了 Maven 包含的第三方软件。
README.txt:包含了 Maven 的简要介绍,包括安装需求及如何安装的简要指令等。

3.maven基本操作
命令功能
mvn package生成jar/war包
mvn clean清空生成的文件

找一个java源码包上传到Jenkins服务器,解压并进入

[root@jenkins ~]# unzip spring-source-mvc-ano-v1.0.zip 
[root@jenkins ~]# cd spring-source-mvc-ano-v1.0
# 先进行清理
[root@jenkins spring-source-mvc-ano-v1.0]# mvn clean
# 在进行打包
[root@jenkins spring-source-mvc-ano-v1.0]# mvn package
# 打包后再target里面
[root@jenkins spring-source-mvc-ano-v1.0]# ls target/

配置maven仓库

# maven默认下载的依赖存放在root家目录里面的.m2/repository/里面
[root@jenkins ~]# ll -a
drwxr-xr-x.  3 root root      24 7月  16 19:24 .m2
# 配置远程仓库
[root@jenkins ~]# vim /usr/local/maven/conf/settings.xml
<!-- 阿里云仓库 --> 
  <mirrors>
    <mirror>
        <id>alimaven</id> 
        <mirrorOf>central</mirrorOf> 
        <name>aliyun maven</name> 
        <url>http://maven.aliyun.com/nexus/content/repositories/ce ntral/</url> 
    </mirror>
  </mirrors>

2.推送项目到gitlab

先在gitlab创建一个仓库,创建前先把java包上传到gitlab,方便上传到仓库

仓库名地址
mavengit@192.168.92.19:root/maven.git

把项目推送到gitlab仓库

# 将上传的java项目上传解压后进到目录操作一下步骤
git init
git remote add origin git@192.168.92.19:root/maven.git
git add .
git commit -m "第一次提交"
git push -u origin --all

3.Jenkins安装maven插件

Plugin Manager里面可选插件中搜索maven,选择Maven Integration进行安装

4.构建Maven项目

点击新建Itme,即可看到 构建一个maven项目,输入任务名称后点击构建一个maven项目点击确定。

配置git拉取项目

配置build构建项目

构建后项目地址

[root@jenkins ~]# ls /var/lib/jenkins/workspace/maven-job/target/
spring-source-mvc-ano-1.0-SNAPSHOT.war #这个war包就是构建 出来的web项目 
JAR包:就是Java项目的依赖工具 
WAR包:Java项目都是打成war包进行发布,将war包放在tomcat的webapps下,并且tomcat服务器能够自动识别,能够对war包进行自动解压

5.部署Tomcat

准备一台机器安装Tomcat服务(实验环境可以跟前边的Nginx部署在同一台机器,不冲突)

# java项目需要先安装jdk
[root@tomcat ~]# yum -y install java-1.8.0-openjdk 
# 下载Tomcat包上传并解压
[root@tomcat ~]# tar -xf apache-tomcat-8.0.30.tar -C /usr/local/tomcat
# 启动Tomcat
[root@tomcat ~]# /usr/local/tomcat/bin/startup.sh

设置tomcat随机自启

[root@tomcat ~]# vim /etc/rc.local
/usr/local/tomcat/bin/startup.sh 
[root@tomcat ~]# chmod +x /etc/rc.d/rc.local

6.Jenkins发布Java项目

准备脚本

vim /var/lib/jenkins/script/jenkins-tomcat.sh 
#!/bin/bash 
#发布项目到tomcat 
#定义tomcat网页根目录 
WEB_DIR=/usr/local/tomcat/webapps/ 
#定义Jenkins项目所在路径 
CODE_DIR=/var/lib/jenkins/workspace/maven-job/target
#项目发布时间 
TIME=`date +%F-%H-%M-%S` 
#打包项目 
cd $CODE_DIR && tar -zcf /tmp/web-$TIME.tar.gz ./*.war 
#发布项目 
for IP in `cat /var/lib/jenkins/script/tomcat.txt` 
do 
scp /tmp/web-$TIME.tar.gz root@$IP:$WEB_DIR 
ssh root@$IP "cd $WEB_DIR && mkdir web-$TIME" 
ssh root@$IP "cd $WEB_DIR && tar -xf web-$TIME.tar.gz -C web-$TIME && rm -rf web-$TIME.tar.gz" 
ssh root@$IP "cd $WEB_DIR && rm -rf ROOT* && \cp web-$TIME/*.war ROOT.war" 
ssh root@$IP "/usr/local/tomcat/bin/shutdown.sh" 
sleep 3
ssh root@$IP "/usr/local/tomcat/bin/startup.sh" 
done

准备for循环的主机地址

echo 192.168.92.129 > /var/lib/jenkins/script/tomcat.txt 

给脚本执行权限

chmod +x /var/lib/jenkins/script/jenkins-tomcat.sh

7.到Jenkins任务中增加构建步骤

回到任务中,点击配置,添加Jenkins执行shell脚本命令

五.Pipeline

Jenkins Pipeline(流水线) 简单来说就是将多个任务连接起来的一套工作流程。

1.Jenkinsfifile介绍

Jenkinsfifile是用来编写 Pipeline 的脚本语法,在一个Pipeline中有如下几个基础概念:

pipeline:声明此语法是声明式(Declarative)式语法(还有一种脚本式的语法)
agent:是指定执行Step的具体节点,any表示所有(在Jenkins分布式环境下可以指定具体节点去执行任务)。
stages:代表构建项目的阶段开头,里边包含多个stage。
Stage(阶段):一个Pipeline由多个Stage组成,每个Stage(阶段)可包含多个Step(步骤)。
Steps(步骤):可以是拉取代码、构建项目、发布项目等。

示例

pipeline {
    agent any
    stages {
        stage('Build') { 
            steps {
                echo "hh"
            }
        }
        stage('Test') { 
            steps {
                echo "start" 
            }
        }
        stage('Deploy') { 
            steps {
                echo "stop"
            }
        }
    }
}

2.Pipeline Job示例

创建一个Pipeline(流水线)项目,点击新建Item→选择pipeline→流水线

pipeline {
    agent any
    stages {
        stage('Build') { 
            steps {
                echo "hh"
            }
        }
        stage('Test') { 
            steps {
                echo "start" 
            }
        }
        stage('Deploy') { 
            steps {
                echo "stop"
            }
        }
    }
}


六、docker部署

version: '3.7'

services:
  jenkins:
    image: 'jenkins/jenkins:2.433-jdk11'
    container_name: jenkins
    user: root
    privileged: true
    restart: always
    ports:
      - '8888:8080'
    volumes:
      - '/opt/jenkins/data:/var/jenkins_home'
      - '/var/run/docker.sock:/var/run/docker.sock'
      - '/usr/bin/docker:/usr/bin/docker'

jenkins
  • 作者:shi(联系作者)
  • 发表时间:2024-07-13 20:53:12
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论