这里使用的maven镜像是:maven:3.8.2-openjdk-8-slim
众所周知maven默认会去,中央仓库下载依赖,国内由于网络原因,可能下载会比较慢,所以需要修改其配置。
个人采用了两种方式进行处理:
这里采用第二种方式,这种方式需修改注册runner的配置
gitlab-runner register -n \
--url http://blog_gitlab.kalpana.top:9080/ \
--registration-token xxxxxx\
--executor docker \
--description "bind maven" \
--tag-list "bind maven" \
--docker-image "alpine:latest" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock \
--docker-volumes /opt/runner/maven/settings.xml:$MAVEN_HOME/conf/settings.xml
其中 /opt/runner/maven/settings.xml就是自定义的配置文件,只是改了个 阿里云的仓库地址,私服地址自己改
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
执行成功后,对应runner的挂载配置应该是
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/opt/runner/maven/settings.xml:/usr/share/maven/conf/settings.xml", "/cache"]
项目根目录添加 .gitlab-ci.yml 配置,如下
stages:
- package
package:
stage: package
tags:
- bind maven
only:
- dev
image: maven:3.8.2-openjdk-8-slim
before_script:
- echo "开始执行任务"
- echo $MAVEN_HOME
- ls -al $MAVEN_HOME/conf
script:
- mvn clean -Dmaven.test.skip=true
执行一次流水线
可以看到maven仓库地址已经切换到阿里云仓库了。
缓存maven仓库及构建工件传递
如果不对maven仓库进行缓存,那每次构建都会去下载全量的依赖组件,会比较耗时,先设置maven仓库路径
variables:
MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dmaven.test.skip=true -Dmaven.javadoc.skip=true"
然后job内设置缓存目录及工件传递目录
cache:
key: mvn_repo
paths:
- .m2/repository
artifacts:
paths:
- target/*.jar
这两者功能类似,但有区别,具体可以参考上一篇文章,这样设置后,就不必每次构建都去下载依赖组件了,极大提升构建速度。
通过上一步,已经将项目的构建包缓存到了CI流程中,接下来就可以借助docker将jar包打包成镜像,并发布到仓库。
增加一个 stage
- build
对应的job定义如下
build:
stage: build
image: docker:20.10.8
before_script:
- echo "开始构建docker镜像"
script:
- docker build -t docker-springboot:$CI_PIPELINE_ID .
tags:
- bind maven
only:
- dev
提交,开始构建
可以看到docker镜像已经构建成功,也可以在runner机器上查看
[root@origin ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-springboot 3 97bf403c98b6 3 minutes ago 131MB
推送镜像到远程仓库
要让应用服务器部署最新的镜像,就需要将镜像推送到镜像仓库,目前默认采用docker hub仓库,后续会有docker私服的介绍,push之前需要登录对应的仓库,没有账号的可以去注册一个,官方注册地址
接下来开始推送镜像到远程仓库,账号密码可以通过gilab参数的形式传递
docker login -u $REGISTRY_USERNAME -p $REGISTRY_PASSWORD
提交触发流水线,可以看到已经登录成功
在推送镜像之前有个点需要说明一下;
docker 仓库的完整路径格式为 ip:port/域名 + 用户 + 仓库 + 标签(默认为latest)构成;
而我们平常使用 docker pull xxx 完整的命令应该是
docker pull docker.io/library/xxx:latest,而 library这个用户是官方仓库,个人账户应该是自己的用户名,所以我们在推送之前需要将本地镜像名称改成带自己前缀的名称,当然也可以在 镜像构建阶段就指定完整的名称,所以修改后的构建命令应该是
docker build -t tanxs/docker-springboot:$CI_PIPELINE_ID .
提交触发流水线
构建成功
[root@origin ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tanxs/docker-springboot 3 4ade8d8f4322 About a minute ago 131MB
添加推送远程仓库脚本
docker push tanxs/docker-springboot:$CI_PIPELINE_ID
查看远程仓库
此处使用SSH,远程部署,假设已配置好SSH免密登录
在流水线配置文件中增加部署阶段
stages:
- deploy
增加部署job
deploy:
stage: deploy
image: docker:20.10.8
# 本job不下载工件
dependencies: []
variables:
deploy_path: /opt/docker-compose/app
before_script:
- echo "开始部署远程服务器"
- pwd
- ls -al
script:
- echo "开始部署"
- cat /etc/os-release
- cd ~
- ls -al
- ssh [email protected] -t "cd $deploy_path && export VERSION=$CI_PIPELINE_ID && docker-compose down && docker-compose up -d"
tags:
- bind maven
only:
- dev
提交流水线