使用Gitlab和Docker自动化部署spring-boot应用
发布时间:2020-08-30 12:47:07阅读:(575)
Gitlab CI是Gilab的一部分,只需要编写一个.gitlab-ci.yml文件即可完成所有CI工作。
本文中,使用GitlabCI的前置条件
- 在gitlab上已有spring boot项目
- 应用服务器上已安装docker
- 有docker镜像托管(本文中使用Docker Hub)
- 在服务器上已生成了SSH密钥
需要创建的文件
- Dockerfile 用于构建Docker镜像
- .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变量
Key | Value | 说明 |
APP_NAME | appdemo | 应用名 |
APP_PORT | 8080 | 端口 |
DOCKER_USER | user | docker hub用户名 |
DOCKER_PASSWORD | password | docker hub密码 |
SERVER_HOST | 10.0.x.x | 服务器地址 |
SSH_PRIVATE_KEY | -----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNza****** -----END OPENSSH PRIVATE KEY----- | ssh私钥 |
SPRING_ACTIVE_PROFILE | production | spring 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组件介绍
发表评论