一、目标

K8s环境下,使用jenkins自动化构建docker
使用yum方式安装的jenkins的默认工作目录/var/lib/jenkins/workspace

二、平台

[root@kahn.xiao ~]# uname -r
3.10.0-957.el7.x86_64
[root@kahn.xiao ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

各主机规划:
主机名          IP                       角色                       端口
k8s-master  10.100.100.11    master,node        api-server:8080
k8s-node1   10.100.100.12    node,jenkins       tomcat:8080
k8s-node2   10.100.100.13    node,gitlab          gitlab:80,8080

三、写dockerfile

1.隔两天没玩这东西有点懵了,回忆一下之前安装gitlab是在节点2服务器上,然后还在节点2服务器上推送测试代码到项目xk8s01,(参考帖子《K8S笔记-27-gitlab的安装和代码上传》https://blog.csdn.net/xoofly/article/details/104232583

2.到节点2服务器,进到项目目录

[root@k8s-node2 xgitlabcode]# cd /opt/xgitlabcode
[root@k8s-node2 xgitlabcode]# ls
index.html  kahn.html  songshuer.jpg

3.制作一个dockerfile
镜像用之前上传到私有库的那个nginx:1.13,然后添加当前目录下的所有文件到<镜像的/usr/share/nginx/html目录下>;

[root@k8s-node1 xdockerfile]# vim dockerfile
FROM 10.100.100.11:5000/NGINX:1.13
ADD . /usr/share/nginx/html

4.制作一个Git的忽略文件<.dockerignore>,避免将文件<dockerfile>上传到gitlab服务器

[root@k8s-node2 xgitlabcode]# vi .dockerignore 
dockerfile

5.将项目制作成镜像

[root@k8s-node2 xgitlabcode]# docker build -t kahnweb:v1 .
#注释: kahnweb是自定义镜像名,:V1是版本号, .代表当前目录

6.查询一下是否已经有这个镜像了

[root@k8s-node2 xgitlabcode]# docker images |grep kahnweb

7.利用刚才生成的镜像来启动成容器

[root@k8s-node2 xgitlabcode]# docker run -d -p 88:80 kahnweb:v1
#注释:运行容器,暴露端口88映射到容器的nginx80端口,镜像使用钢材制作的kahnweb:v1

8.查看容器是否启动成功

[root@k8s-node2 xgitlabcode]# docker ps |grep kahnweb
6bf0993a0ea3   kahnweb:v1    "nginx -g 'daemon ..."   18minutes ago    Up 18minutes   0.0.0.0:88->80/tcp   peaceful_thompson

9.使用物理机浏览器访问这个容器的nginx页面
浏览器访问:http://10.100.100.13:88/
浏览器访问:http://10.100.100.13:88/kahn.html
浏览器访问:


10.提交代码到gitlab仓库

#添加当前目录下的所有文件
[root@k8s-node2 xgitlabcode]# git add .
#将暂存区的所有文件提交到本地库
[root@k8s-node2 xgitlabcode]# git commit -m "first update by kahn 202002102343"
#将本地库的代码推送到远程master分支上
[root@k8s-node2 xgitlabcode]# git push -u origin master
#接下来会提示让输入gitlab的用户名:root,再输入密码。

11.在Gitlab上代码库是否已更新
回到gitlab页面http://10.100.100.13/,找到项目xk8s01项目,看下已经有刚才创建的那两个代码上传上来了。(感觉那个.dockerignore没起作用,估计写的有问题)

四、使用jenkins自动化构建docker

1.打开jenkins,找到上一次创建的jenkins项目<kahn01-freestyle>,然后点【配置】

2.在【构建】区域中的【执行 shell】中写两行内容(本次只保留两行)

docker build -t 10.100.100.11:5000/kahnweb:v1 .
docker push 10.100.100.11:5000/kahnweb:v1

3.第一次构建docker(失败了)
回到jenkins项目主页,然后点【立即构建】。
Duang》。。执行失败了,看看下面这段提示【+ docker build -t 10.100.100.11:5000/kahnweb:v1 . Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post 】,猜测是jenkins没有权限执行docker命令。再猜测一下使用yum方式安装的jenkins的默认启动账号是自动创建的jenkins,所以服务器系统账号jenkins是无法执行docker命令的。

4.解决jenkins执行构建docker时报权限被拒绝的问题。
方法1:修改jenkins的启动账号为root

[root@k8s-node1 ~]# sed -i 's#JENKINS_USER="jenkins"#JENKINS_USER="root"#' /etc/sysconfig/jenkins
[root@k8s-node1 ~]# systemctl restart jenkins

方法2:修改/etc/sudoers文件,让jenkins拥有执行所有命令的权限(不过这挺危险,最后只允许它执行特定的命令,如docker build...)

[root@k8s-node1 jenkins]# vim /etc/sudoers
#将下面一行内容加到【root    ALL=(ALL)       ALL】这行下面,然后wq!强制保存退出
jenkins ALL=(ALL)       ALL 

 

方法3:网上有网友说把jenkins的代码目录的属主改成jenkins,看起来不是太靠谱,就没试。

5.再次使用jenkins构建docker镜像,并推送代码到私有docker仓库(成功了)

6.验证一下是否将镜像推送到了私有仓库

[root@k8s-node1 jenkins]# docker images |grep kahnweb
#10.100.100.11:5000/kahnweb              v1                  383e2eee3a37        30 minutes ago      109 MB

五、使用jenkins自动化构建docker可变化版本号的镜像

接着上面的操作。

1.修改jenkins项目中的【构建】,
之前构建的主要代码中的v1改成v$BUILD_ID,如下所示:
【docker build -t 10.100.100.11:5000/kahnweb:v$BUILD_ID .】
【docker push 10.100.100.11:5000/kahnweb:v$BUILD_ID】
这样做的目的就是,每当我们执行构建的时候,就让docker的镜像版本号也变化一下(不变化的话怎么实现代码的更新呢?),这个$BUILD_ID貌似就是jenkins构建时的状态球前的序号。
点【保存】。

2.构建刚才修改后的jenkins项目
回到jenkins项目主页,然后点【立即构建】,正常的话项目会执行成功,下方有个蓝球,点一下它旁边的三角,然后再点【控制台输出】,这样是为了我们接下来看构建的详细过程。

在控制台输出的日志里,我们发现【docker build -t 10.100.100.11:5000/kahnweb:v16 .】的版本号正好就是执行构建jenkins项目的序号,这正是我们想要的结果。
也由此得出结论:$BUILD_ID就是jenkins构建的序号。

3.再回到docker私有库上看一下镜像是否被推送上来了,而且版本是v16. 

[root@k8s-master ~]# ls /opt/myregistry/docker/registry/v2/repositories/kahnweb/_manifests/tags/

=====================================================================================
4.实现较完美的jenkins自动化构建docker镜像(若gitlab上的代码没变化,那及时你点构建也是调过的,直到gitlab上代码发生变化,那么jenkins构建项目才会执行构建的动作)
打开jenkins的本次项目,然后配置项目【构建】【执行shell】,在命令文本框中输入以下内容,最后点保存。

#!/bin/bash
if [ $GIT_PREVIOUS_SUCCESSFUL_COMMIT == $GIT_COMMIT ];then
    echo "code no change, skip build"
    exit 0
else
    docker build -t 10.100.100.11:5000/kahnweb:v$BUILD_ID .
    docker push 10.100.100.11:5000/kahnweb:v$BUILD_ID
    echo "kahn, The code has chaged and the build was successful !"
fi


5.然后再去jenkins上构建一次本项目
看本次构建的输出结果,日志中显示【code no change, skip build .Finished: SUCCESS】,这正是我们要的效果。

6.去gitlab服务器上(实际无所谓你在哪个主机上)去修改并提交之前项目的代码

[root@k8s-node2 xgitlabcode]# echo "Hello kahn, with jenkis auto build docker image, 2020-02-11_17-26" >/opt/xgitlabcode/index.html
[root@k8s-node2 xgitlabcode]# git add .
[root@k8s-node2 xgitlabcode]# git commit -m "第二次提交代码,让jenkins去自动构建docker镜像"
[root@k8s-node2 xgitlabcode]# git push -u origin master

7.再回到jenkins上【立即构建】一次本项目

8.可再去主控节点上的docker私有库上看是否有新的docker镜像版本号生成

非常完美!2020年2月11日17:36:00

----------------------------------------------------------------------------------------------------------------------------------------------

虽然我也是个屌丝,但写博客真的不容易,愿意公开的没坑的博客更是不多,希望我的帖子对你有用。
我这里贴个支付宝的二维码(抵制辣鸡麻花疼wx),随意打赏,谢谢各位看官!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