Gitlab CI/CD+docker实现springboot项目的自动化部署

一、概述

    本文主要通过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-8                                          stage:  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-runner

deploy_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如下图所示:


Dockerfile



.gitlab-ci.yml(1)


.gitlab-ci.yml(2)


.gitlab-ci.yml(3)

使用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

最后的效果图如下:


完成效果图


进行maven build
docker build
docker run

so==>该去植发了,我第一次写文章,也是想把学到的东西巩固一下,写的不好请大家多担待,有什么问题热情欢迎各位大佬指教!!!!,在这里我预祝各位大佬新春快乐,大吉大利,money多多,加班少少。

你可能感兴趣的:(Gitlab CI/CD+docker实现springboot项目的自动化部署)