最近接到一个任务,就是讲本地的maven项目,提交到gitlab上然后使用jenkins自动化集成,打包,生成镜像,最后将镜像上传到harbor中,实现自动化的部署上线。总结这篇帖子的原因是,作为一个刚刚接触docker的小白,也翻了很多篇博主的博客,经过了二个星期的洗礼,终于把这套流程走通了,这里分享给大家,也让大家少走一些弯路。
首先向大家介绍一些我的环境,我是在k8s上,安装了3个组件:gitlab、jenkins、harbor,并且映射了端口,这样可以供外部访问。所以我做的操作是jenkins基于k8s的自动化集成,并且使用的pipeline流水线任务。
目的:本地编写web项目----》上传到gitlab----》使用jenkins集成----》提交到harbor----》测试是否新发布的image可以使用,并且其中的web项目可以供外部访问。本案例主要介绍一套流程热点配置,其中的web项目只是简单的实现hello World。
创建一个项目,填写项目名称,并设置项目为私有:
接着将本地项目提交到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 的image
#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:编写具体的业务逻辑
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("" + message + "
");
}
@Override
public void destroy() {
super.destroy();
}
}
在web.xml中配置
HelloWorld
com.zy.web.HelloWorld
HelloWorld
/HelloWorld
build.sh:maven的打包命令
#!/bin/sh
mvn clean package #将maven项目打包
Jenkinsfile:流水线任务的自动化部署文件:
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。如下图所示
这里首先测试一下,此时的连接是否成功:
配置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上。
注意:两个模板中 这里需要勾上。
配置Pod Env:
上面的jenkins的URL可以在这里找到:
Pod annotation配置
名称为:命名空间_shared
配置完如上配置之后,点击保存。
此时我们再看在gitlab中的项目:
其中注意:这里解释jenkinsfile中的几点:
最后,构建刚刚的任务:
如果成功的话:
此时可以做一个测试:(从harbor中下载镜像,并且运行),我们在创建一个流水线任务:(直接编写脚本即可):
将以下内容copy到脚本中:
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下来,并且可以运行:
转载于:https://blog.51cto.com/14048416/2376850