一、为什么做持续集成、怎么做持续集成
搭建持续集成环境的目的,就是为了将部署流程规范化、自动化,节省人力、时间、稳定部署。
下图是Docker+Jenkins+GitHub的基本部署结构图。
- 开发者提交代码到git
- jenkins检测到版本更新,触发构建
- 构建任务:下载代码、maven打包、docker构建镜像、上传镜像库、重启镜像
下面开始逐步实现:
使用的服务器系统是centos7
二、部署jenkins
1、没有jdk的,先安装jdk
yum install java-1.8.0-openjdk.x86_64
2、下载jenkins和tomcat,解压tomcat
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.42/bin/apache-tomcat-8.5.42.tar.gz
tar -zxvf apache-tomcat-8.5.42.tar.gz
3、把jenkins.war放入tomcat/webapps,启动tomcat
mv jenkins.war apache-tomcat-8.5.42/webapps/
sh apache-tomcat-8.5.42/bin/startup.sh
4、配置jenkins
浏览器访问http://x.x.x.x:8080/jenkins,稍等几分钟
到解锁界面先修改一下配置,防止下一步卡在loding
(/启动jenkins用户的根目录/.jenkins/updates/default.json 把第一行的google改成baidu,保存)
然后再解锁
使用cat命令,查看红色字体路径的文件内容,在password输入框,输入该内容,点击提交
后面的插件安装可安装,可不安装;初始化用户最好创建一个。
最后到工作界面,就完成了jenkins的安装
三、构建任务-编译打包
1、点击create new jobs创建任务
2、写上名字,选择自由风格,OK
3、在git中,填写github项目的url,点击add,添加凭证(用户名和密码)
4、保存任务后,点击Build Now,构建一次,可以看到下方#1是蓝色,表示从github下载代码成功了。
可以在这里查看日志
5、添加一个编译步骤,写入clean install ,实现maven打包
先安装maven,yum install maven
再运行任务,从日志中,可以看出,打包成功
四、构建任务-构建镜像
添加一个shell步骤
jar包名:demo-0.6.jar ,其中0.6是版本号,先取出版本号,当作后面的镜像版本。
pkname=$(ls target/| grep demo |head -n 1)
vesion=${pkname%.*}
vesion=${vesion#*-}
echo $vesion
#获取版本号
rm Dockerfile
echo "FROM openjdk:latest" >> Dockerfile
echo 'MAINTAINER charle "charle.wenqiang.qq.com"' >> Dockerfile
echo "COPY ./target/demo*.jar /data/demo.jar" >> Dockerfile
echo "ENTRYPOINT java -jar /data/demo.jar" >> Dockerfile
#初始化Dockerfile
docker build -t="charle/demo:$vesion" .
#基于dockerfile构建镜像
五、构建任务-上传镜像到仓库
镜像库可以用DockerHub、阿里云、私有库等,这里用的是阿里云。
因为要用到版本号,脚本就写到上个步骤的shell里。
docker login --username=XXXX@qq.com --password=XXXX registry.cn-shenzhen.aliyuncs.com
#登录仓库
docker tag charle/demo:$vesion registry.cn-shenzhen.aliyuncs.com/charlezone/demo:$vesion
docker push registry.cn-shenzhen.aliyuncs.com/charlezone/demo:$vesion
#上传镜像
六、构建任务-更新docker容器
因为要用到版本号,脚本还是写到上上个步骤的shell里。
docker_id=$(docker ps | grep demo| awk '{print $1}')
if [ "$docker_id" != "" ]; then
docker rm -f $docker_id
fi
#删除上个版本容器
docker run -dit -p 8011:8011 --name demo$vesion registry.cn-shenzhen.aliyuncs.com/charlezone/demo:$vesion
#启动新版本容器
从代码更新,到服务更新就已经完成了。