一、概述
本文主要通过Gitlab CI/CD实现JAVA服务端项目的自动化部署,本人之前部署服务,将项目build打包之后通过scp命令/FZ上传至服务器,通过终端/Xshell登录服务器,进入指定目录,执行启动脚本,这样服务就启动了。但是这种情况下的服务启动有以下几点问题:
1.服务器安全性,需要实时改动服务器密码及登录密钥,防止服务器密码泄露等。
2.每个版本没有详细说明,需要回滚时得确定需要回滚至哪个版本,紧急情况下不友好。
所以Gitlab CI/CD的自动化部署就开始了它的使命……
二、准备工作
要使用Gitlab CI/CD+docker自动化部署首先需要搭建环境:
1.一台或者多台服务器(centos、ubuntu)。
2.服务器安装gitlab。
3.服务器安装注册gitlab-runner。
4.服务器安装docker。
5.搭建简易的springboot项目。
三、详细步骤
1.服务器安装docker
Ⅰ.docker需要centos的内核版本高于3.10,所以先查看下服务器是否支持docker版本
uname -r
Ⅱ.卸载旧版本
sudo yum remove docker docker-common docker-selinux docker-engine
Ⅲ.安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的软件包
yum install -y yum-utilsdevice-mapper-persistent-data lvm2
Ⅳ. 设置yum源(这里使用阿里的)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Ⅴ. 查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
Ⅵ. 安装Docker
#安装最新版本(推荐) yum install docker-ce
#安装特定版本 yum installdocker-ce-版本号
# 例如 yum installdocker-ce-18.06.3.ce
Ⅶ.验证
docker info
2.服务器安装gitlab
Ⅰ.安装并配置必要的的依赖:
sudo yum install -y curlpolicycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent –
Ⅱ.安装邮件服务:
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
Ⅲ.添加gitlab的镜像
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-13.4.0-ce.0.el7.x86_64.rpm
Ⅳ.gitlab 安装命令
rpm -i gitlab-ce-13.4.0-ce.0.el7.x86_64.rpm --nodeps --force
安装成功后会有一个gitlab的logo,全是***的辣个,看起来像个狐狸头(咦~~)
Ⅴ.修改gitlab的指定ip和端口
vim /etc/gitlab/gitlab.rb
Ⅵ.重置并启动gitlab
gitlab-ctl reconfigure
gitlab-ctl restart
这个时候出现ok:run:那么恭喜我(好像成功了哎)。
但是吧......访问gitlab的地址时会有一点点小问题,刚开始会报502,刷新一会儿就好了。
这个时候可以登录gitlab的地址,然后准备的简单springboot项目就起作用了,将项目push至gitlab。同时再创建一个docker的镜像仓库与gitlab进行一一对应。docker的镜像仓库后面有用到的喔。
3.服务器安装注册gitlab-runner
①.下载安装
Ⅰ.根据指令选择安装包
https://gitlab-runner-downloads.s3.amazonaws.com/latest/index.html
dpkg --help .deb包
rpm --help .rpm包
Ⅱ.根据系统架构选择安装包
uame -a
Ⅲ.下载安装包(
curl -LJO https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_
.deb
Ⅳ.安装
dpkg -i gitlab-runner_
.debrpm -i gitlab-runner_ .rpm
②.注册
Ⅰ. 注册指令
gitlab-runner register
Ⅱ. 输入gitlab地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
Ⅲ. 输入token (对应项目 - 设置 - CI/CD - Runner - token) - shared runner 需要owner用户
Please enter the gitlab-ci token for this runnerxxx
Ⅳ. 输入gitlab-runner 名称
Please enter the gitlab-ci description for this runner
指定Runner: [host]-[user]-[project]
共享Runner: [host]-[user]-[group]
Ⅴ. 输入gitlab-runner相应的tag
Please enter the gitlab-ci tags for this runner (comma separated):
指定Runner: [host]-[user]-[project]
共享Runner: [host]-[user]-[group]
Ⅵ. Runner excutor,目前主要研究的shell
Please enter the executor: ssh, docker+machine, dockerssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
Shell
Ⅶ. 查看用户gitlab-runner 信息,主要是config.toml地址
gitlab-runner run –help
-c value, --config value Config file (default: "/home/admin/.gitlab-runner/config.toml") [$CONFIG_FILE]…
Ⅷ. 给gitlab-runner修改builds_dir和cache_dir地址
vim /home/admin/.gitlab-runner/config.toml
Ⅸ. 启动gitlab-runner
gitlab-runner run
③.部署gitlab-runner服务
Ⅰ.注册服务配置查看
sudo gitlab-runner install –help
Ⅱ. 注册一定要配置 service(名称),working-directory,config(配置文件),user
sudo gitlab-runner install \
-n gitlab-runner-test \
-d /home/admin/runnerServerWorkingDir \
-c /home/admin/.gitlab-runner/config.toml \
-u test
Ⅲ.启动服务
sudo gitlab-runner start -n gitlab-runner-test
Ⅳ.服务状态查询
sudo gitlab-runner status -n gitlab-runner-test
gitlab-runner注册运行成功后已经成功了一大半(这个过程需要很久)
注册的时候可能会出现403啊什么的,第一检查自己的gitlab地址,第二检查一下gitlab和gitlab-runner的版本,如果版本上有问题也会出现类似的问题。
检查地址时,尝试下地址是否可以ping到或者netstat ip来检查服务器是否可以连接gitlab的地址。
接下来就是重头戏了!!!!
首先看一下我们需要哪些文件
Dockerfile、.gitlab-ci.yml文件,项目结构是这样
Dockerfile的内容如下:
# Build stage
FROM registry.cn-hangzhou.aliyuncs.com/acs/maven:3-jdk-8 AS builder
COPY /settings.xml /root/.m2/settings.xml
WORKDIR /build
COPY . /build
RUN ["/usr/local/bin/mvn-entrypoint.sh","mvn","verify","clean","-Dmaven.test.skip=true","--fail-never"]
ADD . /build
RUN ["/usr/local/bin/mvn-entrypoint.sh","mvn","verify","-Dmaven.test.skip=true"]
# Run stage
FROM openjdk:8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
VOLUME /tmp
COPY --from=builder /build/target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=${profiles}","-c"]
容在下为各位详细解释解释Dockerfile中的内容:
1.build过程分为两步,第一部分是maven build ,第二部分是用java镜像的build。
2.maven镜像可以使用中央镜像,也可以跟我一样使用(aliyun镜像),但是使用中央仓库会有一点点问题。。maven下载过慢,但是配置了第四点就不一样了,请往下看哦.....
3.注意后面那个AS builder 这句语法在docker 1.13版本不能使用,会直接报错,可能找很长时间会以为是docker from 语法中不能有大写,实际上是个版本问题。
4.copy setting.xml 这句可以不加,这句是为了把maven的配置文件加载到这个镜像里面,maven的配置文件大家都知道可以配置镜像源,配置仓库地址等等。假如说自己有maven私服,有自己上传到maven私服的jar包引用,那么这句是非常重要的了。
5.接下来的操作皆是大同小异,mvn clean install 、 mvn clean package 、mvn clean verify用法皆是一个目的将项目打成jar包(如果想详细了解请看我下篇关于maven的介绍)。注意点是进行了两次mvn verify,可以从java层面理解为懒加载,先加载一次看看pom中有没有新的依赖下载,再进行整体打包。这样可以减少maven build的速度,不然我们每次部署搞个几十分钟,大家也不是很乐意吧。
6.接下来就是java的镜像处理了,其中有一句关于时间的处理。因为docker做为容器化技术,容器内部时间是按照世界时间来处理的,如果大家需要以世界时间来处理整个项目,那这句可不加。
7.copy --from=builder 与上面那个 as builder是相对应的,目的是为了拿到maven打包后的jar包。
8.--spring.profiles.active=${profiles} 这个是为了在不同的环境中读取不同的配置文件,这个与下面要说到的docker run命令有结合点。
.gitlab-ci.yml文件内容如下:
variables:
# 容器镜像仓库
DOCKER_REGISTRY: #写自己的仓库地址,当然也可以用$+参数来引用。
# 容器名
DOCKER_CONTAINER_NAME: $CI_PROJECT_NAME
# 容器标签
DOCKER_TAG: '(if [ "$${CI_COMMIT_REF_NAME}" == "test" ]; then echo "$$CI_COMMIT_REF_NAME"; elif [ "$${CI_COMMIT_TAG}" == "v" ]; then echo "$$DOCKER_DEFAULT_TAG"; else echo "$${CI_COMMIT_TAG}"; fi);'
#这里我只写了两个步骤,docker build 和 deploy部署的过程,当然有自动化测试的流程#也可以加在里面的。
stages: #我会把正确的格式以图片的形式在下方展示。
- build
- deploy
build:
image: registry.cn-hangzhou.aliyuncs.com/acs/maven:3-jdk-8stage: build variables: GIT_STRATEGY: clone before_script: #这句是build之前,需要用账号密码登录docker仓库 - docker login -u -p $DOCKER_REGISTRY_SERVER script: - echo "project build" - echo "docker image start building" $DOCKER_REGISTRY:$(eval $DOCKER_TAG) - docker build -t $DOCKER_REGISTRY:$(eval $DOCKER_TAG) . - echo "docker image end build" # 推送镜像⾄远程仓库 - echo "push docker image" - docker push $DOCKER_REGISTRY:$(eval $DOCKER_TAG) - echo "push docker image success\n - " $DOCKER_REGISTRY:$(eval $DOCKER_TAG) only: - test - tag tags: - test-runnerdeploy_test: stage: deploy variables: GIT_STRATEGY: none before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $DOCKER_REGISTRY_SERVER script: # 拉取镜像 - echo "start pull images" - docker pull $DOCKER_REGISTRY:$(eval $DOCKER_TAG) - if [ $(docker ps -aq --filter name=$DOCKER_CONTAINER_NAME) ]; then docker rm -f $DOCKER_CONTAINER_NAME;fi - echo "play runner" - docker run -d -v /home/admin/java/test-docker/logs:/logging/ -e profiles="test" --restart=always --name test-docker--net=host -p 8085:8085 test-docker:v1.0 only: - test tags: - test-runner dependencies: - build
Dockerfile和.gitlab-ci.yml如下图所示:
使用docker login时需要注意,最新版本的docker好像不支持这种语法。
docker run命令 -v /home/admin/java/test-docker/logs:/logging/ 表示把docker容器内的日志挂载到当前服务器的 /home/admin/java/test-docker/logs目录下,不然每次查看docker启动服务的日志,都需要用docker logs -f test-docker 会比较麻烦。 -e profiles="test" 这个就是Dockerfile中的profiles,--net=host 这个是为了共用宿主机的ip和端口,我们有时候会用到宿主机的redis,kafka等等,用这个之后就不用更改项目中的配置文件了。
这个时候当我们在idea中打包一个项目,然后打标签,推到我们在.gitlab-ci.yml文件中的only中配置的分支---->我们的项目就会在tags表示的gitlab-runner所在的服务器上build 和 运行。
mvn clean install
git add .
git commit -m "add Dockerfile and .gitlab-ci.yml to project "
git tag -a v1.0 -m "test build deploy"
git push origin test
最后的效果图如下:
so==>该去植发了,我第一次写文章,也是想把学到的东西巩固一下,写的不好请大家多担待,有什么问题热情欢迎各位大佬指教!!!!,在这里我预祝各位大佬新春快乐,大吉大利,money多多,加班少少。