.gitlab-ci.yml文件参数配置和使用

天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。

文章目录


K8S自动化部署JAVA项目(Gitlab CI/CD)请参考文章:K8S部署Java项目(Gitlab CI/CD自动化部署)

一、介绍

既然你用到了.gitlab-ci.yml文件,应该对Gitlab CI/CD有一定的了解,简单说一下

  • Gitlab CI/CD是代码仓库的一个功能,用于项目的持续集成(Continuous Integration)、持续交付(Continuous Delivery)、持续部署(Continuous Deployment),是现在主流的devops工具
  • 项目注册gitlab-runner工具后,只要更新代码,gitlab-runner工具就会执行.gitlab-ci.yml文件中的任务,实现CI/CD
  • .gitlab-ci.yml文件必须位于项目根目录下

二、配置

关于.gitlab-ci.yml文件中的参数详解,请参考另一篇:.gitlab-ci.yml文件参数

也可参考官网文档(英文):https://docs.gitlab.com/ee/ci/yaml/

如何配置?

以下为java项目(springboot)为例,配置该文件

.gitlab-ci.yml

yml 复制代码
#全局变量,自定义变量名和值,全局引用,方便修改
#系统变量与自定义变量的使用,以$开始的表示系统变量的引用,加${}的表示自定义变量的引用
variables:
  #harbor镜像仓库IP
  HARBOR_IP: 172.30.0.224
  #harbor镜像仓库端口
  HARBOR_PORT: 8443
  #harbor仓库URL
  HARBOR_URL: ${HARBOR_IP}:${HARBOR_PORT}
  #harbor镜像仓库账号
  HARBOR_USERNAME: admin
  #harbor镜像仓库密码
  HARBOR_PASSWORD: Harbor12345

  #用于存放项目镜像的harbor镜像仓库项目地址
  IMAGE_HARBOR_REPOSITORY: ${HARBOR_IP}:${HARBOR_PORT}/k8s-demo

  #构建的镜像名称定义
  #PROJECT_IMAGE_NAME: $CI_PROJECT_NAME-$CI_PROJECT_ID
  PROJECT_IMAGE_NAME: k8s-springboot
  #构建的镜像标签定义
  #PROJECT_IMAGE_TAG: $DEPLOY_TIME_TAG-$CI_PIPELINE_ID-$CI_COMMIT_REF_NAME
  PROJECT_IMAGE_TAG: v20240204

  #本地jar包存放位置
  #PROJECT_JAR_DIR: $HOME/.m2/$CI_PROJECT_NAME-$CI_PROJECT_ID-$CI_COMMIT_REF_NAME
  PROJECT_JAR_DIR: /root/jar/k8s-project
  #maven的依赖存放文件夹路径
  MAVEN_REPOSITORY_DIR: /root/maven/.m2
  #本地镜像存储路径(容器内)
  CI_IMAGE_DIR: /root/images
  #CI_IMAGE_DIR: /root/k8s-project/app.jar

#定义任务阶段,任务执行顺序会根据列举顺序执行,前一个stage不执行完或者报错,后面的stage不会开始,不同job相同stage的任务会并行执行
#package打包,build构建,deploy部署
stages:
  - package
  - build
  - test
  - deploy

#前置脚本,适用于全局,所有任务开始之前执行该脚本命令
before_script:
  - echo: "project ci/cd task start"
  #创建目录用于存储maven依赖,仅用于测试before脚本,暂时还没用到该文件夹
  - mkdir -p ${MAVEN_REPOSITORY_DIR}


#任务部分,根据定义的stage顺序来执行任务
#如想跳过该任务,可在任务名称前加上英文句号".",如.job1-package,执行时会跳过该任务
#打包项目
job1-package:
  #任务阶段
  stage: package
  #任务引用的镜像
  image: docker:latest
  #任务执行选用的runner的标签,定义后会根据标签选用对应的runner执行任务
  tags:
    - runner-01
  #指定此job只对master分支生效
  only:
    - master
  #执行脚本,maven打包,创建文件夹,将jar包复制到文件夹中
  script:
    #提示信息打印
    - echo: '打包任务开始---->清理之前的jar包,打包,将包复制到容器中'
    #1项目打包,以下5个打包方式任选其一即可,可在package前加上clean来先清理
    #- mvn package
    #- mvn clean package
    #2使用prod配置文件打包,-PprofileName表示激活指定的构建配置文件,-P后加配置文件名称
    #- mvn package -Pprod
    #3跳过测试打包,-Dmaven.test.skip=true表示跳过单元测试
    - mvn clean package -Dmaven.test.skip=true
    #4清空并打包,跳过单元测试
    #- mvn clean package -Dmaven.test.skip=true
    #5更新依赖并打包,强制更新snapshots和releases
    #- mvn package -U
    #删除jar包,此步已在部署环节执行,个人也觉得在构建镜像后删除比较合适,当然也可以在这里打包前检查并删除
    #- rm -rf ${PROJECT_JAR_DIR}/app.jar
    #创建文件夹存储打包文件
    - mkdir -p ${PROJECT_JAR_DIR}
    #将打包文件复制到指定文件夹中,这里需要注意,打包后的jar包文件名称需要在项目的pom.xml中配置指定,不然默认生成的jar会是项目名-版本号.jar的格式
    - cp target/app.jar ${PROJECT_JAR_DIR}/app.jar
  #因为后续要用到这个任务打的包,后续配合dependencies在其他任务引用
  #artifacts:
    #paths:
      #- ${PROJECT_JAR_DIR}/*.jar


