Jenkins自动构建镜像并且发送钉钉通知

部署流程图

把k8s引入到整个部署的自动化流程如下图:
akb48

上图已经说的很明白了,但是结合到我公司的内部情况,再加一点文字的解释:

  1. 运维做一个前端页面,上面提供一些关键词作为变量传入;
  2. 开发将代码上传到svn或者gitlab,进行jira通知,如果是svn的话,jenkins将新代码打包成zip文件,启动jenkins把windows的zip包上传到阿里云云存储上;如果是到gitlab,就不用打包成zip了,直接就把包传到云存储上;
  3. Gitlab/Svn通过webhook通知jenkins去挂载云存储bucket的文件夹里,并且根据对应的dockerfile进行build成镜像,然后再把镜像推送到云镜像仓库里,推送成功后,Jenkins发送一个钉钉成功的通知;
  4. Jinkens针对本次镜像和实际部署内容再搭配上之前传递进来的变量,构建一个yaml文件;
  5. 通过create这个yaml文件,启动对应的services来达到用户访问的目的,此时Jenkins再发一条钉钉通知,整个部署流程结束。

环境说明

Jenkins:2.124,jenkins与docker在同一台云服务器上,并且确定这个机器上可以顺利login到阿里云的私有仓库
云存储:阿里云OSS
Gitlab:10.7.3
镜像仓库:阿里云容器镜像仓库
钉钉:4.5.5

Jinkens安装钉钉插件

既然要让jenkins调用钉钉发送成功消息,那么就需要把jenkins跟钉钉结合在一起。至于怎么配自定义钉钉机器人,请看钉钉的官方文档:https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.karFPe&treeId=257&articleId=105735&docType=1 。而jenkins里也是有官方的钉钉插件,界面系统管理管理插件,然后搜索“dingding”,安装即可,如图:
akb48

插件安装完毕之后,重启jenkins即可。

挂载阿里云存储

阿里云官方挂载云存储的方法是ossfs,登陆到jenkins所在的服务器(centos 7.4)里,步骤如下:

1
2
3
4
5
6
wget https://github.com/aliyun/ossfs/releases/download/v1.80.5/ossfs_1.80.5_centos7.0_x86_64.rpm
yum localinstall ossfs_1.80.5_centos7.0_x86_64.rpm #这一步安装可能会比较慢
echo 需要挂载的bucket名:云存储对应ak:云存储对应sk > /etc/passwd-ossfs #将云存储的ak,sk写入到文件里
chmod 640 /etc/passwd-ossfs
mkdir /tmp/ossfs #创建挂载文件
ossfs 需要挂载的bucket名 /tmp/ossfs -ourl=http://oss-cn-hangzhou-internal.aliyuncs.com #如果不是阿里云就要用外网的endpoint

操作的效果如下,我挂载的bucket叫ligentest,毕竟代码是高度机密,bucket属性设置是私有,256T的容量爽爽的:
akb48

配置任务

在jenkins里创建一个新的工程,取名叫“构建镜像并且上传到云仓库”。“gitlab更新就触发jenkins”的配置内容可以参考 https://rorschachchan.github.io/2018/05/25/Gitlab-Jenkins搭建持续集成系统/ 一文进行操作。

配置正确jenkins与gitlab各自的webhook,测试提交能返回200之后。就要配置构建构建后操作

构建选择执行shell,里面填写这样一个命令:sudo sh /docker/pushimage.sh,也就是运行一个脚本,脚本内容如下:

1
2
3
4
5
6
7
8
#!/bin/bash
#这个脚本用来推送最新的镜像去阿里云镜像仓库

version=$(date +20%y%m%d) #用当前日期作为version
docker build -f /docker/chenpyfile -t chentest/python:$version . #先本地构建镜像
image_id=$(docker images | awk '{print $3}' | sed -n '2p') #获取image的id号
docker tag $image_id registry.cn-hangzhou.aliyuncs.com/lechangetest/chentest:$version #给本地的镜像打一个tag
docker push registry.cn-hangzhou.aliyuncs.com/lechangetest/chentest:$version #推送到阿里云对应的仓库去

构建后操作选择钉钉通知器配置jenkins URL一栏应该默认填好的,即jenkins的网址;钉钉access token这一栏就是直接填机器人的那个access token,然后选择根据什么情景机器人触发通知,如图:
akb48

触发验证

首先要确认jenkins用户能否正常使用docker命令,方法就是修改一下/etc/sudoers添加jenkins这个用户即可。

这次测试,我们就不搞nginx那种静态页面了,换一个python在后台运行的例子。首先,准备一个叫time.py的脚本,这个脚本很简单,就是不断的输出当前时间的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python
#coding=utf-8
import time

def get_time():
localtime = time.asctime( time.localtime(time.time()) )
print ("本地时间为 :", localtime) #python的dockerfile用的是latest,python3是要求有括号的

if __name__ == '__main__':
while True:
get_time()
time.sleep(1)

对应的dockerfile叫chenpyfile,如下:

1
2
3
4
5
6
7
8
9
10
11
12
############################################################
# Dockerfile to build A python container images #
# Based on Python #
############################################################
FROM python:latest
MAINTAINER ChrisChan "Chris@jjfjj.com"
RUN apt-get update && \
apt-get install -y vim && \
apt-get install -y procps
RUN mkdir -p /root/app
COPY /script/ /root/script #把上面那个脚本拷贝到容器里,当然挂载也可以
CMD ["python", "/root/script/time.py"] #这里不要写“python /root/script/time.py”,注意前后台问题

这个dockerfile在本地测试构建镜像是完全没问题的,然后触发一下git push,就会看到钉钉机器人启动了:
akb48

构建完毕之后,机器人也会给一个成功的标志,然后去阿里云的云仓库一看,嗯,果然已经推送过来了!如图:
akb48

docker run -dit --name chen-pytest registry.cn-hangzhou.aliyuncs.com/lechangetest/chentest:20180831,也能看到新创建的镜像是可以启动的:
akb48

至此整个“Jenkins自动构建镜像并且发送钉钉通知”部分就结束了。

参考资料

https://jimmysong.io/posts/kubernetes-jenkins-ci-cd/
https://help.aliyun.com/document_detail/32196.html
http://www.cnblogs.com/jianxuanbing/p/7211006.html

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------