最近一段时间腾讯云和阿里云都在开展非常实惠的活动购买云主机,很多小伙伴都买了云主机来学习和实践。对此,本文主要介绍了如何用云主机从零开始搭建CI/CD(持续集成/持续部署)的环境,以及如何构建一个Spring boot 项目到环境中实现自动部署。
涉及到的技术/应用/工具
- github
- maven
- docker
- jenkins
- portainer
- spring boot
- docker swarm
搭建需求
- 腾讯/阿里云虚拟机 >= 2台,只有一台的话可以不做Worker云主机部分。
- 操作系统 CentOS 7.4 64位
搭建前操作
云主机安全组放通全部端口
为了方便测试,我们将实验的云主机的全部端口放通
Spring Boot 项目
添加dockerfile-maven-plugin
在pomxml添加下面代码,docker.image.prefix是自己的镜像仓库的命名空间
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
添加Dockerfile文件到项目根目录
没有定置化要求的话,不需要修改内容
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
测试构建镜像
本地环境有安装docker 才可以测试
mvn install dockerfile:build
配置Manager云主机
1.环境搭建
Java安装
sudo yum install java-1.8.0-openjdk-devel -y
git 安装
sudo yum install git -y
maven 安装
sudo yum install maven -y
docker CE 安装
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce -y
Jenkins安装
使用Jenkins仓库
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
安装
sudo yum install jenkins -y
赋予jenkins账号root权限
在jenkins中构建docker镜像时需要用到
gpasswd -a jenkins docker
gpasswd -a jenkins root
启动Jenkins
systemctl start jenkins.service
访问Jenkins
http://119.10.1.100:8080
进入Jenkins
第一次登入Jenkins时需要输入管理员密码,按照提示,使用下面命令查看初始密码
cat /var/lib/jenkins/secrets/initialAdminPassword
复制密码,填入,进入Jenkins.选择默认的插件安装,创建用户,登录Jenkins.
2.配置docker swarm
初始化docker swarm
初始化docker swarm,并保存生成的命令,配置worker云主机的时候使用。注意,这里需要加入可选配置--advertise-addr,ip为manager云主机的外网ip。
docker swarm init --advertise-addr 119.10.1.100
--------------------------
Swarm initialized: current node (z1z3wrml2geuwg32svyhi0n9e) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-147xlpaecbtusvbxi4ije45gejcheyod31ilq0hezb7ipt2jhn-cbpnu5hjvn12gxxru1pzrhyda 119.10.1.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
创建Portainer
Portainer是Docker Swarm的图形化管理工具
docker service create \
--name portainer \
--publish 80:9000 \
--constraint 'node.role == manager' \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
portainer/portainer \
-H unix:///var/run/docker.sock
访问Portainer
http://119.10.1.100:80
配置GitHub
settings -> Developer settings -> Personal access tokens -> Generate new token -> 勾选repo 后,生成token
配置Jenkins
管理插件
找到可选插件Maven Integration Plugin 插件,直接安装。
全局工具配置
配置java路径
/usr
配置git路径
/usr/bin/git
配置maven路径
/usr/share/maven
配置docker路径
/var/lib/docker
系统设置
添加GitHub Servers,Credentials填入在Github中生成的token,Test connection,勾选Manage hooks
容器服务-镜像仓库
通过优惠活动购买的云主机外网带宽一般只有1M,如果使用外网上传/下载镜像的话,等待的时间会很长。所以如果是腾讯云主机,建议使用腾讯云的容器服务里面的镜像仓库。如果是阿里云的话,就使用阿里云的镜像仓库,这样的话上传/下载镜像是使用内网的。1、2百MB的镜像也才只需要几秒就可以下载完成,极大的节省了时间。
腾讯云镜像仓库服务:https://console.cloud.tencent.com/ccs/registry/user?rid=1
阿里云镜像仓库服务:https://cr.console.aliyun.com
以腾讯云镜像仓库为例,第一次使用时限设置仓库密码
然后新建镜像仓库,类型为公有,否则下载镜像的时候会失败。也可以先push镜像后自动创建,然后再将镜像设置为公有。
在Jenkins新建Maven项目
输入项目名称,选择Maven project,下一步
勾选gitHub project,输入项目url
Source Code Management 勾选git,输入项目url,并且添加Credentials(github 账号、密码)
Build Triggers 勾选GitHub hook trigger for GITScm polling
Build 的Goals and options 中 填写 install dockerfile:build
Post Steps 配置
docker login -u 账号 -p 密码 ccr.ccs.tencentyun.com
docker tag ccr.ccs.tencentyun.com/镜像仓库命名空间/项目名称 ccr.ccs.tencentyun.com/镜像仓库命名空间/项目名称:${BUILD_NUMBER}
docker push ccr.ccs.tencentyun.com/镜像仓库命名空间/项目名称:${BUILD_NUMBER}
保存后点击项目,构建
可以看到build history显示以及构建成功,点进去可看构建时候的日志。
查看镜像
docker images
部署服务到docker swarm
docker service create --name yong-registry -p 8089:8089 ccr.ccs.tencentyun.com/kioyong/yong-registry:1
查看部署
更新项目配置
command添加多两行命令
docker service update --image ccr.ccs.tencentyun.com/kioyong/yong-registry:${BUILD_NUMBER} --update-parallelism 1 yong-registry
docker rmi ccr.ccs.tencentyun.com/kioyong/yong-registry:${BUILD_NUMBER}
保存,测试提交代码后,Jenkins是否正常build,portainer上面的service是否自动部署到最新的镜像,测试service的访问,搭建完成。
配置Worker云主机
配置云主机后,在docker swarm 部署的service将根据内存使用情况自动分发到子节点部署。
安装docker CE
安装步骤同Manage主机一样
加入docker swarm 集群
docker swarm join --advertise-addr <当前子节点公网IP地址> --token SWMTKN-1-670a8imixkl71ouo836c2wvxr01ii48v7q5xytc98ihqzadgw0-1k6ogcvy2qic86hmqrtsw863t <主节点公网IP地址>:2377
Portainer 验证是否成功加入。