在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要。目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部署、交付(CD)。在此,我们来以一个案例初步了解 CI 流程。那么什么是 CI 呢?简单来讲,CI 就是将传统的代码合并、构建、部署、测试都集成在一起,不断地执行这个过程,并对结果进行反馈。
CI 流程设计图:
 

工作流程:

1. 开发人员提交代码到Git版本仓库;
2. Jenkins人工/定时触发项目构建;
3. Jenkins拉取代码、代码编码、打包镜像、推送到镜像仓库;
4. Jenkins在Docker主机创建容器并发布

服务器规划:

IP地址
角色
10.0.0.111
Jenkins,Docker,JDK,Maven
10.0.0.100
Harbor(Docker,docker-compose),Git

部署Git代码版本仓库

10.0.0.100 操作
# yum install git -y
# useradd git
# passwd git
# su – git
# mkdir wenlong.git
# cd wenlong.git/
#初始化仓库
# git --bare init
10.0.0.111 操作
Jenkins主机测试访问该仓库:
git clone git@10.0.0.100:/home/tools/git/wenlong.git
正克隆到 'wenlong'...
git@10.0.0.100's password: "git账号的密码"
warning: 您似乎克隆了一个空版本库。
模拟生产项目,拉取github上的一个demo,并上传至本地git库
# mv tomcat-java-demo-master/* wenlong/
# git add .
需要验证
# git config --global user.email "xuewenlong@123.com"
# git config --global user.name "xuewenlong"
# git commit -m "all"
# git push origin master

部署Harbor镜像仓库

10.0.0.100 操作
 

Jenkins主机安装Docker并配置可信任

10.0.0.111 操作
# wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# yum install docker-ce -y
# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"insecure-registries": ["192.168.31.63"]
}
# systemctl start docker
# systemctl enable docker

Jenkins环境部署

# tar zxvf jdk-8u45-linux-x64.tar.gz
# mv jdk1..0_45 /usr/local/jdk
# tar zxf apache-maven-3.5.-bin.tar.gz
# mv apache-maven-3.5. /usr/local/maven
# vim /etc/profile
JAVA_HOME=/usr/local/jdk
PATH=$PATH:$JAVA_HOME/bin:/usr/local/maven/bin
export JAVA_HOME PATH
# source /etc/profile
在10.0.0.111主机安装Jenkins,下载Tomcat二进制包将war包到webapps下即可:
# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
# wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.38/bin/apache-tomcat-8.5.38.tar.gz
# tar zxf apache-tomcat-8.5..tar.gz
# mv apache-tomcat-8.5. /usr/local/tomcat-jenkins
# rm -rf /usr/local/tomcat-jenkins/webapps/*
# mv jenkins.war /usr/local/tomcat-jenkins/webapps/ROOT.war
# cd /usr/local/tomcat-jenkins/bin/
# ./startup.sh
启动后,浏览器访问
http://10.0.0.111:8080/,按提示输入密码,登录即可。

Jenkins安装必要插件

由于jenkins是离线安装,所有在此需要配置一下插件下载地址:系统管理-->插件管理-->Advanced
修改下方地址
jenkins插件清华大学镜像地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.xmission.com/jenkins/updates/update-center.json
将https修改为http 再点Submit
Submit后点击Available,Check now此时我们可以看到很多可获得插件
安装git和pipeline插件
 

Jenkins流水线部署

pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。
创建一个pipeline类型的Job
 
选择流水线类型
 
配置Pipeline script,点击Pipeline语法,来自动生成我们需要的配置。
选择Git方式,配置Git仓库地址,再添加认证相关
使用秘钥认证方式需要将jenkins上生成的公钥发送到git服务器上,然后将jenkins上的生成的私钥内容粘贴到下图Key中,这样jenkins就可以免交互的拉取git仓库中的代码了。
[root@docker-jenkins bin]# ssh-keygen
[root@docker-jenkins bin]# cd
[root@docker-jenkins ~]# ls .ssh/
id_rsa id_rsa.pub known_hosts
[root@docker-jenkins ~]# ssh-copy-id git@10.0.0.100
 
 
 
 
配置完成后,生成Pipeline脚本了。点击下方Generate Pipeline Script,然后复制方框内的内容。
编写我们所需要的Pipeline脚本如下,将其粘贴到script的拉取代码模块中,并修改分支master为${branch},其他模块内容自行编写。
node {
def mvnHome
stage('Preparation') { // for display purposes
//拉取代码
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '7c00a680-53fd-42db-a12a-21b803dd6c40', url: 'git@10.0.0.100:/home/tools/git/wenlong.git']]])
}
//编译代码
stage('Build') {
sh '''
export JAVA_HOME=/home/tools/jdk1..0_221
mvn clean package -Dmaven.test.skip=true
'''
}
// 项目打包到镜像并推送到镜像仓库
stage('Build and Push Image') {
sh '''
REPOSITORY=10.0.0.100/library/wenlong:${branch}
cat > Dockerfile << EOF
FROM 10.0.0.100/library/tomcat:v1
LABEL maintainer wenlong
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
EOF
docker build -t $REPOSITORY .
docker login 10.0.0.100 -u admin -p Harbor12345
docker push $REPOSITORY
'''
}
// 部署到Docker主机
stage('Deploy to Docker') {
sh '''
REPOSITORY=10.0.0.100/library/wenlong:${branch}
docker rm -f tomcat-java-demo |true
docker pull $REPOSITORY
docker container run -d --name wenlong -p 88:8080 $REPOSITORY
'''
}
}
 
