首页 > 其他分享 >手把手带你搭建CI/CD工作流

手把手带你搭建CI/CD工作流

时间:2025-01-11 22:54:20浏览次数:1  
标签:CI name 手把手 app drone DRONE build docker CD

一、什么是CI/CD?

持续集成(ContinousIntergration,CI)是在源代码变更后自动检测、拉取、构建和进行自动化测试的过程,属于开发人员的自动化流程。
解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题。其基本思路是,自动化监测代码仓库的变化并拉取最新代码、编译构建和自动化测试。
CI的触发方式可分为以下三种:

轮询:按一定的时间间隔反复询问代码仓库是否发生了变更,若发生了变更则开启CI流程。

定时:定期从代码仓库拉去最新代码并进行构建与测试,不必关心是否有变更发生。

推送:当代码仓库发生变更时,通过推送的方式(如webhook)通知CI进行任务,这需要CI环境被代码仓库访问到。

持续部署(ContinousDelivery,CD)通常是指开发人员对应用的更改会自动进行错误测试,并上传到存储库(如 GitHub 或容器注册表),然后由运维团队将其部署到实时生产环境中。持续部署指的是自动将开发人员的更改从存储库发布到生产环境,它以持续交付为基础,实现了管道后续阶段的自动化。 CI/CD 既可能仅指持续集成和持续交付构成的关联环节,也可以指持续集成、持续交付和持续部署这三项构成的关联环节。

二、什么是Drone?

Drone 是一种基于容器技术的持续交付系统。Drone 使用简单的 YAML 配置文件(docker-compose 的超集)来定义和执行 Docker 容器中的 Pipelines。

Drone 与流行的源代码管理系统无缝集成,包括 GitHub、GitHub Enterprise、Bitbucket、Gitee、Gitlab等。

三、自动化流程

四、基础设施

gitee代码托管:https://gitee.com
drone持续交付系统: https://drone.io
服务器信息:ubuntu、docker、docker-compose

五、部署步骤

5.1 配置Gitee第三方授权

5.2 安装Drone

docker-compose文件配置如下:

version: '3'
services:
  drone-server:
    restart: always  ## 容器自动重启
    image: drone/drone:latest
    ports:
      - "20000:80"  ## 映射到宿主机的端口
    volumes:
      - ./drone_data:/var/lib/drone:rw
    environment:
      - DRONE_GITEE_CLIENT_ID=xxx  ## gitee中生成的CLIENT ID
      - DRONE_GITEE_CLIENT_SECRET=xxxx  ## gitee中生成的SECRET
      - DRONE_SERVER_HOST=192.168.0.2:20000  ## 端口需要和映射至宿主机的一致
      - DRONE_SERVER_PROTO=http
      - DRONE_RPC_SECRET=c64bab058885900124d31250b6780307  ## openssl rand -hex 16 自动生成
      - DRONE_USER_CREATE=username:beiming-talk,admin:true  ## gitee中的用户名
      - TZ=Asia/Shanghai
      #- DRONE_LOGS_DEBUG=true  ## 日志调试开关
      #- DRONE_LOGS_TRACE=true  ## 日志调试开关
      - DRONE_LOGS_TEXT=true
      - DRONE_LOGS_PRETTY=true
      - DRONE_LOGS_COLOR=true
  drone-runner-docker:
    restart: always  ## 容器自动重启
    image: drone/drone-runner-docker:latest
    ports:
      - "20001:3000"  ## 映射到宿主机的端口,用于提供web页面,显示任务执行情况,可不映射
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_HOST=drone-server
      - DRONE_RPC_SECRET=c64bab058885900124d31250b6780307  ## 与server服务中保持一致
      - DRONE_RUNNER_NAME=docker-worker
      - DRONE_RUNNER_CAPACITY=2
      - TZ=Asia/Shanghai 
      - DRONE_DEBUG=true
      #- DRONE_LOGS_DEBUG=true
      #- DRONE_LOGS_TRACE=true
      #- DRONE_UI_USERNAME=admin   ## runner的web页面用户信息
      #- DRONE_UI_PASSWORD=password 
    depends_on:
      - drone-server

5.3 SpringBoot工程配置

根目录下加入:.drone.yml配置文件:

kind: pipeline
type: docker # 定义管道类型
name: 北冥 - 后端服务
# 声明宿主机 映射到 drone执行器的数据卷
volumes:
  - name: maven_cache # 数据卷名称
    host:
      path: /home/drone/cache/maven # 宿主机的绝对路径
  - name: run_script
    host:
      path: /opt/beiming-talk/backend
steps:
  - name: 编译文件
    image: maven:3.8.3-openjdk-17
    pull: if-not-exists # always never
    volumes: # 当前步骤使用(挂载)的卷轴
      - name: maven_cache # 数据卷名称
        path: /root/.m2 # 容器内的绝对路径
      - name: run_script
        path: /app/build
    commands:
      - mvn clean package
      - cp target/beiming-talk-backend-0.0.1-SNAPSHOT.jar /app/build/beiming-talk-backend-0.0.1-SNAPSHOT.jar
      - cp Dockerfile /app/build/Dockerfile
      - cp run.sh /app/build/run.sh
  - name: 部署
    image: appleboy/drone-ssh # SSH工具镜像
    settings:
      host: 172.17.0.1 # 远程连接地址
      username: root # 远程连接账号
      password: xxxxx
      port: 22 # 远程连接端口
      command_timeout: 5m # 远程执行命令超时时间
      script:
        - cd /opt/beiming-talk/backend # 进入宿主机构建目录
        - chmod -R 777 run.sh # 更改为可执行脚本
        - ./run.sh # 运行脚本打包应用镜像并运行
  - name: 构建通知
    image: plugins/webhook
    settings:
      urls: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxx
      content_type: application/json
      template: |
        {
          "msgtype": "markdown",
          "markdown": {
              "content": "{{#success build.status}}✅{{else}}❌{{/success}}**{{ repo.owner }}/{{ repo.name }}** (Build #{{build.number}})\n
                          >**构建结果**: {{ build.status }}
                          >**构建详情**: [点击查看]({{ build.link }})
                          >**代码分支**: {{ build.branch }}
                          >**提交标识**: {{ build.commit }}
                          >**提交发起**: {{ build.author }}
                          >**提交信息**: {{ build.message }}
        "
          }
        }

