一、宿主机准备

1.宿主机首先需要安装JDK,这里不演示了

2.宿主机需要安装docker,这里不演示了

二、安装jenkins及其插件并运行jenkins容器

1.下载jenkins

其他版本可以看https://hub.docker.com/

我之前就是docker pull jenkins下载的官方最新镜像,结果也只是2.60.3版本的,安装后很多插件无法安装,直接在jenkins界面点击升级jenkins后无法启动了 

后来决定不用官方镜像,使用:

docker pull jenkins/jenkins:lts

查看镜像

docker images | grep jenkins

 

查看该镜像中jenkins的版本

docker inspect 1920bf702d7d

 

这个镜像里面的Jenkins是2.263.1版本的

2.创建jenkins文件夹

mkdir /app/jenkins

3.启动jenkins

注意,我这里一直是root用户

为了防止权限问题,我使用了 -u 0

docker run -d -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true  -v /app/jenkins:/var/jenkins_home -u 0 jenkins/jenkins:lts

4.查看运行状态

docker ps

 

 

这表示成功启动

5.配置镜像加速

进入 cd /app/jenkins/ 目录

修改 vi  hudson.model.UpdateCenter.xml里的内容

修改前

将 url 修改为 清华大学官方镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

修改后

6.在浏览器访问并安装jenkins插件

http://172.20.10.8:8080

1.首次访问需要在该界面中输入管理员密码

由于我们启动的时候设置了文件夹挂载,我们直接可以在本地jenkins目录下查看密码

cat /app/jenkins/secrets/initialAdminPassword

 

如果没有设置挂载,查看密码的方式

docker exec jenkins/jenkins:lts cat /var/jenkins_home/secrets/initialAdminPassword

2.安装插件

可以安装推荐的插件,也能自定义

如果安装失败请看这篇https://www.cnblogs.com/miaokmm/p/11789119.html

建议常用的插件要安装:

https://www.cnblogs.com/zhanglianghhh/archive/2018/10/11/9770529.html

这里另外安装几个插件

Maven Integration

GitLab

 

Ansible

 

SaltStack

Parameterized Trigger

Build Pipeline

Publish Over SSH 

3.创建用户 

这里我只是测试,所有的账号密码都是设置的root

4.完成

其他常用命令

查看日志

docker logs jenkins

关闭容器

docker stop jenkins

删除容器

docker rm -v jenkins

三、jenkins容器内部安装jdk和maven、映射SSH

1.安装jdk

其实不用去jenkins容器里面安装jdk,就在宿主机安装(已经安装了),然后jenkins容器启动的时候把宿主机的jdk路径挂载进jenkins的容器中就行了,maven安装同理。

2.安装maven

其实不用去jenkins容器里面安装maven,就在宿主机安装,然后jenkins容器启动的时候把宿主机的maven路径挂载进jenkins的容器中就行了

宿主机安装maven

创建文件夹

mkdir -p /app/maven

下载安装包

cd /app/maven

wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

解压

tar -zxvf apache-maven-3.6.3-bin.tar.gz

修改配置文件settings.xml,使用了阿里云的Maven仓库 (可选)

cd /app/maven/apache-maven-3.6.3/conf

vi settings.xml

<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

添加环境变量

vi /etc/profile

export M2_HOME=/app/maven/apache-maven-3.6.3                                                                                                                                                                                           
export PATH=$PATH:${M2_HOME}/bin

source /etc/profile

验证是否安装成功

mvn -version

3.启动jenkins容器的时候挂载宿主机上JDK和MAVEN的路径

如果本来jenkins容器就启动起的需要docker stop jenkins        docker rm jenkins然后

docker run -d -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true  -v /app/jenkins:/var/jenkins_home -v /app/maven/apache-maven-3.6.3:/usr/local/maven -u 0 jenkins/jenkins:lts

4.jenkins界面配置maven和jdk路径

本来宿主机就安装了JDK,直接在启动jenkins容器的时候映射上去

docker run -d -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true  -v /app/jenkins:/var/jenkins_home -v /app/maven/apache-maven-3.6.3:/usr/local/maven -v /app/java/jdk1.8.0_221:/usr/local/java -u 0 jenkins/jenkins:lts

 

5.把宿主机的SSH映射到docker里面的jenkins的ssh

宿主机已经生成了RSA密钥

这里记得把自己的id_rsa.pub里面的内容加入到authorized_keys里面

