Docker 配置 Gitea + Drone 搭建 CI/CD 平台

news2024/10/7 8:34:48

Docker 配置 Gitea + Drone 搭建 CI/CD 平台

配置 Gitea 服务器来管理项目版本

本文的IP地址是为了方便理解随便打的,不要乱点

首先使用 docker 搭建 Gitea 服务器,用于管理代码版本,数据库选择mysql

Gitea 服务器的 docker-compose.yml 配置文件如下:

version: "3"

services:
    server:
        image: gitea/gitea:1.19.3
        container_name: gitea
        environment:
            - USER_UID=1000
            - USER_GID=1000
            - GITEA__database__DB_TYPE=mysql
            - GITEA__database__HOST=123.45.54.123:3306
            - GITEA__database__NAME=gitea
            - GITEA__database__USER=root
            - GITEA__database__PASSWD=123456
        restart: always
        volumes:
            - ./gitea:/data
            - /etc/timezone:/etc/timezone:ro
            - /etc/localtime:/etc/localtime:ro
        ports:
            - "3002:3000"
            - "2222:22"

运行前先去数据库服务器中新建一个名为 gitea 的数据库

命令:CREATE DATABASE gitea

编写完成后在当前目录下运行 docker compose up -d 即可运行 docker 容器

搭建 Drone 服务器与 Drone Runner

再使用 Docker 搭建 Drone 服务器,用于自动化部署的 CI/CD 平台

浏览器中打开上一步配置好的Gitea,点击右上角头像,点击设置,进入设置页面

