Jenkins

简介

Jenkins 是一个流行的开源持续集成和持续交付工具,它可以帮助开发人员自动化构建、测试和部署软件项目。Jenkins 可以与许多不同的工具和技术集成,包括 Git、Docker 和 Kubernetes 等。
使用 Jenkins,可以轻松设置自动化构建和测试管道,以确保代码始终处于可部署状态。可以使用 Jenkins 的插件扩展其功能,以满足某些特定需求。Jenkins 还提供了丰富的可视化和报告功能,便于轻松地跟踪项目的进度和质量。

版本要求

Jenkins 宣布:从 6 月 28 日发布的 Jenkins 2.357 和即将发布的 9 月 LTS 版本开始,Jenkins 最低需要 Java 11,所以jdk最低要安装到11。不过我下载的Jenkins是2.346.2版本,支持使用Java8,tomcat是8.5.39版本。

一、Jenkins安装

0、安装 jdk,最少1.8版本

参考:JDK1.8安装

1、开通子账户

使用子账户可以限制 Jenkins 服务器上的用户权限,从而减少潜在的安全风险。通过使用子账户,可以将最小特权原则应用于 Jenkins 服务器上的用户,确保他们只能访问他们需要的资源。

groupadd jenkins

# 创建用户,指定用户组,-m自动创建登录目录,-g指定用户组
useradd -m -g jenkins jenkins

# 给jenkins用户设置密码,回车后,输入两次密码,设置为:jenkins@123
passwd jenkins
2、安装Jenkins

使用tomcat启动jenkins.war 或者 直接使用 java -jar jenkins.war --httpPort=9090 启动。

先安装tomcat

先解压

tar -zxvf apache-tomcat-8.5.39.tar.gz
# 或者解压到指定路径下
tar -zxvf apache-tomcat-8.5.39.tar.gz -C  /usr/local/soft/

备份webapps目录,删除webapps下全部文件

