##初探在容器上构建持续部署( 二 )


下面我们通过一个具体的实例来展示如何完成持续部署 。 我们用Jenkins来做为持续部署工具 , 用它部署一个Go程序到k8s环境 。
我们的流程基本是上面讲的狭义流程 , 但由于没有Nexus , 我们稍微变通了一下 , 改由从源码库直接下载源程序 , 步骤如下:
下载源码:从github下载源代码到Jenkins的运行环境
测试:这一步暂时没有实际内容
生成镜像:创建镜像 , 并上传到Docker hub 。
部署镜像:将生成的镜像部署到k8s
在创建Jenkins项目之前 , 先要做些准备工作:

  • 建立Docker Hub账户
需要在Docker Hub上创建账户和镜像库 , 这样才能上传镜像 。 具体过程这里就不详细讲解了 , 请查阅相关资料 。
  • 在Jenkins上创建凭证(Credentials)
需要设置访问Docker hub的用户和口令 , 以后在Jenkins脚本里可以通过变量的方式进行引用 , 这样口令就不会以明码的方式出现在程序里 。
用管理员账户登录 Jenkins主页面后 , 找到 Manage Jenkins-》Credentials-》System -》Global Credentials -》Add Credentials , 如下图所示输入你的Docker Hub的用户名和口令 。 “ID”是后面你要在脚本里引用的 。
##初探在容器上构建持续部署
本文插图
  • 创建预装Docker和k8s的Jenkins镜像
Jenkins的默认容器里面没有Docker和k8s , 因此我们需要在Jenkins镜像的基础上重新创建新的镜像 , 后面还会详细讲解 。
下面是镜像文件(Dockerfile-modified-jenkins)
FROM jenkins/jenkins:lts
USER root
ENV DOCKERVERSION=19.03.4
RUN curl -fsSLO https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKERVERSION}.tgz
&& tar xzvf docker-${DOCKERVERSION}.tgz --strip 1
-C /usr/local/bin docker/docker
&& rm docker-${DOCKERVERSION}.tgz
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
&& chmod x ./kubectl
&& mv ./kubectl /usr/local/bin/kubectl
上面的镜像在“jenkins/jenkins:lts”的基础上又安装了Docker和kubectl , 这样就支持这两个软件了 。 镜像里使用的是docker的19.03.4版本 。 这里装的只是“Docker CLI” , 没有Docker引擎 。 用的时候还是要把虚拟机的卷挂载到容器上 , 使用虚机的Docker引擎 。 因此最好保证容器里的Docker版本和虚机的Docker版本一致 。
使用如下命令查看Docker版本:
vagrant@ubuntu-xenial:/$ docker version
详细情况请参见Configure a CI/CD pipeline with Jenkins on Kubernetes:https://developer.ibm.com/tutorials/configure-a-cicd-pipeline-with-jenkins-on-kubernetes/
准备工作已经完成 , 现在要正式创建Jenkins项目:
  • Jenkins脚本:
项目的创建是在Jenkins的主页上来完成 , 它的名字是“jenkins-k8sdemo” , 它的最主要部分是脚本代码 , 它也跟Go程序存放在相同的源码库中 , 文件的名字也是“jenkins-k8sdemo” 。 项目的脚本页面如下图所示 。
##初探在容器上构建持续部署
本文插图
如果你不熟悉安装和创建Jenkins项目 , 请参阅在k8s上安装Jenkins及常见问题
下面就是jenkins-k8sdemo脚本文件:
def POD_LABEL = ''k8sdemopod-${UUID.randomUUID.toString}''