Jenkins入门

官网

Jenkins是开源的,使用Java编写的持续集成的工具,Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代码变更的信息,从而更早的进入测试阶段,更早的发现问题。
持续集成,就是通常所说的CI(Continues Integration),持续集成是一种软件开发实践,开发成员经常集成他们的工作,每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。

使用Jenkins后的项目发布流程

  • 使用前
    项目开发完毕—>使用Maven构建Jar/war—>上传到Linux服务器—>使用命令运行服务—>测试最新版本项目
  • 使用后
    项目开发完毕—>提交至GitLab—>启动Jenkins自动化部署—>Jenkins自动从GitLab拉取到最新的代码进行打包,打包完成后自动上传到Linux服务器,并启动项目—>测试最新版本项目

GitLab安装使用

官网
官方安装教程
安装硬件要求

Gitlab是一个基于git实现的在线代码仓库软件,提供web可视化管理界面,通常用于企业团队内部协作开发。
GitlabGitHub的区别:
相同点:二者都是基于web的Git仓库,在很大程度上Gitlab是仿照GitHub来做的;
它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布
和合作开发项目的中心化云存储的场所。
不同点:GitHub如果要使用私有仓库,是需要付费的。Gitlab可以在上面创建私人的免费仓库。

GitLab安装使用

注:安装GitLab的服务器内存最小为4G

安装
  • 在Linux下安装

1.安装依赖

sudo yum install -y curl policycoreutils-python openssh-server perl
sudo systemctl enable sshd
sudo systemctl start sshd

2.配置镜像

curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash

3.开始安装

sudo EXTERNAL_URL="当前服务器的IP或域名,供后续访问web界面时使用" yum install -y gitlab-jh
例:
sudo EXTERNAL_URL="http://192.168.44.103" yum install -y gitlab-jh

4.登录
浏览器访问步骤3中配置的服务器IP,http://192.168.44.103,如果提示502可以稍等一会儿,尝试再次刷新界面,因为gitlab启动后需要一定时间进行初始化。
输入账号:root 密码通过以下命令进行查看

cat /etc/gitlab/initial_root_password

Jenkins入门_第1张图片

除非在安装过程中指定了自定义密码,否则将随机生成一个密码并存储在 /etc/gitlab/initial_root_password 文件中(出于安全原因,24 小时后,此文件会被第一次 gitlab-ctl reconfigure 自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码)。

5.gitlab常用命令

gitlab-ctl start                  # 启动所有 gitlab 组件;
gitlab-ctl stop                   # 停止所有 gitlab 组件;
gitlab-ctl restart                # 重启所有 gitlab 组件;
gitlab-ctl status                 # 查看服务状态;
gitlab-ctl reconfigure            # 启动服务;
vi /etc/gitlab/gitlab.rb         # 修改默认的配置文件;
gitlab-ctl tail                   # 查看日志;
  • Docker下安装
    官方安装教程

1.拉取镜像并运行

docker run --detach \ #在后台启动镜像
  --hostname 当前服务器的IP或域名,供后续访问web界面时使用 \ #指定名称设置为容器主机名
  --publish 443:443 --publish 80:80 \ #容器映射的端口号
  --name gitlab \ #容器名称
  --restart always \ #启动容器后自启
  --volume $GITLAB_HOME/config:/etc/gitlab:Z \ #容器卷的映射目录
  --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \ #容器卷的映射目录
  --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \ #容器卷的映射目录
  --shm-size 256m \ #虚拟磁盘使用的空间大小
  registry.gitlab.cn/omnibus/gitlab-jh:latest #启动的镜像名称
  
  
  例:
docker run --detach \
  --hostname 192.168.44.103 \
  --publish 443:443 --publish 80:80 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab:Z \
  --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
  --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
  --shm-size 256m \
  registry.gitlab.cn/omnibus/gitlab-jh:latest

2.查看是否启动成功

docker ps -a

Jenkins入门_第2张图片
注:如果未启动可以使用如下命令进行启动

docker start gitlab

3.登录
使用步骤1当中配置的IP进行访问,http://192.168.44.103,同理,如果访问不到可以稍微等一会,尝试再次刷新
Jenkins入门_第3张图片
账号:root
密码查看,进入容器内部

docker exec -it  gitlab /bin/bash

查看存储密码的文件

cat /etc/gitlab/initial_root_password

Jenkins入门_第4张图片
4.修改密码
Jenkins入门_第5张图片
Jenkins入门_第6张图片
此处将密码设置为wangfei1234

使用

1.创建一个仓库
Jenkins入门_第7张图片
2.新建项目
Jenkins入门_第8张图片

3.将本机地项目上传到仓库
Jenkins入门_第9张图片
Jenkins入门_第10张图片
Jenkins入门_第11张图片

Jenkins入门_第12张图片

