gitlab 的CI/CD (一)

news2024/11/13 22:49:54

前言

GitLab CI/CD 是一个内置在GitLab中的工具,用于通过持续方法进行软件开发:

  • Continuous Integration (CI)  持续集成
  • Continuous Delivery (CD)     持续交付
  • Continuous Deployment (CD)   持续部署

  持续集成的工作原理是将小的代码块推送到Git仓库中托管的应用程序代码库中,并且每次推送时,都要运行一系列脚本来构建、测试和验证代码更改,然后再将其合并到主分支中。

  持续交付和部署相当于更进一步的CI,可以在每次推送到仓库默认分支的同时将应用程序部署到生产环境。

  这些方法使得可以在开发周期的早期发现bugs和errors,从而确保部署到生产环境的所有代码都符合为应用程序建立的代码标准。

原理

gitlab 本身只有 CI/CD 的接口,真正执行 CI/CD 任务的是 gilab runner,它负责与 gitlab 通信,接受 CI/CD 任务,并交给 Executor 执行,Executor 有7种类型:

Docker

Shell

Kubernetes

SSH

VirtualBox

Parallels

Custom

Executor的类型在注册 Runner 的时候确定,

执行流程图:

gitlab-runner的安装与注册(linux-centos)

本文介绍Executor为shell类型

安装

sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

# 赋予执行权限
sudo chmod +x /usr/local/bin/gitlab-runner

# 创建一个 GitLab Runner 用户
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

# 安装并作为服务运行
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner

# 启动
sudo gitlab-runner start
# 重启
sudo gitlab-runner restart
# 停止
sudo gitlab-runner stop

注册

# 注册 runner
[root@localhost ~]# sudo gitlab-runner register --url http://1xx.1xx.x.2xx4:xxxx/ --registration-token GR1xxxxxxxxxxx
Runtime platform                                    arch=amd64 os=linux pid=378174 revision=66269445 version=17.3.1
Running in system-mode.        
                    
