前言
使用gitlab+gitlab-runner部署一个简单的项目。没有用Jenkins , k8s ,MINIO。gitlab-cicd的命令语法还是需要去学习了解一下的: https://docs.gitlab.com/ee/ci/yaml/
我创建了一个简单的测试项目(JDK 17+ Gradle7.6.1), 你们可以按照自己想部署的项目更改一下条件
如果你们服务器有条件的话,可以加上 MINIO做分布式缓存
项目添加runner:并且是running状态的:
一般常用这两种executor执行模式 docker 和 shell .
- 创建Dockerfile文件:
因为我习惯了用docker运行服务,这个估计很多人项目都会加
FROM openjdk:17
# 第一个是编译镜像时文件位置 第二个是将文件复制到镜像(/data/lib/docker-images/reactive-test-0.0.1-SNAPSHOT.jar)中
COPY build/libs/reactive-test-0.0.1-SNAPSHOT.jar /data/lib/docker-images/reactive-test-0.0.1-SNAPSHOT.jar
# 镜像所暴露出的端口(定义一个不冲突的即可),用于访问镜像使用,后边会和jar的项目端口对接
EXPOSE 8081
# 设置容器的入口程序,直接使用镜像名即可
ENTRYPOINT ["java","-jar","/data/lib/docker-images/reactive-test-0.0.1-SNAPSHOT.jar"]
- 在项目根部创建.gitlab-ci.yml文件,
runner是docker类型 :
可以检查一下配置:
vim /data/gitlab-runner/config/config.toml
我建议加上这个配置,更改对应的runner config:
volumes = ["/cache","/usr/bin/docker:/usr/bin/docker", "/var/run/docker.sock:/var/run/docker.sock"] #使用主机的docker
pull_policy = "if-not-present" # 先检查本地缓存,存在就不下载了
.gitlab-ci.yml文件添加:
cache:
key: $CI_COMMIT_REF_SLUG
paths:
- ./ # 可以改成缓存build或者target目录下面的
stages:
- build
- deploy
build:
stage: build
tags:
- test
only:
refs:
- main
image: azul/zulu-openjdk:17.0.6
# image: gradle:6.7.1-jdk8 # 如果环境是可以用jdk8的话,可以换成这个image
script:
- ./gradlew clean
- ./gradlew build
deploy:
variables:
DOCKER_HOST: unix:///var/run/docker.sock
IMAGE_REGISTRY_URL: "xxxxx" #我是用腾讯云镜像地址的,你们改成自己的
IMAGE_TAG: "$CI_COMMIT_SHA"
IMAGE_FULL_NAME: "$IMAGE_REGISTRY_URL/test-i/test:$CI_COMMIT_REF_SLUG-$IMAGE_TAG"
IMAGE_REGISTRY_USER: "xxxxxxx" #我是用腾讯云镜像仓库分配的user,你们改成自己的
DOCKER_FILE_PATH: "./Dockerfile"
stage: deploy
tags:
- test
only:
refs:
- main
image: docker:stable
services:
- docker:dind
before_script:
- echo "$CI_REGISTRY_USER"
- echo "$CI_REGISTRY_IMAGE"
- echo "$CI_REGISTRY"
- echo "$IMAGE_FULL_NAME"
script:
- docker login $IMAGE_REGISTRY_URL --username=$IMAGE_REGISTRY_USER --password $IMAGE_REGISTRY_PASSWORD
- docker build -t $IMAGE_FULL_NAME -f $DOCKER_FILE_PATH .
- docker push $IMAGE_FULL_NAME
- if [ $(docker ps -aq --filter name=reactive-test) ]; then docker rm -f reactive-test;fi
- docker run --name reactive-test -d -p 8081:20000 $IMAGE_FULL_NAME
# - docker rmi $IMAGE_FULL_NAME # 如果执行器是用shell的话,可以加上
runner是shell类型 :
.gitlab-ci.yml文件添加:
cache:
key: $CI_COMMIT_REF_SLUG
paths:
- ./build/libs/*.jar # 可以改成缓存build或者target目录下面的
stages:
- build
- deploy
build:
stage: build
tags:
- test
only:
refs:
- main
script:
- ./gradlew clean
- ./gradlew build
deploy:
variables:
DOCKER_HOST: unix:///var/run/docker.sock
IMAGE_REGISTRY_URL: "xxxxx" #我是用腾讯云镜像地址的,你们改成自己的,也可以自己搭建,搭建命令后面会补充自己去尝试,自己尝试创建仓库和空间
IMAGE_TAG: "$CI_COMMIT_SHA"
IMAGE_FULL_NAME: "$IMAGE_REGISTRY_URL/test-i/test:$CI_COMMIT_REF_SLUG-$IMAGE_TAG"
IMAGE_REGISTRY_USER: "xxxxxxx" #我是用腾讯云镜像仓库分配的user,你们改成自己的
DOCKER_FILE_PATH: "./Dockerfile"
stage: deploy
tags:
- test
only:
refs:
- main
before_script:
- echo "$CI_REGISTRY_USER"
- echo "$CI_REGISTRY_IMAGE"
- echo "$CI_REGISTRY"
- echo "$IMAGE_FULL_NAME"
script:
- docker login $IMAGE_REGISTRY_URL --username=$IMAGE_REGISTRY_USER --password $IMAGE_REGISTRY_PASSWORD
- docker build -t $IMAGE_FULL_NAME -f $DOCKER_FILE_PATH .
- docker push $IMAGE_FULL_NAME
- if [ $(docker ps -aq --filter name=reactive-test) ]; then docker rm -f reactive-test;fi
- docker run --name reactive-test -d -p 8081:20000 $IMAGE_FULL_NAME
after_script:
# 查找$IMAGE_REGISTRY_URL/test-i/test:前缀名字的镜像id并删除,但是这里会删除不了正在运行的镜像,这个提示会有error,但并没有影响,也可以改成删除全部无用的镜像:docker image prune -a
- docker image rm `docker images -q --filter reference=$IMAGE_REGISTRY_URL/test-i/test:*`
如果出现问题:
Got permission denied while trying to connect to the Docker daemon socket…
提供几种办法思路:
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $XXX docker #检测当前用户是否已经在docker用户组中,其中XXX为用户名
sudo gpasswd -a $USER docker #将当前用户添加至docker用户组
newgrp docker #更新docker用户组`
sudo usermod -aG docker ${USER}
sudo chmod 666 /var/run/docker.sock
补充:创建Registry
docker pull registry
docker run -d \
--name gitlab-registry \
--restart always \
-p 5000:5000 \
-v /data/gitlab-registry:/var/lib/registry \
registry