Jenkins入门_第13张图片
Jenkins入门_第14张图片
Jenkins入门_第15张图片
Jenkins入门_第16张图片
Jenkins入门_第17张图片

Jenkins安装

安装
  • 在Linux下安装
    注:机器要求256 MB 内存,建议大于 512 MB,10 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)需要安装Java 8 ( JRE 或者 JDK 都可以)
  1. 下载war包
  2. 安装JDK

检索可用包

yum search java|grep jdk

安装JRE

yum install java-1.8.0-openjdk

安装JDK

yum install -y java-devel

3.将下载的 jenkins.war 包上传的Linux服务器,并使用如下命令进行启动

java -jar jenkins.war

首次启动war包会在/root/.jenkins生成配置文件

待完全启动成功后 访问服务器8080端口完成配置

初始化后的密码:

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

4e67bbe261da476abdc63c5b51311646

This may also be found at: /root/.jenkins/secrets/initialAdminPassword

密码文件使用后会自动删除

4.访问Jenkins
服务器IP+8080 密码即为步骤3中的密码

  • Docker下安装

1.创建 Jenkins 挂载目录

#创建容器卷映射目录
mkdir -p /usr/local/jenkins
#给该目录配置权限 777,避免权限不足目录挂载失败导致无法启动 Jenkins 容器。
chmod 777 /usr/local/jenkins

2.使用如下命令启动容器

docker run -d \
    -p 8888:8080 \
    -p 50000:50000 \
    -v /usr/local/jenkins:/var/jenkins_home \
    -v /etc/localtime:/etc/localtime \
    --restart=always \
    --name=jenkins \
    jenkins/jenkins:latest-jdk8

此处使用的Jenkins版本是基于 JDK8 的最新版本,其他版本可参考Docker官网
3.查看是否启动成功

docker ps 

在这里插入图片描述

4.访问Jenkins
服务器IP+8888(此处为自己设定的映射端口,可更换)
查看密码:

cat /usr/local/jenkins/secrets/initialAdminPassword

5.选择安装推荐的插件,创建用户
用户名:root
密码:wangfei1234
Jenkins入门_第18张图片

Maven安装

  • Linux下安装
    1.下载Maven
    2.将apache-maven-3.6.3-bin.tar.gz上传到Linux服务器/usr/local/maven目录
    3.解压文件
tar zxvf apache-maven-3.6.3-bin.tar.gz 

4.配置阿里云镜像
修改/usr/local/maven/apache-maven-3.6.3/conf/settings.xml文件,在 标签下添加如下内容

	<mirror>
	<id>nexus-aliyun</id>
	<name>Nexus aliyun</name>
	<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
	<mirrorOf>central</mirrorOf>
	</mirror>

Jenkins入门_第19张图片

Git安装

  • Linux服务器安装
yum install -y git
插件安装
  • 安装Maven插件
    Jenkins入门_第20张图片
    Jenkins入门_第21张图片
    Jenkins入门_第22张图片
项目构建后配置