增加run.sh脚本文件

#!/usr/bin/env bash
# 定义应用组名
group_name='turing'
# 定义应用名称
app_name='beiming-talk'
# 定义应用版本
app_version='latest'
# 定义应用环境
profile_active='prod'
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包编译docker镜像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 8080:8080 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'

增加 Dockerfile 文件

FROM openjdk:17-oracle
ADD beiming-talk-backend-0.0.1-SNAPSHOT.jar beiming-talk-backend-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar", "beiming-talk-backend-0.0.1-SNAPSHOT.jar"]

效果演示



原创 fajian.chen 技术与业务融合思维

标签:CI,name,手把手,app,drone,DRONE,build,docker,CD
From: https://www.cnblogs.com/o-O-oO/p/18666332

相关文章

  • 基本的后端 CI/CD 管道步骤
    应包括以下步骤:构建步骤编译/转译应用程序运行单元测试运行集成测试运行静态代码分析创建docker镜像(使用Git修订号作为镜像名称)它应该在主分支和功能分支上执行(构建应该在每个分支上运行,即使没有明确的拉取请求)打包步骤将Docker镜像上传到AWSECR在GitHub操作......
  • CDA证书一级必备知识点【教材精华总结】
    博主已通过CDA数据分析师一级考试,下面是来自红色封皮官方教材中必须要掌握的知识点(个人认为)。最好记住每一个概念都是什么意思,每个分类大类下面都包含哪些小类,尤其是分辨每种图表的用途,每个分析方法的适用场景,真题考了好几个。1、表格结构的数据类型:数值、文本、逻辑2、B......
  • Management-DecisionMaking-Leadership-Relationship: 组织关系管理: Communication组
    Management-DecisionMaking-Leadership-Relationship:组织关系管理:Communication组织沟通与Mgmt.管理明确沟通方的“Role”与“Authorization”是人都“有公”也“有私”。组织关系的“目的”和“基础”是什么?处理好“公”与“私”,组织与自我。是人都“身在组织”:......
  • 打卡信奥刷题(583)用C++信奥P7724[普及组/提高] 远古档案馆(Ancient Archive)
    远古档案馆(AncientArchive)题目背景为了揭开月光能量背后的秘密,你来到了地下的远古档案馆。远古一族的秘密与遗忘的知识悉数贮藏于这片被尘封的迷宫中,你能成功解谜,获知远古的知识吗?题目描述远古档案馆的中心是一个解谜:有一个......
  • 手把手教你学simulink(69.3)--毫米波5G/6G 系统场景实例设计并实现基于Simulink的毫米波
    目录项目背景介绍毫米波5G/6G系统与多用户MIMO技术概述研究目标系统架构1. 数据生成模块(DataGeneration)2. 多用户MIMO模块(Multi-UserMIMO)3. 信道模块(Channel)4. 接收端模块(Receiver)5. 性能评估模块(PerformanceEvaluation)仿真实现步骤1.创建......
  • RT-DETR融合[AAAI2025]的ConSeg中的CDFAPreprocess模块
    RT-DETR使用教程: RT-DETR使用教程RT-DETR改进汇总贴:RT-DETR更新汇总贴《ConDSeg:AGeneralMedicalImageSegmentationFrameworkviaContrast-DrivenFeatureEnhancement》一、模块介绍    论文链接:https://arxiv.org/abs/2412.08345    代......
  • SCI科研论文配色方案:色彩丰富的情况下就是白背景;浅色系
    SCI科研论文配色方案浅蓝:E7EFFA浅粉:F7E1ED浅绿:AOEEE1色彩丰富的情况下就是白背景;浅色系一般采用渐变色-中间渐变柱状图,直线图配色#2F7FC1RGB:47127193#E7EFFARGB:231239250#96C37DRGB:150195125#D8383A#F7E1EDRGB:247225237#F8F3F9RGB:248243......
  • 解决VMWare虚拟机“无法获取vmci驱动程序版本”的问题
            打开虚拟机却提示“无法获得vmci驱动程序的版本:句柄无效”,导致虚拟机无法启动。    下面为大家详细介绍一下打开虚拟机提示“无法获得vmci驱动程序的版本:句柄无效”的解决方法。    找到虚拟机的存放路径,打开该路径,找到VMX结尾的文件  ......
  • [笔记] 使用 Jenkins 和 Nginx 实现前端项目的持续集成与部署 (CICD) : 从 GitLab 拉
    在现代软件开发中,持续集成与持续部署(CI/CD)已经成为提高开发效率、保证代码质量的重要手段。对于前端项目来说,如何快速、稳定地将代码从开发环境推送到生产环境,是一个关键问题。本文将详细介绍如何使用Jenkins和Nginx实现前端项目的CI/CD流程,确保每次代码提交都能自动......
  • ciscn_2019_n_8 1
    checksec一下能发现开了很多保护,吓人一跳,但其实我们分析一下发现只要var[13]为17就可以了if(*(_QWORD*)&var[13])#判断var[13]开始的8字节(_QWORD表示64位,即8字节)内存区域是否非零。*(_QWORD*)&var[13]是将var[13]的地址转换为_QWORD(64位整数)指针,然后解引用得到该内存区域的......