Docker安装Jenkins部署springBoot项目

前言:

1、Jenkins实现打包部署项目是自动化运维部署的基本知识,本章只为学习之用,对熟悉Jenkins流程有一定的帮助。
2、生产上强烈不建议部署Jenkins到Docker容器,切记!

总体流程

1、Jenkins - 2、拉取githup中仓库代码 - 3、打包Maven项目为Docker镜像文件 - 4、上传到目标服务器 - 5、执行目标服务器内的shell脚本,启动Docke容器

安装jdk1.8.0_261到宿主机

此处我们把jdk1.8.0_261安装到/home/calebit/Desktop/soft/jdk18/目录下。

mkdir -p /home/calebit/Desktop/soft/jdk18/
cd /home/calebit/Desktop/soft/jdk18/

下载jdk过程略...

解压步骤略...

例:

unzip xxx.tar.gz
tar -zcxf xxx.tar.gz 

安装 maven3.6.3到宿主机

1、此处我们把maven3.6.3安装到/home/calebit/Desktop/soft/

mkdir -p /home/calebit/Desktop/soft/
cd /home/calebit/Desktop/soft/

2、解压步骤略...

3、配置maven中央仓库地址,进入本地maven解压目录的 配置文件conf目录:

cd /home/calebit/Desktop/soft/apache-maven-3.6.3/conf

4、由于maven默认中央仓库下载比较慢,我们可以更改maven仓库为阿里云中央仓库地址,我们可以 编辑 apache-maven-3.6.3/conf/settings.xml文件, 更改本地仓库地址和增加阿里云中央仓库地址:

cp settings.xml settings.xml_bak 
vim settings.xml 

打开localRepository节点,并且配置仓库目录/mydata/mavenRepository,localRepository 的配置,可以理解成是Maven下载远程仓库的jar包存放到本地仓库的路径,此处配置成/mydata/mavenRepository,后面我们可以通过增加挂载文件夹的方式,来和我们宿主机共享这个仓库。

/mydata/mavenRepository

在mirrors节点下增加以下内容



    
        alimaven
        central
        aliyun maven
        http://maven.aliyun.com/nexus/content/repositories/central/
    
   

此处为了jenkins打包时候不再去中央仓库拉取jar包,如果我们在我们自己的Idea中打包过我们要发布的SpringBoot项目的话,我们就可以把本地的maven仓库文件(全部文件)上传到宿主机/mydata/mavenRepository 目录下。这样Jenkins打包的时候,就不需要再次去中央仓库拉取需要的jar包了,加快了打包时间,拷贝过程略...


开启Docker Remote API

1、编辑 /lib/systemd/system/docker.service,在ExecStart后开启。

vim  /lib/systemd/system/docker.service 

找到 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 后面添加-H tcp://0.0.0.0:2375

。。。。。

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

。。。。。

2、重新加载配置文件

systemctl daemon-reload 
systemctl restart docker

3、关闭防火墙 或者 开启防火墙的端口

centos 开启防火墙端口:

#关闭防火墙  
systemctl stop firewalld.service 
# 禁止firewall开机启动 
systemctl disable firewalld.service 

# 或者允许固定端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent 
firewall-cmd --reload

ubantu 关闭防火墙

#关闭防火墙
sudo ufw disable
# 或者允许固定端口
sudo ufw allow 2375

#查看防火墙状态
sudo ufw status



以下正文开始...

Docker环境下安装Jenkins

本文自动拉取到的jenkins为Jenkins 2.249.1版本(2020年9月30日)。其他版本过低的话,可能初始化Jenkins插件的时候,会报一些版本过低的错误。会提示你升级Jenkins版本。

1、拉取最新的Jenkins的docker镜像

docker pull jenkins/jenkins:lts

2、 启动Jenkins容器

docker run -p 8080:8080 -p 50000:5000 --name jenkins \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-v /home/calebit/Desktop/soft/apache-maven-3.6.3:/maven/apache-maven-3.6.3 \
-v /home/calebit/Desktop/soft/jdk18/jdk1.8.0_261/:/jdk/jdk1.8.0_261 \
-v /mydata/mavenRepository:/mydata/mavenRepository \
-d jenkins/jenkins:lts

其中:
a、挂载目录/mydata/mavenRepository为后面需要用到的 maven 仓库地址
b、挂载目录/mydata/jenkins_home为 jenkins 安装配置文件地址
c、挂载目录/home/calebit/Desktop/soft/apache-maven-3.6.3 需提前下载好本地maven解压到宿主机/home/calebit/Desktop/soft/apache-maven-3.6.3目录
d、挂载目录/home/calebit/Desktop/soft/jdk18/jdk1.8.0_261/为 宿主机本地jdk目录。需提前下载解压到该目录