1.新建一个Item
Jenkins入门_第23张图片
2.创建任务
Jenkins入门_第24张图片
3.配置GitLab
Jenkins入门_第25张图片
4.配置Maven
Jenkins入门_第26张图片
Jenkins入门_第27张图片
5.配置项目的pom文件位置
Jenkins入门_第28张图片
获取配置
Jenkins入门_第29张图片
6.远程服务地址配置
安装Publish over SSH插件
Jenkins入门_第30张图片
配置服务器地址
Jenkins入门_第31张图片
配置全局服务器信息(此处配置的是全局的服务器,如果针对于某个任务进行配置,也需要先配置全局,在进行选择
Jenkins入门_第32张图片
为指定任务配置服务器
Jenkins入门_第33张图片
Jenkins入门_第34张图片
Jenkins入门_第35张图片

选择服务器
Jenkins入门_第36张图片
Jenkins入门_第37张图片

执行后效果
错误效果:
Jenkins入门_第38张图片
正确效果
Jenkins入门_第39张图片
切换到目标服务器的/usr/local/jenkins_project/usr/local/jenkins_project/target目录下就可以看到上传的文件
Jenkins入门_第40张图片
注:此处因为并没有配置Remove prefix所以传过去的是一个文件夹

配置前缀和命令
Jenkins入门_第41张图片运行命令中日志输出到指定文件

nohup java -jar /root/xxoo/demo*.jar >mylog.log 2>&1 &

此处的 >表示对日志进行覆盖写
>>表示对日志进行追加写
mylog.log是日志输出的文件
2>&1中的2表示标准错误输出,1表示标准输出,连起来就表示,将错误日志和标准日志全部输入到该文件中

访问项目

项目构建前配置

1.配置面板选择
Jenkins入门_第42张图片
2.填写shell脚本
Jenkins入门_第43张图片
创建脚本

vi test.sh

脚本内容:

#告诉执行器需要调用/bin/bash来执行当前脚本
#!/bin/bash

#删除first 文件夹历史数据
rm -rf first 

appname=$1
#echo 表示输出打印,"arg:$1" 表示打印的内容,相当于是用arg:这个变量拼接了一个变量进行打印,$1表示运行脚本时传入的第一个变量,例如
# 在linux中执行 ./test.sh aaa  命令时,此处的$1就是传入的aaa
echo "arg:$1"


#获取正在运行的jar包pid
#此处的pid是一个声明的变量,接收查找到的jar的pid便于后续执行kill命令
#此处的awk '{printf $2}'表示,打印ps -ef命令筛查出来的结果中的第二个变量,也就是pid
pid=`ps -ef | grep $1 | grep 'java -jar' | awk '{printf $2}'`
#输出当前声明的变量pid
echo $pid

#如果查找的pid为空,提示一下,否则,执行kill命令
#此处的if语句的书写格式为 if [ -z 变量];  注意中间的空格
#使用 -z 做空值判断
if [ -z $pid ];
#如果if中条件为真,就会进入then中的逻辑
        then
                echo "$appname not started"
#if中条件为假,就会进入else
        else
#杀死进程id为$pid的运行程序
               kill -9 $pid
#打印接收到的变量和字符串
                echo "$appname stoping...."
#用变量check 接收ps -ef命令精确匹配的结果
check=`ps -ef | grep -w $pid | grep java`
#判断check变量是否为空
if [ -z $check ];

        then
                echo "$appname pid:$pid is stop"
        else
                echo "$appname stop failed"
#当前if语句的结束语句
fi

#最外层if语句的结束语句
fi

linux执行脚本进行测试

./test.sh jenkins

在jenkins中配置执行命令
Jenkins入门_第44张图片

扩展

Jenkins可以在Git中的webhooks进行配置,从而实现每提交一次代码就构建一次任务,或者可以配置为合并代码时构建任务,每合并一次代码就会构建一次任务

几种常见构建方式

Jenkins入门_第45张图片

  • 快照依赖构建/Build whenever a SNAPSHOT dependency is built
    • 当依赖的快照被构建时执行本job
  • 触发远程构建 (例如,使用脚本)
    • 远程调用本job的restapi时执行本job
  • job依赖构建/Build after other projects are built
    • 当依赖的job被构建时执行本job
  • 定时构建/Build periodically
    • 使用cron表达式定时构建本job
  • 向GitHub提交代码时触发Jenkins自动构建/GitHub hook trigger for GITScm polling
    • Github-WebHook出发时构建本job
  • 定期检查代码变更/Poll SCM
    • 使用cron表达式定时检查代码变更,变更后构建本job
定时构建
  • Jenkins cron表达式

注:jenkins cron不是标准的cron表达式

cron解析地址

Jenkins入门_第46张图片
示例:
*/5 * * * *:每隔5分钟执行一次
*/5 2 * * *:每天2点开始每隔5分钟执行一次
*/5 2 1 6-8 *:每年的6到8月份的每天2点开始每隔5分钟执行一次
*/5 2 1 6-8,9-10*:每年的6到8月份或者9到10月份的每天2点开始每隔5分钟执行一次
*/5 * * * 2-6:从周二到周六每隔5分钟执行一次

解析:
/表示每隔多长时间,比如 */10 * * * * 表示 每隔10分钟

H表示hash散列值,以job名取值,获取到以job名为入参的唯一值,相同名称值也相同,这个偏移量会和实际时间相加,获得一个真实的运行时间

意义在于:不同的项目在不同的时间运行,即使配置的值是一样的,比如 都是15 * * * * ,表示每个小时的第15分钟开始执行任务,那么会造成同一时间内在Jenkins中启动很多job,换成H/15 * * * *,那么在首次启动任务时,会有随机值参与进来,有的会在17分钟启动 有的会在19分钟启动,随后的启动时间也是这个值。这样就能错开相同cron值的任务执行了。

H的值也可以设置范围

H * * * *表示一小时内的任意时间

*/10 * * * *每10分钟

H/10 * * * *每10分钟,可能是7,17,27,起始时间hash,步长不变

45 3 * * 1-6 每个周一至周六,凌晨3点45 执行1次

45 3-5 * * 1-6 每个周一至周六,凌晨3点45 ,凌晨4点45,凌晨5点45 各执行1次

H(40-48) 3-5 * * 1-6 在40~48之间取值 其他同上

45 3-5/2 * * 1-6 每个周一至周六,凌晨3点45 ,凌晨5点45 各执行1次

45 0-6/2 * * 1-6 * * 1-6 0点开始,每间隔2小时执行一次 0:45、2:45、4:45

你可能感兴趣的:(jenkins,运维)