从gitlab自动部署

把source推到gitlab上后,自动部署到docker

通知

通过gitlab的webhook功能,当有source push到gitlab上,自动触发回调,然后执行shell。
可以使用这个自作的webhook接受程序
https://hub.docker.com/r/ebusiness/webhook

shell

git

用git clone或者pull最新source。

1
2
3
4
5
6
7
8
PRIVATE_KEY=/id_rsa
WORK_ROOT=/java
APP_PATH=${WORK_ROOT}/app-api
if [[ ! -d ${APP_PATH} ]]; then
docker run --rm -v ${PRIVATE_KEY}:/root/id_rsa -v ${WORK_ROOT}:/git alpine/git clone --single-branch --branch development git@gitlab.com:app-api.git --config core.sshCommand="ssh -i/root/id_rsa -F /dev/null -oStrictHostKeyChecking=no"
else
docker run --rm -v ${PRIVATE_KEY}:/root/id_rsa -v ${WORK_ROOT}:/git alpine/git pull
fi

build

1
2
3
4
5
docker run --rm  -v /var/run/docker.sock:/var/run/docker.sock -v gradle-cache:/root/.gradle -v ${APP_PATH}:/work -w /work openjdk:11 sh -c '
ls -la
sh ./gradlew clean
sh ./gradlew bootBuildImage --imageName=app-api --pullPolicy IF_NOT_PRESENT
'

手动分层

上面使用的是spring boot的plugin自带的bootBuildImage来构建的image,当然构建的时候是用到了spring boot的分层的,每次构建时会尽可能的变更最少的层。但是因为上面用到的构建image,以及运行image都是固定的,如果用户想使用自己的image的话,需要手动构建

1
2
3
4
5
6
7
8
9
10
11
12
FROM amazoncorretto:17-alpine as builder
WORKDIR application
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} application.jar
RUN java -Djarmode=layertools -jar application.jar extract
FROM amazoncorretto:17-alpine
WORKDIR application
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

先build程序,然后build镜像

1
2
./gradlew bootJar
docker build .

deploy

1
2
3
4
5
6
7
8
9
10
LOG_PATH=/logs
DOCKER_NAME=app-api
PROFILE=dev
docker rm -f ${DOCKER_NAME}
docker run -d --restart=always --name ${DOCKER_NAME} \
--network my-nw \
-v ${LOG_PATH}:/logs \
-e "TZ=Asia/Tokyo" \
-e "SPRING_PROFILES_ACTIVE=dev" \
-e "JAVA_TOOL_OPTIONS=-DSPECIFY_LOG_PATH=/logs -Xmx256M -Xms256M" app-api

定期清理垃圾image

1
docker rmi $(docker images -f "dangling=true" -q)