docker run -d -p 8080:8080 -p 50000:50000 --name jenkins --privileged=true --restart=always  -v /app/jenkins:/var/jenkins_home -v /app/maven/apache-maven-3.6.3:/usr/local/maven -v /app/java/jdk1.8.0_221:/usr/local/java -v /root/.ssh:/root/.ssh -u 0 jenkins/jenkins:lts

6.配置publish over ssh

 系统管理--系统配置

这里是设置jenkins自己的RSA私钥地址和私钥内容

 

这里是设置jenkins会访问(推送jar包到)什么机器的IP,用户名,推送路径。

注意:这个Remote Directory是个根目录,要跟后面job里面的配置结合起来用

举例:将文件war包 拷贝到远程主机的  /usr/local  目录下
可以有两种写法
1.  jenkins SSH  中的Remote Derictory  配置为 /usr/
    Jenkins 配置中Post-build Actions步骤  中的Remote Derictory 配置为  local

 或者

2.  jenkins SSH  中的Remote Derictory  配置为 /
    Jenkins 配置中Post-build Actions步骤  中的Remote Derictory 配置为 /usr/local

四、jenkins配置关联gitlab及创建项目发布springboot项目

1.配置jenkins使用http方式拉去gitlab上的代码

这里的账号密码就是填写访问gitlab用的账号密码

2.新建job,使用publish over ssh发布

这里的目的是建立一个job,是用publicsh over ssh发布。

效果是Jenkins用publish over ssh把service1.jar 推送到node1上,把service2.jar推送到node2上,把service3.jar推送到node3上。

并且在node1 node2 node3上分别发布service1.jar service2.jar service3.jar 

配置

 

 这里的repository URL去gitlab上复制你要的项目的

而cerdentials就是第一步创建的用于访问gitlab的账号密码

 

 这里配置的意思就是构建好了jar包后,jenkins把jar包推送到node1机器上,并且在node1机器执行启动运行deploy_service1.sh发布文件

参数说明
Name:
“系统管理>系统设置”设置的SSH Sverver的名字列表。
Source files:
复制到运程机上的文件,相对workspace的路径,也支持表达式,如上图中的“**/*.war”。
Remove prefix:
文件复制时要过滤的目录,如上图中的target目录。
Remote directory:
文件得到到远程机上的目录,此目录是相对于“SSH Server”中的“Remote directory”的,如果不存在将会自动创建。
Exec command:
在这里可以填写在运程机器上执行的脚本

deploy_service1.sh发布文件是先就传到Node1的指定目录里面了,其实可以写在项目里面,这里用publish over ssh拷贝过去也行

内容

#!/bin/bash
tomcat_pid=`lsof -n -P -t -i:8095`
[ -n "$tomcat_pid" ] && kill -9 $tomcat_pid
sleep 5
nohup /app/java/jdk1.8.0_221/bin/java -jar /app/deploy/service1-1.0-SNAPSHOT.jar >> service1.log 2>&1 &

这个脚本是返回占用8095端口的进程ID,然后kill -9杀掉该进程,在启动新的进程。

这里注意,不知道为什么读不到java_home,java -jar的时候这个jave要写全路径,否则启动不起来。还有请先确认该机器又lsof命令,不然该脚本无法杀死占用8095端口的进程

把service2.jar推送到Node2上并且使用node2 /app/deploy上已有的deploy_service2.sh脚本启动service2.jar

deploy_service2.sh脚本内容是

#!/bin/bash
tomcat_pid=`lsof -n -P -t -i:8096`
[ -n "$tomcat_pid" ] && kill -9 $tomcat_pid
sleep 5
nohup /app/java/jdk1.8.0_221/bin/java -jar /app/deploy/service2-1.0-SNAPSHOT.jar >> service2.log 2>&1 &

把service3.jar推送到Node3上并且使用node3 /app/deploy上已有的deploy_service3.sh脚本启动service3.jar

deploy_service3.sh脚本内容是

#!/bin/bash
tomcat_pid=`lsof -n -P -t -i:8097`
[ -n "$tomcat_pid" ] && kill -9 $tomcat_pid
sleep 5
nohup /app/java/jdk1.8.0_221/bin/java -jar /app/deploy/service3-1.0-SNAPSHOT.jar >> service3.log 2>&1 &

保存

点击构建

 

启动成功以后访问一下node1

访问一下node2

172.20.10.9:8096/service2/test/select

访问一下node3

172.20.10.10:8097/service3/test/select

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