cd /usr/local/soft/tomcat-8.5.39
cp -r webapps webapps-bak
cd  webapps
rm -rf ./*
安装jenkins

下载 jenkins.war 到tomcat的webapps目录下

cd /usr/local/soft/tomcat-8.5.39/webapps

wget http://updates.jenkins-ci.org/download/war/2.387.3/jenkins.war

更改文件或目录的所有者

chown -R jenkins:jenkins /usr/local/soft/tomcat-8.5.39/

启动tomcat

cd /usr/local/soft/tomcat-8.5.39/bin

./startup.sh
3、访问Jenkins

默认的端口是8080
http://ip:8080
在这里插入图片描述
首次登录需要先获取管理员密码,进行登录。

cat /home/jenkins/.jenkins/secrets/initialAdminPassword
4、初始化

在这里插入图片描述
这里推荐点击“选择插件来安装”,然后下一个界面把勾选的插件全部取消掉,先进入系统,后面再根据自己的情况安装合适的插件。

5、创建管理员账号、访问地址

在这里插入图片描述
设置访问地址
在这里插入图片描述
在这里插入图片描述

6、安装插件

安装之后重启jenkins。
Maven Integration
Git
SSH
Docker

二、Jenkins所需软件

Maven安装
1、下载&解压

apache-maven-3.6.1-bin.tar.gz

2、修改配置文件,添加阿里仓库

修改 vim settings.xml

<mirror>
	<id>alimaven</id>
	<name>aliyun maven</name>
	<url>https://maven.aliyun.com/repository/public/</url>
	<mirrorOf>*</mirrorOf>
</mirror>
3、配置环境变量

配置环境变量 vim /etc/profile

export MAVEN_HOME=/usr/local/soft/apache-maven-3.6.1
export PATH=$MAVEN_HOME/bin:$PATH

重新加载环境配置

source /etc/profile
4、测试是否安装成功
mvn -v

在这里插入图片描述

Git安装
yum install -y git
生成秘钥
# 生成密钥
ssh-keygen -t rsa -C "email@163.com" 

将公钥添加到Git仓库

# 查看公钥
cat ~/.ssh/id_rsa.pub

将私钥添加到Jenkins的凭证

# 查询SSH私钥
cat ~/.ssh/id_rsa

三、Jenkins配置

1、全局工具设置(Global Tool Configuration)

Manage Jenkins --> System Configuration --> Global Tool Configuration
在这里插入图片描述
需要在这里配置 Maven、JDK、Git、Node.js 等的目录位置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如何查看Git的安装路径

安装路径可能会忘,可以使用以下命令查看安装路径。

# 使用 which 命令查看
which git
2、管理凭据(Manage Credentials)

Manage Jenkins --> Security --> Manage Credentials
在这里插入图片描述
如果想使用Git来管理项目,就必须要进行此步骤。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将私钥添加到Jenkins的凭证

# 查询SSH私钥
cat ~/.ssh/id_rsa

在这里插入图片描述
在这里插入图片描述

3、远程服务器SSH配置
场景

1、Publish Over SSH 插件是通过SSH连接远程服务器,可以远程执行Shell命令或传输文件。
2、有两种验证方式,密码方式和秘钥方式。
3、前置条件:需要安装 Public over SSH 插件。

1、密码验证方式

位置:Jenkins --> 系统管理 --> 系统配置 --> Publish over SSH
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、Jenkins+Git+Maven构建项目

1、新建Maven项目

在这里插入图片描述
在这里插入图片描述

2、项目配置

在这里插入图片描述
可能会报错,无法连接。测试Git秘钥是否配置成功
解决后为下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
需要配置maven的构建命令:

clean package -Dmaven.test.skip=true

注意:Jenkins在使用maven打包的时候,命令上是不需要带mvn的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Execute shell中是构建成功后,需要执行的脚本。
在这里插入图片描述
构建成功之后,执行脚本,实际中应该通过ssh执行远程服务器的脚本。
脚本内容如下:

#!/bin/bash
BUILD_ID=DONTKILLME
source /etc/profile;
jenkins_workspace=${WORKSPACE};
jar_path="$jenkins_workspace/target/jenkins-demo-1.0.0.jar";
echo 'jenkins_workspace is '  $jenkins_workspace;
echo 'jar_path is '  $jar_path;
pid=`ps -ef|grep jenkins-demo-1.0.0.jar| grep -v grep | awk '{print $2}'`
echo "部署前的pid进程 :$pid"
# 关闭已经启动的jar进程
if [ -n "$pid" ]
  then
    kill -9 $pid
else
    echo "进程没有启动"
fi
sleep 1s
cp $jar_path /home/jenkins/code/jenkins-demo-1.0.0.jar
cd /home/jenkins/code
nohup java -jar /home/jenkins/code/jenkins-demo-1.0.0.jar >/home/jenkins/code/logs/jenkins-demo.log 2>&1 &
echo "脚本执行完毕"
sleep 5s
pid=`ps -ef|grep jenkins-demo-1.0.0.jar | grep -v grep | awk '{print $2}'`
# 检验进程是否启动
if [ -n "$pid" ]
  then
        echo "部署后的pid进程 :$pid"
                echo "启动成功"
else
    echo "进程没有启动"
fi

配置好之后就应用保存配置。
下一步启动该任务
在这里插入图片描述
点击 Build Now之后,页面往下拉,会有构建历史记录,选择当前记录,可以查看修改代码修改记录、jenkins构建时的控制台输出等信息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这时,使用 jenkins 构建与启动项目已经完成了。

3、优化:将脚本放到服务器上

可以将构建成功后执行的脚本写到本地的服务器上,jenkins上只需要执行本地的脚本即可。
在这里插入图片描述

#!/bin/bash
sh /home/jenkins/code/jenkins-demo-start.sh

在 /home/jenkins/code 目录下创建 jenkins-demo-start.sh,脚本中的内容就是原来jenkins上的脚本内容,如下:

#!/bin/bash
BUILD_ID=DONTKILLME
source /etc/profile;
jenkins_workspace=${WORKSPACE};
jar_path="$jenkins_workspace/target/jenkins-demo-1.0.0.jar";
echo 'jenkins_workspace is '  $jenkins_workspace;
echo 'jar_path is '  $jar_path;
pid=`ps -ef|grep jenkins-demo-1.0.0.jar| grep -v grep | awk '{print $2}'`
echo "部署前的pid进程 :$pid"
# 关闭已经启动的jar进程
if [ -n "$pid" ]
  then
    kill -9 $pid
else
    echo "进程没有启动"
fi
sleep 1s
cp $jar_path /home/jenkins/code/jenkins-demo-1.0.0.jar
#修改文件权限
chmod 755 /home/jenkins/code/jenkins-demo-1.0.0.jar
cd /home/jenkins/code
nohup java -jar /home/jenkins/code/jenkins-demo-1.0.0.jar >/home/jenkins/code/logs/jenkins-demo.log 2>&1 &
echo "脚本执行完毕"
sleep 5s
pid=`ps -ef|grep jenkins-demo-1.0.0.jar | grep -v grep | awk '{print $2}'`
# 检验进程是否启动
if [ -n "$pid" ]
  then
        echo "部署后的pid进程 :$pid"
                echo "启动成功"
else
    echo "进程没有启动"
fi

赋予可执行权限

chmod +x /home/jenkins/code/jenkins-demo-start.sh

之后在 Jenkins上build任务即可。

五、Jenkins+docker构建项目

流程为:Jenkins拉取代码 --> 本地编译并构建镜像 --> 删除旧镜像并运行新镜像。

安装docker后,开通docker子账户

# 安装docker之后,应该已经存在了,直接建用户即可,且该组下的用户具有使用docker的权限
groupadd docker

# 创建用户,指定用户组,-m自动创建登录目录,-g指定用户组
useradd -m -g docker docker

# 给用户设置密码,回车后,输入两次密码,设置为:docker@123
passwd docker
1、创建Maven项目并配置

在这里插入图片描述
在这里插入图片描述
需要配置maven的构建命令:

clean package -Dmaven.test.skip=true

注意:Jenkins在使用maven打包的时候,命令上是不需要带mvn的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
脚本内容如下:

#!/bin/bash
BUILD_ID=DONTKILLME
source /etc/profile;
jenkins_workspace=${WORKSPACE};
# dockerfile的原路径
dockerfile_source_path="$jenkins_workspace/Dockerfile";
# dockerfile的新路径
dockerfile_path="/home/jenkins/code/docker-demo/Dockerfile";
# jar的原路径
jar_source_path="$jenkins_workspace/target/docker-demo-1.0.0.jar";
# jar的新路径
jar_parh="/home/jenkins/code/docker-demo/docker-demo.jar";

cp -f $dockerfile_source_path $dockerfile_path
cp -f $jar_source_path $jar_parh
cd /home/jenkins/code/docker-demo/

# 停止正在运行的容器
containId=$(sudo docker ps| grep docker-demo| grep -v grep | awk '{print $1}') 
if [ -n "$containId" ]
  then
    sudo docker stop $containId
  else
    echo "容器没有运行"
fi

# 删除容器
containId2=$(sudo docker ps -a| grep docker-demo| grep -v grep | awk '{print $1}') 
if [ -n "$containId2" ]
  then
    sudo docker rm $containId2
  else
    echo "容器不存在"
fi

# 删除镜像
imageId=$(sudo docker images| grep docker-demo| grep -v grep | awk '{print $3}')
if [ -n "$imageId" ]
  then
    sudo docker rmi -f $imageId
  else
    echo "镜像不存在"
fi

# 构建镜像并运行
sudo docker build -t docker-demo:dev .
sudo docker run -it -d --name docker-demo -m 256M -p 9602:9602 docker-demo:dev

构建项目

可能遇到的错误一

点击build后,可能会出现该错误:该用户无权限执行docker。
在这里插入图片描述
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/docker-demo:dev/stop”: dial unix /var/run/docker.sock: connect: permission denied
该用户没有执行docker的权限,首先查看docker.sock的权限

ls -l /var/run/docker.sock

在这里插入图片描述
所有者是root,组是docker,因此我们当前用户如果不是root或者docker组就无法连接docker的sock进行操作。
解决方案
将当前用户username添加到docker组。使用root用户登录后,操作以下命令:

# usermod -g 用户组 用户名
usermod -g docker jenkins
3、优化:使用远程服务器

使用harbor仓库优化流程。流程改为:Jenkins拉取代码 --> 本地编译并构建镜像 --> 将镜像上传harbor仓库 --> jenkins远程登录生产服务器 --> 拉取镜像并运行。

jenkins添加Harbor的访问凭证

Manage Jenkins --> Security --> Manage Credentials
在这里插入图片描述

添加SSH

Manage Jenkins --> System Configuration --> System Configuration
在这里插入图片描述
在这里插入图片描述

修改项目的配置信息

第一步:构建镜像并推送到Harbor
在这里插入图片描述
脚本内容如下:

#!/bin/bash
BUILD_ID=DONTKILLME
source /etc/profile;
jenkins_workspace=${WORKSPACE};
# dockerfile的原路径
dockerfile_source_path="$jenkins_workspace/Dockerfile";
# dockerfile的新路径
dockerfile_path="/home/jenkins/code/docker-demo/Dockerfile";
# jar的原路径
jar_source_path="$jenkins_workspace/target/docker-demo-1.0.0.jar";
# jar的新路径
jar_parh="/home/jenkins/code/docker-demo/docker-demo.jar";

cp -f $dockerfile_source_path $dockerfile_path
cp -f $jar_source_path $jar_parh
cd /home/jenkins/code/docker-demo/

# 停止正在运行的容器
containId=$(sudo docker ps| grep docker-demo| grep -v grep | awk '{print $1}') 
if [ -n "$containId" ]
  then
    sudo docker stop $containId
  else
    echo "容器没有运行"
fi

# 删除容器
containId2=$(sudo docker ps -a| grep docker-demo| grep -v grep | awk '{print $1}') 
if [ -n "$containId2" ]
  then
    sudo docker rm $containId2
  else
    echo "容器不存在"
fi

# 删除镜像
imageId=$(sudo docker images| grep docker-demo| grep -v grep | awk '{print $3}')
if [ -n "$imageId" ]
  then
    sudo docker rmi -f $imageId
  else
    echo "镜像不存在"
fi

# 构建镜像并运行
sudo docker build -t docker-demo:dev .
# 标记镜像
sudo docker tag docker-demo:dev 121.37.10.65:80/dev/docker-demo:dev
# 登录Harbor
sudo docker login 121.37.10.65:80 -u admin -p Harbor12345
# 推送镜像
sudo docker push 121.37.10.65:80/dev/docker-demo:dev

第二步:远程服务器拉取镜像并运行
在这里插入图片描述
不用理会SSH Site not specified, 这可能是一个BUG,实际能连接。

sh /home/docker/docker-run.sh

docker-run.sh 文件要有执行权限
脚本中的内容如下:

#!/bin/bash
docker login 121.37.10.65:80 -u admin -p Harbor12345
docker pull 121.37.10.65:80/library/docker-demo:dev
docker run -it -d --name docker-demo -m 256M -p 9602:9602 docker-demo:dev

保存后构建项目。
在这里插入图片描述
此时所有的步骤已经全部完成了。其中还是有一些需要优化的地方,比如执行脚本的地方。有不足之处欢迎指出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值