3、查看 jenkins初始密码(第一次访问jenkins需要用到这个管理员密码)

docker logs jenkins
## 本次测试,日志中的初始密码为:85d429ac39ee468e9d9d92776ee7c47f

配置jenkins

参考:https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247484270&idx=1&sn=92bc35f7568e061059e58af919e75bde&scene=21#wechat_redirect

1、访问 htttp://192.168.23.135:8080

 Please wait while Jenkins is getting ready to work ...
  Your browser will reload automatically when Jenkins is ready.

等待启动完成,会提示输入管理员密码。此密码通过以下命令查看。

docker logs jenkins 

2、输入日志里面获取的管理员密码:85d429ac39ee468e9d9d92776ee7c47f

3、首次进入jenkins需要下载推荐插件,点击左边第一项【安装推荐的插件】等待过程有点长,请耐心等待...
等待插件下载完成后,进入下一步。

4、创建一个管理员账号 admin / admin..

5、输入实例配置url:htttp://192.168.23.135:8080

6、配置【全局工具配置】
【首页】-【系统管理】-【全局工具配置】-【JDK】-【jdk安装】-【新增JDK】

JDK别名:jdk1.8
JAVA_HOME:/jdk/jdk1.8.0_261

(注意,此处若出现 xxxx is not a directory on the Jenkins master (but perhaps it exists on some agents) 请确保挂载目录是否出错,如果出错,请参考附录内第3条新增挂载目录),如果正确,此处可以不用勾选[自动安装]

同理。下拉该页面,配置 maven
【Maven】-【Maven安装】-【新增Maven】

Maven Name:Maven3.6.3
MAVEN_HOME:/maven/apache-maven-3.6.3

配置完毕,点击【保存】按钮保存。

7、安装ssh 插件
【首页】-【系统管理】-【插件管理】-【可选插件】里面搜索 和安装 Publish Over SSHSSH plugin插件,安装完毕,勾选重启jenkins ,重启即可。

8、配置【系统配置】

【首页】-【系统管理】-【系统配置】-【SSH remote hosts】-[SSH sites]新增加配置ssh登陆凭证
此步骤的主要作用是jenkins 打包镜像后,能够远程去登陆和执行脚本文件

Hostname:192.168.23.135(需要登陆的服务器)
Port:22(ssh登陆端口)
Credentials:登陆账号和密码(此处点击[添加]按钮增加一个)

9、配置【Publish over SSH】
【首页】-【系统管理】-【系统配置】-【Publish over SSH】-[SSH Servers]
SSH Server Name:192.168.23.135(随便起)
Hostname:192.168.23.135
Username:root
Remote Directory: /root
此处用密码登陆,需点击【高级】按钮,勾选【Use password authentication, or use a different key】
Passphrase / Password :root

编辑完成,点击【Test configuration】显示[success]即可,否则请验证密码

准备项目

主备一个SpringBoot项目,项目主要结构如下:

项目源码地址:https://github.com/liuxianzhong/jenkins-docker-demo

pom.xm


    org.springframework.boot
    spring-boot-starter-web


....



    com.spotify
    docker-maven-plugin
    1.0.0
    
        
            build-image
            package
            
                build
            
        
    
    
        docker-demo/${project.artifactId}:${project.version}
        http://192.168.23.135:2375
        java:8
        ["java", "-jar","/${project.build.finalName}.jar"]
        
        
            
                /
                ${project.build.directory}
                ${project.build.finalName}.jar
            
        
    


 

根据自己的IP更改 http://192.168.23.135:2375 这个IP

DockerController.java

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DockerController {
    static Log log = LogFactory.getLog(DockerController.class);

    @RequestMapping("/")
    public String index() {
        log.info("Hello Jenkins Docker!");
        return "Hello Jenkins Docker!";
    }

}

配置启动脚本:

新增 jenkins启动容器的脚本文件 jenkins-docker-demo.sh,到 /mydata/sh/目录下

mkdir -p /mydata/sh/
cd /mydata/sh/
vim jenkins-docker-demo.sh

加入以下内容,并且保存

#!/usr/bin/env bash
app_name='jenkins-docker-demo'
docker stop ${app_name}

echo ----stop container success ----
docker rm ${app_name}

echo ----rm container success ----

echo ----clear old images... -----

clearImagesList=$(docker images -f "dangling=true" -q)

if [ ! -n "$clearImagesList" ]; then
    echo "no images need  clean up."
else
    docker rmi $(docker images -f "dangling=true" -q)
    echo "clear old images success"
fi

docker run -p 8990:8990 --name ${app_name} \
-v /etc/localtime:/etc/localtime \
-v /home/developer/app/logs/:/home/developer/app/logs/ \
-d docker-demo/${app_name}:1.0.0