#任务部分,根据定义的stage顺序来执行任务
#构建镜像
job2-build:
  #任务阶段
  stage: build
  #任务引用的镜像
  image: docker:latest
  #任务执行选用的runner的标签,定义后会根据标签选用对应的runner执行任务
  tags:
    - runner-01
  #使用的docker服务,这里不是很清楚,但可以省略该部分,暂时不用它
  #services:
    #- 191.128.0.2:8443/test01/docker-hs:202401-dind
  #局部前置脚本命令,仅作用于此任务部分,创建用于存储项目镜像的本地路径,前面我们定义了全局变量,这里创建目录
  before_script:
    - mkdir -p ${CI_IMAGE_DIR}
  #执行脚本,列举jar包文件夹,构建镜像,打标签,推送镜像,删除镜像
  script:
    #提示信息打印
    - echo '打包任务开始---->清理之前的jar包,打包,将包复制到容器中'
    #列举当前jar包,查看是否已复制过来
    - ls -l ${PROJECT_JAR_DIR}
    #以下构建镜像部分会使用Dockerfile文件进行构建
    #.表示将镜像打标签后存放在当前位置,也可以存到别的位置,写成别的文件夹路径即可
    - docker build -t ${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG} .
    #如果Dockerfile文件在别的目录下,如./src/Dockerfile,可以用-f指定文件位置
    #- docker build -t ${CI_IMAGE_DIR}:${PROJECT_IMAGE_TAG} -f ./src/Dockerfile .
    #将镜像推送到仓库
    - docker push ${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG}
    #列举镜像是否已生成
    - docker images | ${PROJECT_IMAGE_NAME}
    #也是打标签,同上,但是可以将之前的名称改为新名称,此命令用于将镜像打标签后上传到harbor镜像仓库
    - docker -t  ${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG} ${IMAGE_HARBOR_REPOSITORY}/${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG}
    #将镜像推送到到harbor仓库
    - docker push ${IMAGE_HARBOR_REPOSITORY}/${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG}
    #删除jar包
    - rm -rf ${PROJECT_JAR_DIR}/app.jar
    #删除打标签后用于推送到harbor仓库的的镜像
    - docker rmi -f ${IMAGE_HARBOR_REPOSITORY}/${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG}
    #再删除原始构建的镜像
    - docker rmi -f ${CI_IMAGE_DIR}:${PROJECT_IMAGE_TAG}


#任务部分,根据定义的stage顺序来执行任务
#测试
#在任务前加英文点.来忽略任务,流程会跳过该任务的执行
.job3-test:
  #任务阶段
  stage: test
  #任务引用的镜像
  image: 191.128.0.2:8443/k8s-demo:$CI_COMMIT_REF_NAME
  #任务执行选用的runner的标签,定义后会根据标签选用对应的runner执行任务
  tags:
    - runner-01
  #指定此job只对master分支生效
  only:
    - master
  #执行脚本,部署服务
  script:
    - echo ${IMAGE_HARBOR_REPOSITORY}:$CI_COMMIT_REF_NAME
    - kubectl apply -f /etc/k8s-demo.yaml

#任务部分,根据定义的stage顺序来执行任务
#
job4-deploy:
  #任务阶段
  stage: deploy
  #任务引用的镜像,此处为项目部署所需要的项目镜像(前面build阶段构建的镜像),从harbor上拉取,速度很快
  image: ${IMAGE_HARBOR_REPOSITORY}/${PROJECT_IMAGE_NAME}:${PROJECT_IMAGE_TAG}
  #任务执行选用的runner的标签,定义后会根据标签选用对应的runner执行任务
  tags:
    - runner-01
  #指定此job只对master分支生效
  only:
    - master
  #执行脚本,部署服务
  script:
    - echo '项目部署--->开始部署,缓存部署,pod部署,服务部署'
    #部署java项目的yaml文件都放在/sb-p/sb-test文件夹下,需提前准备好
    - kubectl apply -f /sb-p/sb-test/sb-pvc.yaml
    - kubectl apply -f /sb-p/sb-test/sb-dplm.yaml
    - kubectl apply -f /sb-p/sb-test/sb-svc.yaml
  #配合artifacts参数使用,使用package阶段任务的打包环境
  #dependencies:
    #- package

三、使用

.gitlab-ci.yml文件的使用如下

先在gitlab配置runner,然后准备项目,当代码提交更新,runner会执行.gitlab-ci.yml文件脚本,会自动构建、部署项目

然后访问即可

具体项目如何基于Gitlab CI/CD实现自动化部署可参考文章:K8S部署Java项目(Gitlab CI/CD自动化部署)


感谢阅读,祝君暴富!

相关推荐
yeyuningzi2 分钟前
Debian 12环境里部署nginx步骤记录
linux·运维·服务器
小鑫记得努力6 分钟前
Java类和对象(下篇)
java
binishuaio10 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE12 分钟前
【Java SE】StringBuffer
java·开发语言
老友@12 分钟前
aspose如何获取PPT放映页“切换”的“持续时间”值
java·powerpoint·aspose
wclass-zhengge16 分钟前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇22 分钟前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
wrx繁星点点27 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
Upaaui30 分钟前
Aop+自定义注解实现数据字典映射
java
zzzgd81630 分钟前
easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头
java·excel·表格·easyexcel·导入导出