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.安装依赖

bash 复制代码
sudo yum install -y curl policycoreutils-python openssh-server perl
sudo systemctl enable sshd
sudo systemctl start sshd

2.配置镜像

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

3.开始安装

bash 复制代码
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 密码通过以下命令进行查看

bash 复制代码
cat /etc/gitlab/initial_root_password

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

5.gitlab常用命令

bash 复制代码
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                   # 查看日志;

1.拉取镜像并运行

bash 复制代码
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.查看是否启动成功

bash 复制代码
docker ps -a


注:如果未启动可以使用如下命令进行启动

bash 复制代码
docker start gitlab

3.登录

使用步骤1当中配置的IP进行访问,http://192.168.44.103,同理,如果访问不到可以稍微等一会,尝试再次刷新

账号:root

密码查看,进入容器内部

bash 复制代码
docker exec -it  gitlab /bin/bash

查看存储密码的文件

bash 复制代码
cat /etc/gitlab/initial_root_password

4.修改密码

此处将密码设置为wangfei1234

使用

1.创建一个仓库

2.新建项目

3.将本机地项目上传到仓库






Jenkins安装

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

检索可用包

bash 复制代码
yum search java|grep jdk

安装JRE

bash 复制代码
yum install java-1.8.0-openjdk

安装JDK

bash 复制代码
yum install -y java-devel

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

bash 复制代码
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 挂载目录

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

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

bash 复制代码
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.查看是否启动成功

bash 复制代码
docker ps 

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

查看密码:

bash 复制代码
cat /usr/local/jenkins/secrets/initialAdminPassword

5.选择安装推荐的插件,创建用户

用户名:root

密码:wangfei1234

Maven安装

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

4.配置阿里云镜像

修改/usr/local/maven/apache-maven-3.6.3/conf/settings.xml文件,在 <mirrors> 标签下添加如下内容

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

Git安装

  • Linux服务器安装
bash 复制代码
yum install -y git
插件安装
  • 安装Maven插件


项目构建后配置

1.新建一个Item

2.创建任务

3.配置GitLab

4.配置Maven

5.配置项目的pom文件位置

获取配置

6.远程服务地址配置

安装Publish over SSH插件

配置服务器地址

配置全局服务器信息(此处配置的是全局的服务器,如果针对于某个任务进行配置,也需要先配置全局,在进行选择

为指定任务配置服务器


选择服务器

执行后效果

错误效果:

正确效果

切换到目标服务器的/usr/local/jenkins_project/usr/local/jenkins_project/target目录下就可以看到上传的文件

注:此处因为并没有配置Remove prefix所以传过去的是一个文件夹

配置前缀和命令
运行命令中日志输出到指定文件

bash 复制代码
nohup java -jar /root/xxoo/demo*.jar >mylog.log 2>&1 &

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

访问项目

项目构建前配置

1.配置面板选择

2.填写shell脚本

创建脚本

bash 复制代码
vi test.sh

脚本内容:

bash 复制代码
#告诉执行器需要调用/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执行脚本进行测试

bash 复制代码
./test.sh jenkins

在jenkins中配置执行命令

扩展

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

几种常见构建方式

  • 快照依赖构建/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解析地址

示例:
*/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

相关推荐
pyliumy几秒前
rsync 全网备份
linux·运维·服务器
苹果醋322 分钟前
SpringCloud系列之一---搭建高可用的Eureka注册中心
运维·nginx
诚诚k28 分钟前
docker存储
运维·docker·容器
ggb199932 分钟前
【python的坑】vpn下,python request报错 check_hostname requires server_hostname
linux·运维·服务器
-SGlow-1 小时前
Linux相关概念和重要知识点(4)(自举、vim)
linux·运维·vim
卑微的码蚁1 小时前
服务器相关问题
运维·服务器
博洋科技1 小时前
网站建设的服务器该如何选择?
运维·服务器·网站建设·保定响应式网站建设·保定h5网站建设·保定网站建设
人类群星闪耀时1 小时前
服务器管理:从零开始的服务器安装与配置指南
运维·服务器
NiNg_1_2342 小时前
使用Docker Compose一键部署
运维·docker·容器
萠哥啥都行2 小时前
Linux安装Docker以及Docker入门操作
运维·docker·容器