在Pipeline脚本里面我们指定了一个branch参数,所以我们需要传递一个参数变量,这里我们选择参数化构建,默认值为master分支。
然后保存配置

发布测试

回到主界面,我们开始构建任务:
 
查看构建成功后的图形构建过程:
通过浏览器来访问java项目:http://10.0.0.111:88/
至此部署完成,文章参考于李振良老师

使用Docker构建企业Jenkins CI平台的更多相关文章

  1. DevOps实践之一:基于Docker构建企业Jenkins CI平台

    基于Docker构建企业Jenkins CI平台 一.什么是CI 持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...

  2. 基于 Docker 构建企业 Jenkins CI平台

    持续集成(Continuous Integration,CI):代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈. 持续部署(Continuous Deployment,CD):部 ...

  3. 基于Docker构建企业Jenkins CI平台

  4. 视频私有云实战:基于Docker构建点播私有云平台

    私有云是为一个客户单独使用而构建的,因而提供对数据.安全性和服务质量的最有效控制.前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序.其核心属性是专有的资源.本篇文章将会结合网易云信的实 ...

  5. 基于Kubernetes构建企业Jenkins master/slave CI/CD平台

    搭建平台目的: k8s中搭建jenkins master/slave架构,解决单jenkins执行效率低,资源不足等问题(jenkins master 调度任务到 slave上,并发执行任务,提升任务 ...

  6. 基于Docker构建Jenkins CI平台

    1.部署gitlab 1.1 部署gitlab docker run -d \ --name gitlab \ -p 8443:443 \ -p 9999:80 \ -p 9998:22 \ -v $ ...

  7. 使用Kylin构建企业大数据分析平台的4种部署方式

    本篇博客重点介绍如何使用Kylin来构建大数据分析平台.根据官网介绍,其实部署Kylin非常简单,称为非侵入式安装,也就是不需要去修改已有的 Hadoop大数据平台.你只需要根据的环境下载适合的Kyl ...

  8. 基于docker构建flink大数据处理平台

    https://www.cnblogs.com/1ssqq1lxr/p/10417005.html 由于公司业务需求,需要搭建一套实时处理数据平台,基于多方面调研选择了Flink. 初始化Swarm环 ...

  9. Docker+Kubernetes/K8s+Jenkins视频资料【干货分享】

    不管你是否意识到,在这几年时间里,技术岗招聘重点关注的是Docker.Kubernetes(以下简称: K8S),面试10家公司得有8家会问你会不会"docker"."k ...

随机推荐

  1. [译]Tus 协议

    原文地址:https://tus.io/protocols/resumable-upload.html 摘要 该协议提供一种基于 HTTP/1.1 和 HTTP/2 机制用于文件断点续传. 核心协议 ...

  2. 脚本学习一(echo、echo off、@、start)

    1.echo表示显示此命令后的字符 脚本: 输出结果: 2.echo off表示在此语句后所有运行的命令都不显示命令行本身 脚本: 输出结果: 3.@与echo off相象,但它是加在每个命令行的最前 ...

  3. Dell KACE K1000 poc

    POST /service/krashrpt.php HTTP/1.1 Host: xxx.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x ...

  4. 关于ubuntu下使用l2tpvpn和远程桌面windows系统的测试

    一.背景: 2019年9月下旬到10月上旬,到海南澄迈福山度假.随身带的笔记本电脑中windows10系统因硬盘故障挂了,在另一块硬盘上的ubuntu18.04系统正常.因媳妇需要在10月1日远程回公 ...

  5. Rocket - diplomacy - TransferSizes

    https://mp.weixin.qq.com/s/Sf0owQxWzxacVvykJZ5oTQ   介绍TransferSizes的实现.   ​​   1. 基本定义   从min到max的闭合 ...

  6. ActiveMQ 笔记(三)JMS规范和落地产品、小知识Broker

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.JMS规范概述 1.JavaEE 概述及主要核心规范 JavaEE是一套使用Java进行企业级应用开 ...

  7. Java实现 删数字

    删数字 时间限制: 1 Sec 内存限制: 128 MB 题目描述 奶牛在数学课上学习了整除的概念.农夫Farmer John为了考验它的数学水平,于是在白纸上写了正整数T.由于农夫不喜欢数字0,所以 ...

  8. Java实现 LeetCode 447 回旋镖的数量

    447. 回旋镖的数量 给定平面上 n 对不同的点,"回旋镖" 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺 ...

  9. java实现多线程(车站卖票)

    import java.util.ArrayList; import java.util.List; public class 多线程 { // public static int j=0; publ ...

  10. 【JAVA习题十九】利用递归方法求5!。

    package erase; public class 用递归法求5的阶乘 { public static void main(String[] args) { // TODO Auto-genera ...