gitlab runner .gitlab-ci.yml 中的cache 和 artifacts 的区别
cache
cache 关键字使用来做缓存的。作业可以在cache 中缓存一个或者是多个文件之后可以下载,目的是使用 相同缓存
的后续作业可以不用再次下载文件。所以整个cicd 过程可以执行的更快。
使用场景:主要是用来缓存 比如 java maven 项目中的依赖项。
特点:
cache
使用的路径只能是项目文件的相对路径。- 在运行下一个Job的时候,会默认把前一个Job新增的资源删除得干干静静。
- cache 缓存生成的文件会在本地 runner 中的 /cache 目录中。不需要像 artifacts 一样将文件上传到gitlab中提供网页端下载缓存文件。
使用效果
cache 特别需要注意的地方
gitlab runner 有个点是需要注意的。如下图所示每个节点产生的文件都会被删除掉。
所以可以使用cache 来存储各个环节所产生的文件。并且只存储与runner中不会上传到gitlab 服务器,所以效率上会比artifacts 会好很多。
Artifacts
- 主要的区别于cache可以提供网页下载我们打好的包。支持对这个包的重新部署。
- 默认这个包的保存时间为30天。
在使用中的缺点就是会将 buid 打好的包上传到 gitlab 服务,也就是说 打包生成的文件需要传输到gitlab 服务器,通常这样会照常不必要的网络开销。所以我们可以选择使用 cache
的方式来存储各个阶段产生的公共文件。
实例说明 springboot + docker 项目通过runner 发布。
1.安装runner
2. 注册到gitlab 中
3. 在项目的根目录中添加.gitlab-ci.yml
的配置文件
配置文件说明
image: docker:latest #1
variables: #2
DOCKER_DRIVER: overlay2
TAG: root/hello-spring:v0.1 # 镜像名称(没有用到)
cache:
key: dockerlayerdemo-ci-cache
paths:
- .m2/repository/
- /school-city-front-server/target/*.jar
- /school-city-backend-server/target/*.jar
services: #4
- docker:dind
stages: #5
- package
- deploy
maven-package: #6
only:
- master
image: maven:3.5-jdk-8-alpine
tags:
- school_city
stage: package
script:
- mvn install package -Dmaven.test.skip=true
cache:
key: dockerlayerdemo-ci-cache
paths:
- school-city-backend-server/target/school-city-backend-server-1.0.0.jar
- school-city-front-server/target/school-city-front-server-1.0.0.jar
# 两个阶段必须配置相同cache 才能生效。
build-master: #8
only:
- master
tags:
- school_city
stage: deploy
cache:
key: dockerlayerdemo-ci-cache
paths:
- .m2/repository/
- school-city-front-server/target/*.jar
- school-city-backend-server/target/*.jar
script:
- pwd
- ssh scooolcity "
docker cp gitlab-runner:/home/gitlab-runner/builds/yvVVvMyy/0/myschoolcity/school-city/school-city-backend-server/target/school-city-backend-server-1.0.0.jar /app/schoolcity-gitlab/springboot/jar;
cd /app/schoolcity-gitlab/springboot/jar && rm -rf app.jar.bak $$ mv app.jar app.jar.bak && mv school-city-backend-server-1.0.0.jar app.jar;
cd .. && docker build -t schoolcity .;
docker rm -f sc || true;
docker run -d -p 16005:8080 -v /app/schoolcity-gitlab/springboot/log:/var/logs/schoolcity -v /etc/localtime:/etc/localtime --name sc schoolcity;
"
- ssh schoolcity "
docker cp gitlab-runner:/home/gitlab-runner/builds/yvVVvMyy/0/myschoolcity/school-city/school-city-front-server/target/school-city-front-server-1.0.0.jar /app/schoolcity-gitlab/springbootfront/jar;
cd /app/schoolcity-gitlab/springbootfront/jar && rm -rf app.jar.bak $$ mv app.jar app.jar.bak && mv school-city-front-server-1.0.0.jar app.jar;
cd .. && docker build -t schoolcityfront .;
docker rm -f scft || true;
docker run -d -p 16006:8081 -v /app/schoolcity-gitlab/springbootfront/log:/var/logs/schoolcity -v /etc/localtime:/etc/localtime --name scft schoolcityfront;
"
目录结构说明
配置dockerfile
FROM java:8
VOLUME /tmp
COPY /jar/app.jar app.jar
ENV PORT 8080
EXPOSE $PORT
ENV TZ Asia/Shanghai
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/app.jar"]