点击应用选项卡,在页面底部输入应用名称(随便写一个就好,例如:Drone CI),输入重定向URI(Drone服务链接+’/login‘,如’http://123.45.54.123:3991/login‘)

点击创建应用

客户端ID即为下方配置文件的DRONE_GITEA_CLIENT_ID

客户端密钥即为下方配置文件的DRONE_RPC_SECRET

记录后点击完成即可

接着在服务器中输入

openssl rand -hex 16

生产一个密钥,记录后写到下方配置文件的DRONE_RPC_SECRET中

drone 服务器的 docker-compose.yml 配置文件如下:

version: "3"

services:
    drone:
        image: drone/drone:2
        container_name: drone
        environment:
            - DRONE_GITEA_SERVER=http://123.45.54.123:3002
            - DRONE_GITEA_CLIENT_ID=客户端ID
            - DRONE_GITEA_CLIENT_SECRET=客户端密钥
            - DRONE_RPC_SECRET=生成的密钥
            - DRONE_SERVER_HOST=123.45.54.123:3991
            - DRONE_SERVER_PROTO=http
            - DRONE_USER_CREATE=username:Gitea,admin:true # 开启管理员账户
        restart: always
        volumes:
            - ./drone:/data
        ports:
            - 3991:80
            - 3992:443

其中 3002 是上一步搭建 Gitea 服务器的端口号,3991 和 3992 是新开的端口号。

编写完成后在当前目录下运行 docker compose up -d 即可运行 docker 容器

Drone Runner 相当于 Worker ,用于执行任务

drone runner的 docker-compose.yml 配置文件如下:

DRONE_RUNNER_NAME是随便起的,3993 同样是新开的端口

version: "3"

services:
    runner:
        image: drone/drone-runner-docker:1
        container_name: runner
        environment:
            - DRONE_RPC_PROTO=http
            - DRONE_RPC_HOST=123.45.54.123:3991  # Drone服务器的地址
            - DRONE_RPC_SECRET=生成的密钥,应与Drone服务器的一致
            - DRONE_RUNNER_CAPACITY=2
            - DRONE_RUNNER_NAME=my-first-runner
        restart: always
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
        ports:
            - 3993:3000

同样编写完成后在当前目录下运行 docker compose up -d 即可运行 docker 容器

一定一定一定要注意不要乱加 ‘/’ ,不乱写 ‘http://’,不然可能踩坑,按照上方配置文件作为模板改写即可

至此,环境搭建完成,接下来用编写项目进行测试

项目测试

在代码生成器项目根目录下添加以下三个配置文件

.drone.yml

kind: pipeline # 定义对象类型,还有secret和signature两种类型
type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型
name: test_drone # 定义流水线名称

steps: # 定义流水线执行步骤,这些步骤将顺序执行
  - name: build-jar # 流水线名称
    image: maven:3.8.5-openjdk-8 # 定义创建容器的Docker镜像
    volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
      - name: maven-cache
        path: /home/Gettler/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
      - name: maven-build
        path: /app/build/generator # 将应用打包好的Jar和执行脚本挂载出来
    commands:
      - $MAVEN_HOME/bin/mvn -v
      - $MAVEN_HOME/bin/mvn clean package -DskipTests=true
      # 将打包后的jar包,拷贝到 /root/testDrone 目录
      - cp target/*.jar  /app/build/generator
      - cp Dockerfile /app/build/generator
      - cp run.sh /app/build/generator
  - name: build-docker # 流水线名称
    image: plugins/docker
    volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
      - name: maven-build
        path: /app/build/generator # 将应用打包好的Jar和执行脚本挂载出来
      - name: docker
        path: /var/run/docker.sock # 挂载宿主机的docker
    settings:
      dockerfile: /app/build/generator/Dockerfile
    commands:
        - cd /app/build/generator
        - chmod +x run.sh
        - sh run.sh
        - docker ps

volumes: # 定义流水线挂载目录,用于共享数据
  - name: maven-build
    host:
      path: /app/build/generator   #jar包目录可以修改从宿主机中挂载的目录
  - name: maven-cache
    host:
      path: /home/Gettler/docker/maven/cache
  - name: docker
    host:
      path: /var/run/docker.sock

Dockerfile

#指定基础镜像(一般指定程序所依赖的环境)
#本例子是构建SpringBoot所以我指定的jdk环境变量
FROM openjdk:8

#将./hello-world.jar添加到容器的/opt目录中
COPY ./*.jar /opt

#指定dockerfile的命令在哪个目录下执行
WORKDIR /opt

#指定容器和外界交互的端口
EXPOSE 80

#容器运行后执行的命令(该命令在WORKDIR指定的工作目录下执行)
#注意:多个CMD指令只有最后一个会生效
CMD java -jar *.jar

#在构建镜像时执行的命令
#我这边用它来打印java的环境变量
RUN java -version

#添加该镜像的元数据
LABEL version="1.0" description="代码生成器服务" by="Gettler"

run.sh

#!/bin/sh
# 定义应用组名
group_name='power'
# 定义应用名称
app_name='generator'
# 定义应用版本
app_version='latest'
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 4001:80 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'

然后新建gitea仓库,将其push到远程仓库后,然后以Gitea用户(管理员身份)进入Drone服务 http://123.45.54.123:3991/,点击continue即可关联到gitea服务授权登录。

登录后点击右上角SYNC按钮同步仓库,看到刚刚新建的仓库后点进去,激活,然后点击Setting页面,勾选trust

image-20231107102207218

勾选trust后,每次代码push都可以自动进行版本发布

也可以手动发布,点击右上角new build按钮,选择代码分支,即可进行部署。

点击对应build可以查看日志,出现绿色对勾后即为发布成功

image-20231107102348398

再附上一手前端项目配置

Vue 项目配置

.drone.yml

kind: pipeline # 定义一个管道
type: docker # 当前管道的类型
name: test # 当前管道的名称

steps: # 定义管道的执行步骤
  - name: deploy # 步骤名称
    image: node:18 # 当前步骤使用的镜像,我是node18,也可以修改其他镜像
    settings:
      mirror: # Docker镜像加速地址
    depends_on: [clone] # 依赖的步骤
    volumes: # 挂载数据卷(此为容器内的目录)
      - name: node_modules # 数据卷名称
        path: /drone/src/node_modules # 容器内目录 绝对路径
      - name: deploy_path
        path: /app/build/front
    commands: # 当前步骤执行的命令
      - pwd # 查看当前目录
      - npm config set registry https://registry.npm.taobao.org # 切换淘宝镜像
      - yarn # 安装node_modules包(我的项目用yarn,看项目也可使用其他命令)
      - yarn build # 执行编译(我的项目用yarn,看项目也可使用其他命令)
      - cp -r ./dist/* /app/build/front/html/
      - cp Dockerfile /app/build/front
      - cp default.conf /app/build/front
      - cp run.sh /app/build/front
  - name: build # 流水线名称
    image: plugins/docker
    depends_on: [deploy]
    volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
      - name: deploy_path
        path: /app/build/front # 将应用打包好的Jar和执行脚本挂载出来
      - name: docker
        path: /var/run/docker.sock # 挂载宿主机的docker
    settings:
      mirror: # Docker镜像加速地址
      dockerfile: /app/build/front/Dockerfile
    commands:
        - cd /app/build/front
        - chmod +x run.sh
        - sh run.sh
        - docker ps

volumes: # 声明数据卷(此为服务器中的实际目录)
  - name: node_modules # 数据卷名称
    host:
      path: /home/Gettler/docker/node_modules
  - name: deploy_path
    host: 
      path: /app/build/front
  - name: docker
    host:
      path: /var/run/docker.sock

记得修改Docker镜像加速地址!

Dockerfile

# 设置基础镜像
FROM nginx:latest

# 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面
COPY html /usr/share/nginx/html
# 用本地的 default.conf 配置来替换nginx镜像里的默认配置
COPY default.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

LABEL version="1.0" description="前端服务" by="Gettler"

run.sh

#!/bin/sh
# 定义应用组名
group_name='power'
# 定义应用名称
app_name='front'
# 定义应用版本
app_version='latest'
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 3995:80 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'

img

若要修改 docker-compose.yml 文件,修改后再次输入 docker compose up -d 即可重新加载有变化的容器,过程中会删除之前的容器。而 docker compose up -d --no-create 命令可以在存在yaml文件中描述的容器的情况下启动容器,不会重建容器。

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

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

相关文章

Python如何让程序实现开机自启功能(随Windows启动)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现步骤 📒📝 方法一:使用Windows任务计划程序📝 方法二:添加注册表🎈 创建注册表项🎈 检查注册表项是否成功创建⚓️ 相关链接 ⚓️📖 介绍 📖 为了方便省事,我们很多时候需要给软件添加一个开机自启的功能,…

《微信小程序开发从入门到实战》学习九十三

7.1 视图容器组件 7.1.3 swiper与swiper-item组件 swiper组件的显示效果如下图所示: indicator-dots、indicator-color和indicator-active-color三个属性用于设置swiper组件下方的指示点。设置指示点的颜色时,可以使用HexColor,也可以使用r…

vscode开发FPGA(1)---TEROS_HDL插件报错

一、TerosHDL:modelsim(vlog-66)报错 Error: (vlog-66) Execution of vlib.exe failed 解决办法: 1.新建modelsim工程,并随意编译一个.v文件,将产生的work目录复制到modelsim安装路径下。 2.再将vscode设置verilog>linting>modelsim…

etcd技术解析:构建高可用分布式系统的利器

1. 引言 随着云原生技术的兴起,分布式系统的构建变得愈发重要。etcd作为一个高可用的分布式键值存储系统,在这个领域发挥着至关重要的作用。本文将深入探讨etcd的技术细节,以及如何利用它构建高可用的分布式系统。 2. etcd简介 etcd是一个开…

苗情监测站有什么作用?

苗情监测站是一种针对植物生长情况的监测设施,主要用于实时监测和分析植物生长环境中的各种因素,如温度、湿度、光照、土壤温湿度等,从而为农业生产提供科学的依据和技术支持。 具体来说,苗情监测站的作用包括以下几个方面&#…

EasyExcel实现导出图片到excel

pom依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.0</version> </dependency> 实体类&#xff1a; package com.aicut.monitor.vo;import com.aicut.monit…

京东云开发者DDD妙文欣赏(3-4)什么时候厨师是Actor

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 京东云开发者DDD妙文欣赏&#xff08;1-2&#xff09;报菜名和化繁为简的创新>> 图8 《餐厅》中的“用例图” &#xff08;01&#xff09; 原文 用例图 赏析 揉一揉眼睛仔细…

全新PHP短网址生成系统,短链接生成系统,URL缩短器系统源码

PHP短网址系统URL缩短器平台&#xff0c;它使您可以轻松地缩短链接&#xff0c;根据受众群体的位置或平台来定位受众&#xff0c;并为缩短的链接提供分析见解。 系统使用了Laravel框架编写&#xff0c;前后台双语言使用&#xff0c;可以设置多域名&#xff0c;还可以开设套餐等…

架构师之路(十六)计算机网络(传输层)

前置知识&#xff08;了解&#xff09;&#xff1a;计算机基础。 作为架构师&#xff0c;我们所设计的系统很少为单机系统&#xff0c;因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 既然网络层已经…

Linux服务器配置与管理(第一次实验)

实验目的及具体要求 1.熟悉Ubuntu桌面环境和基本操作 2.熟悉命令语法格式 3.掌握Linux各类命令的使用方法 4.熟悉Linux操作环境 实验仪器、设备和材料 笔记本电脑 软件VMware Workstation 17 Player Ubuntu 64 位操作系统 实验内容、步骤及实验数据记录 &#xff08;一…

【医学图像隐私保护】联邦学习:密码学 + 机器学习 + 分布式 实现隐私计算,破解医学界数据孤岛的长期难题

联邦学习&#xff1a;密码学 机器学习 分布式 提出背景&#xff1a;数据不出本地&#xff0c;又能合力干大事联邦学习的问题 分布式机器学习&#xff1a;解决大数据量处理的问题横向联邦学习&#xff1a;解决跨多个数据源学习的问题纵向联邦学习&#xff1a;解决数据分散在多…

自动化防DDoS脚本

简介 DDoS &#xff08;分布式拒绝服务攻击&#xff09;是一种恶意的网络攻击&#xff0c;旨在通过占用目标系统的资源&#xff0c;使其无法提供正常的服务。在DDoS攻击中&#xff0c;攻击者通常控制大量的被感染的计算机或其他网络设备&#xff0c;同时将它们协调起来向目标系…

第二百八十七回

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取文件类型"相关的内容&#xff0c;本章回中将介绍如何播放视频.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用…

解决 [Vue warn]:Avoid mutating a prop directly 警告

错误信息 [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop’s value. Prop being mutated: “xxx” 错误原因 所有的 prop 都使得…

Vue开发之proxy代理的配置(附带uniapp代理配置)

vue 1.在vue.config.js中添加 devServer 属性中配置 proxy 属性 module.exports {productionSourceMap: false,publicPath: /,devServer: {port: 8085,proxy: {/api/admin: {target: http://10.58.104.70:6111,changeOrigin: true,pathRewrite: {/api/: /}},/api: {target: …

白酒:品控标准与产品质量的关系

品控标准是确保产品质量的关键要素&#xff0c;它涉及到产品的原料、生产工艺、包装、储存和运输等各个环节。在酿酒行业中&#xff0c;品控标准尤为重要&#xff0c;因为酒的品质与其原材料、生产环境、酿造工艺等密切相关。云仓酒庄的豪迈白酒在品控方面制定了严格的标准&…

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备1

接前一篇文章&#xff1a;中移&#xff08;苏州&#xff09;软件技术有限公司面试问题与解答&#xff08;0&#xff09;—— 面试感悟与问题记录 本文参考以下文章&#xff1a; VirtIO实现原理——PCI基础 VirtIO实现原理——virtblk设备初始化 特此致谢&#xff01; 本文对…

React复习记录

1、Outlet的作用 <Outlet /> 是一种在 React 路由器中使用的特殊组件&#xff0c;它用于渲染当前路由的子路由。在一些情况下&#xff0c;我们可能只想渲染子路由&#xff0c;而不需要使用上下文传递任何参数。这种情况下&#xff0c;可以直接使用 <Outlet /> 组件…

java servlet果蔬产业监管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web果蔬产业监管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5…

Maven(上):Maven介绍、安装配置及工程构建

1. Maven介绍 Maven 是一款为 Java 项目管理构建、依赖管理的工具&#xff08;软件&#xff09;&#xff0c;使用 Maven 可以自动化构建、测试、打包和发布项目&#xff0c;大大提高了开发效率和质量。 Maven就是一个软件&#xff0c;掌握安装、配置、以及基本功能 &#xff…