【教程】使用腾讯云主机搭建持续集成/部署环境

最近一段时间腾讯云和阿里云都在开展非常实惠的活动购买云主机,很多小伙伴都买了云主机来学习和实践。对此,本文主要介绍了如何用云主机从零开始搭建CI/CD(持续集成/持续部署)的环境,以及如何构建一个Spring boot 项目到环境中实现自动部署。

涉及到的技术/应用/工具

  • github
  • maven
  • docker
  • jenkins
  • portainer
  • spring boot
  • docker swarm

搭建需求

  • 腾讯/阿里云虚拟机 >= 2台,只有一台的话可以不做Worker云主机部分。
  • 操作系统 CentOS 7.4 64位

搭建前操作

云主机安全组放通全部端口

为了方便测试,我们将实验的云主机的全部端口放通


image.png

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

以腾讯云镜像仓库为例,第一次使用时限设置仓库密码


image.png

然后新建镜像仓库,类型为公有,否则下载镜像的时候会失败。也可以先push镜像后自动创建,然后再将镜像设置为公有。


image.png

在Jenkins新建Maven项目

输入项目名称,选择Maven project,下一步


image.png

勾选gitHub project,输入项目url


image.png

Source Code Management 勾选git,输入项目url,并且添加Credentials(github 账号、密码)
image.png

Build Triggers 勾选GitHub hook trigger for GITScm polling


image.png

Build 的Goals and options 中 填写 install dockerfile:build
image.png

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}

image.png

保存后点击项目,构建


image.png

可以看到build history显示以及构建成功,点进去可看构建时候的日志。


image.png

查看镜像
docker images
image.png

部署服务到docker swarm

docker service create --name yong-registry -p 8089:8089 ccr.ccs.tencentyun.com/kioyong/yong-registry:1

查看部署

image.png

更新项目配置
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}
image.png

保存,测试提交代码后,Jenkins是否正常build,portainer上面的service是否自动部署到最新的镜像,测试service的访问,搭建完成。

配置Worker云主机

配置云主机后,在docker swarm 部署的service将根据内存使用情况自动分发到子节点部署。


image.png

image.png

安装docker CE

安装步骤同Manage主机一样

加入docker swarm 集群

docker swarm join --advertise-addr <当前子节点公网IP地址> --token SWMTKN-1-670a8imixkl71ouo836c2wvxr01ii48v7q5xytc98ihqzadgw0-1k6ogcvy2qic86hmqrtsw863t <主节点公网IP地址>:2377

Portainer 验证是否成功加入。

推荐阅读更多精彩内容