最近接到一个任务,就是讲本地的maven项目,提交到gitlab上而后使用jenkins自动化集成,打包,生成镜像,最后将镜像上传到harbor中,实现自动化的部署上线。总结这篇帖子的缘由是,做为一个刚刚接触docker的小白,也翻了不少篇博主的博客,通过了二个星期的洗礼,终于把这套流程走通了,这里分享给你们,也让你们少走一些弯路。
首先向你们介绍一些个人环境,我是在k8s上,安装了3个组件:gitlab、jenkins、harbor,而且映射了端口,这样能够供外部访问。因此我作的操做是jenkins基于k8s的自动化集成,而且使用的pipeline流水线任务。
目的:本地编写web项目----》上传到gitlab----》使用jenkins集成----》提交到harbor----》测试是否新发布的image可使用,而且其中的web项目能够供外部访问。本案例主要介绍一套流程热点配置,其中的web项目只是简单的实现hello World。html
建立一个项目,填写项目名称,并设置项目为私有:
接着将本地项目提交到gitlab上管理:
这里的对应步骤为:
A) 初始化项目为git项目:git init
B) 链接远程gitlab:
git remote add origin http://172.18.28.13:32582/devops_test_group/devops_test_project.git
C) 将项目提交本地git仓库:git add . &&git commit -m “Initial commit”
D) 将本地仓库推送到远端gitlab仓库:git push -u origin master
完成以上步骤,就能够在gitlab中刚刚建立的项目中看见本身的本地项目中的内容:
项目介绍:
这是我项目的结构:
docker/dockerfile:build docker 的imagejava
#docker/dockerfile FROM centos MAINTAINER docer_user RUN yum install httpd RUN echo "/usr/sbin/httpd -DFOREGROUND" > /usr/local/bin/start.sh RUN chmod a+x /usr/local/bin/start.sh COPY ./*.war /var/www/html RUN echo "启动Tomcat服务" EXPOSE 80 注意:这个dockerfile就是简单的下载一个httpd服务,并将打好的war包,放入/var/www/html, 并暴露了80端口,只要启动httpd服务,就能够访问到咱们的上线的web项目。
main/java:编写具体的业务逻辑linux
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class HelloWorld extends HttpServlet { private String message; @Override public void init() throws ServletException { message = "Hello world, this message is from servlet!"; } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置响应内容类型 resp.setContentType("text/html"); //设置逻辑实现 PrintWriter out = resp.getWriter(); out.println("<h1>" + message + "</h1>"); } @Override public void destroy() { super.destroy(); } }
在web.xml中配置git
<servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>com.zy.web.HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping>
build.sh:maven的打包命令web
#!/bin/sh mvn clean package #将maven项目打包
Jenkinsfile:流水线任务的自动化部署文件:docker
pipeline { agent { label "zjnx" } environment { //本地harbor的地址 DOCKER_REPO_URL = "172.18.28.37:32702" } stages { stage('Example Build') { environment { BUILDER = "gold" IMAGE_TAG = "master" JAVA_HOME = "/usr/jdk-8u131-linux-x64.tar/jdk1.8.0_131/" } steps { container('maven') { sh '''startdocker.sh $DOCKER_REPO_URL &''' sh '''chmod a+x build.sh ./build.sh cp target/*.war src/docker/ cd src/docker && docker build . -t devops-web-test:latest docker tag devops-web-test:latest ${DOCKER_REPO_URL}/${BUILDER}/devops-web-test:${IMAGE_TAG} docker push ${DOCKER_REPO_URL}/${BUILDER}/devops-web-test:${IMAGE_TAG}''' } } } } } 注意:这里具体的将maven项目打包,构建一个docker 的image,并将构建的image打标签,推送至本身的harbor仓库中。
新建视图:
新建任务
接着,后面的构建触发器是选择构建项目的触发方式,触发方式有按期触发,构建其余项目以后触发,gitlab有新推送时触发等等,能够根据须要自行选择,推荐选择Poll SCM,也就是周期性轮询gitlab,若是有代码合入,则触发构建的配置。 轮询周期能够基于crontab的时间样式配置。好比H 表明每小时轮询一次。
而后是流水线配置,选择pipeline script from scm,scm选择git,url使用前面gitlab中的项目地址http://172.18.28.13:32582/devops_test_group/devops_test_project.git
这里注意,若是是事先没有建立用户的还,这里点击add,添加一个链接gitlab的用户:
填写正确的用户名,和密码:
选择检出的分支,默认是master:
完成上面的配置,须要配置系统:
在这里把执行者数量改为大于0
Jenkins安装后,默认会配置一个Kubernetes Cloud。以下图所示
这里首先测试一下,此时的链接是否成功:centos
配置kubernetes Pod template:
注意:Labels:这里的labels会在以后项目的jenkinsfile中使用到(两者必须配置同样)
Namespace:是我k8s集群中的namespace。
docker image:能够在:
上面这个模板的Name必定要是:jnlp
因为使用maven工具打包,这一还须要配置一个模板
注意:这里的name在编写的jenkins中会使用到。
docker image:能够在
docker pull tcregistry.starcloud.io/devops/base/builder:centos2018/9/
拉取以后,上传到本身的harbor上。bash
注意:两个模板中 这里须要勾上。
配置Pod Env:
上面的jenkins的URL能够在这里找到:
Pod annotation配置
名称为:命名空间_shared
配置完如上配置以后,点击保存。app
此时咱们再看在gitlab中的项目:
其中注意:这里解释jenkinsfile中的几点:
最后,构建刚刚的任务:
若是成功的话:
此时能够作一个测试:(从harbor中下载镜像,而且运行),咱们在建立一个流水线任务:(直接编写脚本便可):
将如下内容copy到脚本中:maven
pipeline { agent { label "zjnx" } environment { //该docker url是tdc上安装的harbor的地址 DOCKER_REPO_URL = "172.18.28.37:32702" } stages { stage('Example Build') { environment { BUILDER = "gold" IMAGE_TAG = "master" JAVA_HOME = "/usr/jdk-8u131-linux-x64.tar/jdk1.8.0_131/" } steps { container('maven') { sh '''startdocker.sh $DOCKER_REPO_URL &''' sh '''docker pull 172.18.28.37:32702/gold/devops-web-test:master docker run -it -d -p 9999:80 172.18.28.37:32702/gold/devops-web-test:master /bin/bash -c /usr/local/bin/start.sh docker images docker ps -a ''' } } } } }
构建成功以后,能看到上一个任务push到harbor的镜像,被pull下来,而且能够运行: