使用Gitlab和Docker自动化部署spring-boot应用

发布时间:2020-08-30 12:47:07阅读:(539)

Gitlab CI是Gilab的一部分,只需要编写一个.gitlab-ci.yml文件即可完成所有CI工作。

本文中,使用GitlabCI的前置条件

  1. 在gitlab上已有spring boot项目
  2. 应用服务器上已安装docker
  3. 有docker镜像托管(本文中使用Docker Hub)
  4. 在服务器上已生成了SSH密钥

需要创建的文件

  1. Dockerfile 用于构建Docker镜像
  2. .gitlab-ci.yml 用于定义整个CI流程

GitlabRunner配置

找一台服务器作为gitlab-runner的宿主机,安装docker

$ docker pull gitlab/gitlab-runner:v13.1.3

$ docker run -d --name gitlab-runner --restart always \
-v /data/apps/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
--privileged \
gitlab/gitlab-runner:v13.1.3 # 启动docker-runner

$ docker exec -it gitlab-runner gitlab-runner register -n \ # 注册runner
--url https://gitlab.example.com \ # gitlab地址
--registration-token ********** \ # gialab上的runner token
--executor docker \
--description "description" \
--docker-image "docker:stable" \ # 默认镜像
--docker-privileged \ # 重要!让容器拥有真正的root权限
--docker-volumes "/certs/client" \
--docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \ # 重要!如果不加这个,无法再docker内运行docker
--docker-volumns "/opt/data/gitlab-runner/.m2:/root/.m2" # 可选,将.m2目录存储起来可加快编译速度

Dockerfile

FROM openjdk:8-jdk-alpine

WORKDIR /app
COPY target/appdemo-*.jar /app/appdemo.jar

ENTRYPOINT ["java", "-jar", "appdemo.jar"]

创建Gitlab变量

KeyValue说明
APP_NAMEappdemo应用名
APP_PORT8080端口
DOCKER_USERuserdocker hub用户名
DOCKER_PASSWORDpassworddocker hub密码
SERVER_HOST10.0.x.x服务器地址
SSH_PRIVATE_KEY-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNza******
-----END OPENSSH PRIVATE KEY-----
ssh私钥
SPRING_ACTIVE_PROFILEproductionspring active profile

.gitlab-ci.yml

stages:
- build jar
- build image
- deploy

build:
stage: build jar
image: maven:3.6.3-openjdk-8-slim
artifacts:
name: "$CI_BUILD_REF_NAME"
expire_in: 1 week
paths:
- target/appdemo-*.jar
script:
- mvn clean package -Dmaven.test.skip=true # 打包jar

build image:
stage: build image
image: docker:stable
artifacts:
paths:
- target/
script:
- VERSION=$(date "+%Y%m%d%H%M%S")
- TAG=$APP_NAME:$VERSION
- echo $TAG
- echo $TAG > target/build-tag.txt # 将tag存储下来,让下个阶段可以读取
- docker build -t $TAG . # 打包docker image
- docker login -u $DOCKER_USER -p $DOCKER_PASSWORD # 登录到docker hub
- docker push $TAG # 推送
- docker logout # 登出
deploy:
stage: deploy
image: ubuntu:latest
before_script: # 设置ssh免登,这部分可参考https://docs.gitlab.com/ee/ci/ssh_keys/
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
script:
- TAG=$(cat target/build-tag.txt) # 读取上一个节点的tag
- echo $TAG
- ssh root@$SERVER_HOST "docker stop $APP_NAME; docker rm $APP_NAME; docker login -u $DOCKER_USER -p $DOCKER_PASSWORD; docker pull $TAG; docker container run -d --name $APP_NAME -p $APP_PORT:8080 -e SPRING_PROFILES_ACTIVE=$SPRING_ACTIVE_PROFILE $TAG; docker logout"
# 最后一步为免登至服务器,停止并删除已有容器,拉取新的镜像并启动容器

上一篇:Centos7安装gitlab

下一篇:Ceph组件介绍

发表评论

评论列表(有0条评论539人围观)
暂无评论