echo ----start container success----

该脚本的主要功能是,自动启动 我们的镜像。

需要赋予jenkins-docker-demo.sh脚本 可执行权限(很重要!,否则SpringBoot能打包上传成镜像,但可能启动不了容器):

chmod +x ./jenkins-docker-demo.sh

为了顺利启动Jenkins,(可能启动Jenkin时报错如下)(很重要!,否则可能启动不了容器):

touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?

这里是没有权限问题,需要执行:sudo chown -R 1000:1000 /mydata/jenkins_home

Jenkins新建项目

【首页】-【新建任务】-[输入一个任务名称] 下面输入:jenkins-docker-demo , 选择【构建一个自由风格的软件项目】后点击【确定】

[源码管理]-[git]:
Repositories:
Repository URL: https://github.com/liuxianzhong/jenkins-docker-demo.git (笔者可以自己搭建gitlab或者克隆该项目到自己的git仓库)
Credentials: (点击[添加]按钮添加自己的git登陆账号和密码)

【构建】-【增加构建步骤】-【调用顶层Maven目标】

Maven 版本:Maven3.6.3(此处下拉选择之前配置的Maven3.6.3)
目标:package clean

【构建】-【增加构建步骤】-【Execute shell script on remote host using ssh】
SSH site: 下拉选择之前配置的 [email protected]
Command:/mydata/sh/jenkins-docker-demo.sh(执行脚本路径)

构建

【首页】-【我的视图】-【jenkins-docker-demo】-【立即构建】
查看- [控制台输出] 内日志,提示

Successfully built 53900b85314d
Successfully tagged docker-demo/jenkins-docker-demo:1.0.0
[INFO] Built docker-demo/jenkins-docker-demo:1.0.0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  30.265 s
[INFO] Finished at: 2020-09-30T02:28:07Z
[INFO] ------------------------------------------------------------------------
[SSH] script:

/mydata/sh/jenkins-docker-demo.sh

[SSH] executing...
Error response from daemon: No such container: jenkins-docker-demo
Error: No such container: jenkins-docker-demo
----stop container success ----
----rm container success ----
----clear old images... -----
no images need  clean up.
50d4402203ef2041a80ad943183113cd9b357f558c1118bdf9044203e8721549
----start container success----

[SSH] completed
[SSH] exit-status: 0

Finished: SUCCESS

访问

访问 http://192.168.23.135:8990/
如果返回:

Hello Jenkins Docker!

则整个部署成功!!

后记:

一、本文章仅供学习之用,生产环境强烈不建议把jenkins部署成docker容器。

二、githup地址:https://github.com/liuxianzhong/jenkins-docker-demo

三、 动态添加挂载目录 到固定的容器id

此处演示把本地的/mydata/mavenRepository目录,挂载到jenkins容器的/mydata/mavenRepository
1、查询到 容器ID

docker ps -a 
#记录 containerID

2、停止docker

systemctl stop docker

3、编辑容器文件hostconfig.json

cd /var/lib/docker/containers/容器id
cp hostconfig.json hostconfig.json_bak
vim hostconfig.json

添加以下内容到节点Binds:[]

,"/mydata/mavenRepository:/mydata/mavenRepository"

:前为宿主机目录,:后为容器目录。

4、编辑容器文件config.v2.json

cp config.v2.json config.v2.json_bak
vim config.v2.json

添加以下内容到节点MountPoints:[]内(最好是格式化成一行,此处是为了好编辑)

,"/mydata/mavenRepository":{
    "Source": "/mydata/mavenRepository",
    "Destination": "/mydata/mavenRepository",
    "RW": true,
    "Name": "",
    "Driver": "",
    "Type": "bind",
    "Propagation": "rprivate",
    "Spec": {
        "Type": "bind",
        "Source": "/mydata/mavenRepository",
        "Target": "/mydata/mavenRepository"
    },
    "SkipMountpointCreation": false
}

5、重启docker

systemctl start docker

四、原文参考地址:

1、 https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247484270&idx=1&sn=92bc35f7568e061059e58af919e75bde&scene=21#wechat_redirect

五、对于自动化运维的东西还很多,目前主流的有K8s + Rancher + Jenkins/Jib的Idea插件+ Harbor + Git/GitLab(webhook:参考https://blog.csdn.net/qq_21768483/article/details/80177920)等等,学无止境。希望本文对正在学习的你有一点点帮助。

六、重复造轮子的工作毫无意义,站在巨人的肩膀上能让人看得更远,我们能做的就是学习、学习、再学习!来,干了这碗鸡汤!!














你可能感兴趣的:(Docker安装Jenkins部署springBoot项目)