# 输入 gitlab 的地址                                                   
Enter the GitLab instance URL (for example, https://gitlab.com/):
[http://1xx.1xx.x.2xx4:xxxx/]: 

# 输入 gitlab 上的 token,就是上面的
Enter the registration token:
[GR1xxxxxxxxxxx]: 

# 输入描述信息 
Enter a description for the runner:
[localhost.localdomain]: build runner

# 输入标签,这个gitlab-runner输入一个标记,这个 tag 非常重要,在后续的使用过程中需要使用这个 tag 来指定 gitlab-runner
Enter tags for the runner (comma-separated):
build
Enter optional maintenance note for the runner:

WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see https://docs.gitlab.com/ee/ci/runners/new_creation_workflow 
Registering runner... succeeded                     runner=GR1348941w5ZUUAPZ

# 选择执行器,我选的是 shell
Enter an executor: custom, ssh, virtualbox, docker-windows, docker+machine, docker-autoscaler, shell, parallels, docker, kubernetes, instance:
shell

# 可以看到,注册成功了 
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
 
Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml" 

刷新gitlab页面,显示已注册成功

 runner配置

runner 注册完成后会在/etc/gitlab-runner/ 目录下生成一个 config.toml 的文件。这个就是 runner 的配置文件

 

gitlab项目配置

为项目中添加 .gitlab-ci.yml 文件,表示启动的 CI/CD 。默认提交动作会自动运行该 .gitlab-ci.yml 中定义的作业 

当文件提交后,会发现流水线已跑

 gitlab-ci.yml文件配置参考

将制品上传至软件包库中,实现产品库的概念;

后端项目常用

# 全部打包


stages:
  - build
  - deploy

build:
  stage: build
  script:
    - echo "Starting build process"
    - mvn clean package -T 16C
    - echo "Packaging JAR file into ZIP"
    - mkdir -p "xxx"
    - cp $(find . -name '*.jar') "xxx/"
    - zip -r "xxx.zip"  "xxx/"
    - echo "Build process completed"
    # 获取tag描述
    - |
      TAG_DESC=$(git show "${CI_COMMIT_TAG:-latest}" --no-patch --no-notes --pretty='%B' )
      echo "$TAG_DESC" > update_description.txt
  artifacts:
    paths:
      - "xxx.zip"
    expire_in: 3 months
  rules:
    - if: '$CI_COMMIT_TAG'
      when: always
    - when: never

deploy:
  stage: deploy
  needs:
    - build
  script:
    - echo "上传软件包库"
    - |
      # 上传包
      curl --header "JOB-TOKEN: $CI_JOB_TOKEN" \
           --upload-file "xxx.zip" \
           "http://172.xx.xx.xx/api/v4/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG:-latest}/xxx.zip"
      # 上传描述信息
      curl --header "JOB-TOKEN: $CI_JOB_TOKEN" \
           --upload-file "update_description.txt" \
           "http://172.xx.xx.xx/api/v4/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG:-latest}/update_description.txt"
  rules:
    - if: '$CI_COMMIT_TAG'
      when: always
    - when: never
#差异化打包(新建tag时构建)(对比最新的tag与上次tag,将有目录更改的jar包且排除api.jar进行打包)

stages:
  - build
  - deploy
build:
  stage: build
  script:
    - echo "Starting build process"

    # 获取最新标签和上次标签
    - |
      LATEST_TAG=$(git describe --tags --abbrev=0)
      PREV_TAG=$(git describe --tags --abbrev=0 $(git rev-list --tags --max-count=2 --skip=1) | tail -n 1)
      echo "Latest tag: ${LATEST_TAG}"
      echo "Previous tag: ${PREV_TAG}"
    # 获取tag描述
    - |
      TAG_DESC=$(git show "${CI_COMMIT_TAG:-latest}" --no-patch --no-notes --pretty='%B' )
      echo "$TAG_DESC" > update_description.txt

    # 查找修改的目录
    - |
      CHANGED_DIRS=$(git diff --name-only "${PREV_TAG}" "${LATEST_TAG}" | awk -F/ '{print $1}' | sort -u)
      echo "Changed directories: ${CHANGED_DIRS}"

    # 全项目构建
    - mvn clean package -T 16C

    # 打包变化的目录中的 JAR 文件
    - |
      if [ -n "$CHANGED_DIRS" ]; then
        PACKAGE_DIR="zzzz"
        mkdir -p "$PACKAGE_DIR"
        for dir in ${CHANGED_DIRS}; do
          find "$dir" -type f -name '*.jar' ! -name '*api.jar' -exec cp {} "${PACKAGE_DIR}/" \;
        done
        zip -r "${PACKAGE_DIR}.zip" "${PACKAGE_DIR}/"
      else
        echo "No changes in directories, no JAR files to package"
      fi

  artifacts:
    paths:
      - "zzzz.zip"
      - "update_description.txt"
    # 过期时间
    expire_in: 1 week

  rules:
    - if: '$CI_COMMIT_TAG'
      when: always
    - when: never

deploy:
  stage: deploy
  needs:
    - build
  script:
    - echo "上传软件包库"
    - |
      # 上传包
      curl --header "JOB-TOKEN: $CI_JOB_TOKEN" \
           --upload-file "zzzz.zip" \
           "http://172.xx.xx.xx/api/v4/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG:-latest}/zzzz.zip"
      # 上传描述信息
      curl --header "JOB-TOKEN: $CI_JOB_TOKEN" \
           --upload-file "update_description.txt" \
           "http://172.xx.xx.xx/api/v4/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG:-latest}/update_description.txt"
  rules:
    - if: '$CI_COMMIT_TAG'
      when: always
    - when: never

效果图

 

前端项目常用 

stages:
  - build
  - deploy

build:
  stage: build
  script:
    - echo "开始打包 xxx"
    - yarn cache clean
    - yarn install --network-concurrency=16 --registry=https://registry.npmmirror.com
    - yarn build
    - echo "打包完成 xxx"
    - echo "进行压缩"
    - tar -czf "dist.tar.gz" -C dist .
    # 获取tag描述
    - TAG_DESC=$(git show "${CI_COMMIT_TAG:-latest}" --no-patch --no-notes --pretty='%B' )
    - echo "$TAG_DESC" > update_description.txt
  artifacts:
    paths:
      - "dist.tar.gz"
      - "update_description.txt"
    # 过期时间
    expire_in: 1 week

  rules:
    - if: '$CI_COMMIT_TAG'
      when: always
    - when: never

deploy:
  stage: deploy
  needs:
    - build
  script:
    - echo "上传软件包库"
    - |
      # 上传包
      curl --header "JOB-TOKEN: $CI_JOB_TOKEN" \
           --upload-file "dist.tar.gz" \
           "http://172.xx.xx.xx/api/v4/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG:-latest}/dist.tar.gz"
      # 上传描述信息
      curl --header "JOB-TOKEN: $CI_JOB_TOKEN" \
           --upload-file "update_description.txt" \
           "http://172.xx.xx.xx/api/v4/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG:-latest}/update_description.txt"
  rules:
    - if: '$CI_COMMIT_TAG'
      when: always
    - when: never

 效果图

 

 H5项目常用

stages:
  - build
  - deploy

build:
  stage: build
  script:
    - echo "开始打包 zzzx-app"
    - yarn cache clean
    - yarn install --network-concurrency=16 --registry=https://registry.npmmirror.com
    - yarn run build:h5
    - echo "打包完成 zzzx-app"
    - echo "进行压缩"
    - tar -czf "h5.tar.gz" -C dist/build/h5 .
    # 获取tag描述
    - TAG_DESC=$(git show "${CI_COMMIT_TAG:-latest}" --no-patch --no-notes --pretty='%B' )
    - echo "$TAG_DESC" > update_description.txt
  artifacts:
    paths:
      - "h5.tar.gz"
      - "update_description.txt"
    # 过期时间
    expire_in: 1 week
  rules:
    - if: '$CI_COMMIT_TAG'
      when: always
    - when: never

deploy:
  stage: deploy
  needs:
    - build
  script:
    - echo "上传软件包库"
    - |
      # 上传包
      curl --header "JOB-TOKEN: $CI_JOB_TOKEN" \
           --upload-file "h5.tar.gz" \
           "http://172.xx.xx.xx/api/v4/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG:-latest}/h5.tar.gz"
      # 上传描述信息
      curl --header "JOB-TOKEN: $CI_JOB_TOKEN" \
           --upload-file "update_description.txt" \
           "http://172.xx.xx.xx/api/v4/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG:-latest}/update_description.txt"
  rules:
    - if: '$CI_COMMIT_TAG'
      when: always
    - when: never

效果图

 

其他

修改上传文件大小限制配置

流水线执行时,出现如下报错

 解决

 或

修改.gitlab-ci.yml ,在开头配置

variables:
  # 设置工件最大尺寸为50MB
  ARTIFACTS_MAX_SIZE: "50MiB"
 
stages:
  - build
  - deploy
  .....

-------------------------------------

本文结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2155125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE: 深入探索TCP网络编程的奇妙世界(三)

文章目录 TCP核心机制TCP核心机制三: 连接管理建立连接(三次握手)断开连接(四次挥手)三次握手/四次挥手 流程简图 TCP核心机制 书接上文~ TCP核心机制三: 连接管理 建立连接(三次握手),断开连接(四次挥手). 这里的次数指的是网络通信的次数,挥手/握手是形象的比喻(handshake…

PM2.5粉尘传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 4.粉尘浓度转化关系 5.空气污染指数 三、程序设计 main.c文件 PM25.h文件 PM25.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 GP2Y1014AU是日本夏普公司开发的一款光学灰尘浓度检测传…

探索 Web Speech API:实现浏览器语音识别与合成

引言 Web Speech API 是一项由 W3C 开发的 Web 标准,为开发者提供了在 Web 应用程序中实现语音识别和语音合成的能力。通过 Web Speech API,我们可以让网页与用户进行语音交互,实现更加智能化和便捷的用户体验。本文将深入探讨 Web Speech A…

14 vue3之内置组件trastion全系列

前置知识 Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡: 条件渲染 (使用 v-if)条件展示 (使用 v-show)动态组件组件根节点 自定义 transition 过度效果,你需要对transition组件的name属性自定义。…

【Linux】当前进展

驱动层日志添加了下文件目录,函数,代码行的打印(这里要小心,驱动目录源代码打印日志里边添进程号可能有问题,因为在驱动初始化的时候,内核还没有创建进程,不过猜测可以先不打印进程相关信息&…

python使用vscode 所需插件

1、导读 环境:Windows 11、python 3.12.3、Django 4.2.11、 APScheduler 3.10.4 背景:换系统需要重新安装,避免后期忘记,此处记录一下啊 事件:20240921 说明:记录,方便后期自己查找 2、插件…

Ansys Zemax | 如何使用琼斯矩阵表面

附件下载 联系工作人员获取附件 概览 琼斯矩阵 (Jones Matrix) 表面是一种非常简便的定义偏振元件的方法。这篇文章通过几个示例介绍了如何使用琼斯矩阵。 介绍 光线追迹程序一般只考虑光线的几何属性(位置、方向和相位)。光线传播到一个表面时的全…

SQL - 进阶语法(二)约束

1. SQL约束 约束用于约束表中的数据规则,如若存在违反行为,行为会被约束终止。 • NOT NULL 确保列不能有NULL值 如果添加一行新的数据,不能有null值,否则无法添加 新建表格 CREATE TABLE new_table( ID int NOT NULL, NAME …

梯形区域分解实现避障路径规划全覆盖路径规划

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言(1)功能(2)算法(3)参考链接(4)…

【服务器第二期】mobaxterm软件下载及连接

【服务器第二期】mobaxterm软件下载及连接 前言什么是SSH什么是FTP/SFTP mobaxterm软件介绍mobaxterm软件下载SSH登录使用方法1-新建ssh连接方法2-打开已有的ssh连接方法3-通过ssh命令建立连接 SFTP数据传输方法1-建立ssh连接后直接拖拽方法2-建立sftp连接再拖拽方法3-直接使用…

Nacos配置管理(2)-----配置热更新

有很多的业务相关参数,将来可能会根据实际情况临时调整。例如购物车业务,购物车数量有一个上限,默认是10,对应代码如下: 现在这里购物车是写死的固定值,我们应该将其配置在配置文件中,方便后期…

while(cin>>a)

while(cin>>a)要结束输入CTRLZ换行 输入先调用: istream& operator>> (istream& is, string& str); 但返回值类型时istream, 再调用: 重载的原为(bool)istream,返回值为bool,重载的为括号&#xff0c…

若依前后端分离版项目电子证书查询系统部署到Linux生产环境

项目背景:这个项目之前是PHP语言开发的,采用MVC混编的,前端用Layui框架后端用ThinkPHP8.0框架。客户要求给改成Java语言的,就选用了若依前后端分离低代码版。本地开发调试没有问题,就记录下整个项目上线过程。 服务器背…

How can I stream a response from LangChain‘s OpenAI using Flask API?

题意:怎样在 Flask API 中使用 LangChain 的 OpenAI 模型流式传输响应 问题背景: I am using Python Flask app for chat over data. In the console I am getting streamable response directly from the OpenAI since I can enable streming with a f…

Go语言基础学习02-命令源码文件;库源码文件;类型推断;变量重声明

命令源码文件 GOPATH指向的一个或者多个工作区,每个工作区都会有以代码包为基本组织形式的源码文件。 Go语言中源码文件可以分为三类:命令源码文件、库源码文件、测试源码文件。 命令源码文件: 命令源码文件是程序的运行入口,是每…

k8s技术

---------------第一部分---------------------- 一.应用部署方式 1.传统部署:直接部署在物理机上,简单但是耗资 2.虚拟化部署:一台物理机上面有多个虚拟机,提供了虚拟机间一定的安全,但是增加了操作系统,…

【C++】STL----deque

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:C从小白到高手 🌹往期回顾🌹:【C】STL----stack和queue常见用法 🔖 流水不争,争的是滔滔不息。 文章目录 一…

某花顺爬虫逆向分析

目标网站: aHR0cHM6Ly9xLjEwanFrYS5jb20uY24v 一、抓包分析 携带了cookie,每次请求的cookie都不一样,且不携带cookie不能成功返回数据 hook Cookie代码 _cookie document.cookie Object.defineProperty(document, cookie, {get(){con…

前端框架的选择和对比

前端框架的选择取决于项目的具体需求、团队的技术栈以及长期的技术规划。以下是几个主流前端框架的对比和选择建议: 1. React 特点: 由Facebook开发,基于组件化的设计思想,使用JSX语法,数据流单向,生态系统丰富。适用…

Navicate 链接Oracle 提示 Oracle Library is not loaded ,账号密码都正确地址端口也对

Navicate 链接Oracle 提示 Oracle Library is not loaded ,账号密码都正确地址端口也对的问题 解决办法 出现 Oracle Library is not loaded 错误提示,通常是因为 Navicat 无法找到或加载 Oracle 客户端库(OCI.dll)。要解决这个问题&#x…