gitea+drone+harbor实现CICD

打印 上一主题 下一主题

主题 857|帖子 857|积分 2571

前言

之前cicd一直是gitlab + jenkins实现,当前情况用了一套完全没用过的gitea + drone,研发自己管理手中项目标pipline和Dockerfile,往利益想省去了运维的部分工作,固然这种场景必须是小型团队。我自己做了一套demo测试下流程,CI流程是紧张的,CD部分只做了推送镜像和测试镜像输出变量。
一、gitea摆设

1.1、docker-compose文件准备

官方文档地址
https://docs.gitea.com/installation/install-with-docker
  1. version: "3"
  2. networks:
  3.   gitea:
  4.     external: false
  5. services:
  6.   server:
  7.     image: gitea/gitea:1.18.5
  8.     container_name: gitea
  9.     environment:
  10.       - USER_UID=1000
  11.       - USER_GID=1000
  12.       - GITEA__database__DB_TYPE=mysql
  13.       - GITEA__database__HOST=db:3306
  14.       - GITEA__database__NAME=gitea
  15.       - GITEA__database__USER=gitea
  16.       - GITEA__database__PASSWD=gitea
  17.     restart: always
  18.     networks:
  19.       - gitea
  20.     volumes:
  21.       - ./gitea:/data
  22.       - /etc/timezone:/etc/timezone:ro
  23.       - /etc/localtime:/etc/localtime:ro
  24.     ports:
  25.       - "3000:3000"
  26.       - "222:22"
  27.     depends_on:
  28.       - db
  29.   db:
  30.     image: mysql:8.0
  31.     restart: always
  32.     environment:
  33.       - MYSQL_ROOT_PASSWORD=gitea
  34.       - MYSQL_USER=gitea
  35.       - MYSQL_PASSWORD=gitea
  36.       - MYSQL_DATABASE=gitea
  37.     networks:
  38.       - gitea
  39.     volumes:
  40.       - ./mysql:/var/lib/mysql
复制代码
1.2、docker-compose启动gitea

docker-compose up -d
映射了3000端口,可以按需修改。第一次访问web时需要初始化配置,修改基础URL和站点名称,并配置管理员账号设置,账号待会儿drone compose文件中会用到

1.3、gitea用户配置ssh key

用于是demo情况,就不创建平凡用户测试了,使用刚刚创建的管理员账号登录
通常第一个操纵就是添加ssh key


1.4、gitea用户配置OAuth2 token

这个token是给drone集成gitea用的,重定向URL写drone的url,我drone映射到宿主机的端口是8888,注意按需修改,/login是固定的哦,
http://1982.168.31.30:8888/login

二、drone摆设

2.1、docker-compose文件准备

  1. version: "3"
  2. services:
  3.   drone:
  4.     image: drone/drone:latest
  5.     restart: always
  6.     container_name: drone
  7.     ports:
  8.       - "8888:80" #端口映射
  9.       #- "443:443"         environment:             .31.20:3000 #gitea地址
  10.       - DRONE_GITEA_CLIENT_ID=1e9b7f4e-6194-4d8f-b534-73e31f4589f5 # 上面创建的OAuth token
  11.       - DRONE_GITEA_CLIENT_SECRET=gto_7nqtr3op5llqkrm2n7wmuijtgabn3labr7nb4eyaobcmpycvriia
  12.       - DRONE_RPC_SECRET=8899 #密钥,与runner中的相同
  13.       - DRONE_SERVER_HOST=192.168.31.30:8888  #drone服务器地址
  14.       - DRONE_SERVER_PROTO=http
  15.       - DRONE_REPO_TRUSTED=true  # 排错增加 没什么用
  16.       - DRONE_USER_CREATE=username:baga,admin:true # 创建的drone管理员用户需要和gitea管理员相同,都是baga,不相同后面会有报错
  17.       - DRONE_GIT_USERNAME=baga
  18.       - DRONE_GIT_PASSWORD=AbC123,. #可选字符串值。覆盖用于验证和克隆私有仓库的默认 git 用户名和密码。
  19.       - TZ=Asia/Shanghai
  20.     volumes:
  21.       - ./drone_data:/data
  22.       
  23.   runner:
  24.     image: drone/drone-runner-docker:latest
  25.     container_name: runner
  26.     restart: always
  27.     volumes:
  28.       - /var/run/docker.sock:/var/run/docker.sock
  29.     environment:
  30.       - DRONE_RPC_PROTO=http #http 或 https
  31.       - DRONE_RPC_HOST=drone #连接 Drone 服务器的主机名(和可选端口)
  32.       - DRONE_RPC_SECRET=8899 #设置密钥
  33.       - DRONE_RUNNER_CAPACITY=2 #限制运行程序可同时执行的管道数量
  34.       - DRONE_RUNNER_NAME=runner
  35.       - DRONE_TRACE=true #跟踪级别日志记录
  36.       - DRONE_DEBUG=true #启用调试级日志记录
  37.       - TZ=Asia/Shanghai
  38.     ports:
  39.       - "3030:3000"
  40.     depends_on:
  41.       - drone
复制代码
2.2、启动drone,gitea允许授权

docker-compose up -d
我映射了drone web 8888端口,drone-runner端口我们配置项目用不到
http://192168.31.30:8888

这个步调是我- DRONE_USER_CREATE=username:baga,admin:true没有配置的时候出来的,配置了以后不确定有没有,是无关紧急的一些信息

三、配置构建情况

3.1、gitea创建并导入项目

我的项目路径 /Users/sijia/Desktop/jarvan-test/go-1
目录之前如果是有git配置,rm -fr .git清空一下
然后一套连招,注意我这里映射的代码拉取端口为222
  1. git init
  2. git add .
  3. git commit -m "first commit"
  4. git remote add origin ssh://git@192.168.31.20:222/baga/go-1.git
  5. git push -u origin master
复制代码
确认项目

3.2、drone同步项目



3.3、为项目准备文件和secret

drone中配置全局secret,harbor的用户名和密码,在drone.yml中引用
这里名称大概有歧义,按需修改

.drone.yml和Dockerfile
文件.drone.yml
  1. ---
  2. kind: pipeline
  3. type: docker   
  4. name: sijia-test
  5. platform:
  6.   os: linux
  7.   arch: amd64
  8. steps:
  9.   - name: build-sijia-test # 阶段任务的名称
  10.     image: plugins/docker:20.13 # drone构建使用docker版本
  11.     environment:
  12.       GOPRIVATE_TOKEN:
  13.         from_secret: GOPRIVATE_TOKEN # 这个是drone中配置的secret,这次demo中没有作用,可以忽略
  14.     settings:
  15.       registry: harbor.baga.live # 指定harbor仓库
  16.       repo: harbor.baga.live/baga/go-1 # 推送镜像的路径
  17.       username:
  18.         from_secret: gitea_registry_username # 从drone全局变量中读取的secret,是harbor的用户名
  19.       password:
  20.         from_secret: gitea_registry_password # 同上,harbor的密码
  21.       no_cache: false
  22.       dockerfile: docker/Dockerfile  # 代码中dockerfile的路径和名称
  23.       pull_image: false
  24.       purge: true
  25.       tags: [ "${DRONE_BRANCH}", "${DRONE_BRANCH}-${DRONE_COMMIT_SHA:0:7}" ] # 镜像的tag
  26.       build_args_from_env:
  27.         - GOPRIVATE_TOKEN
  28.     volumes:   # 下方进行了此操作解释
  29.       - name: docker.sock
  30.         path: /var/run/docker.sock
  31.     commands:
  32.       - /usr/local/bin/dockerd-entrypoint.sh /bin/drone-docker
  33.   - name: test-deploy  # 也是一个步骤,生产环境是更新服务镜像,这里用测试操作代替
  34.     image: alpine
  35.     commands:
  36.       - 'echo $DRONE_BRANCH $GOPRIVATE_TOKEN'  # 输出当前构建的分支名称
  37. trigger:
  38.   branch:
  39.     - main
  40.     - master
  41.     - release
  42.     - feature-*
  43.   event:
  44.     - push
  45.     - cron
  46.     - custom
  47. volumes:
  48.   - name: docker.sock
  49.     host:
  50.       path: /var/run/docker.sock
复制代码
volumes配置把宿主机上的 /var/run/docker.sock 文件挂载到 drone 构建容器的同一位置。简单来讲drone构建docker拥有了宿主机docker进程的能力,例如宿主机的login以及daemon.json配置(“insecure-registries” : [“192.168.31.20:3000”])
文件docker/Dockerfile
  1. FROM golang:1.22.6-alpine3.20 AS base
  2. ARG GOPRIVATE_TOKEN
  3. # Install dependencies only when needed
  4. FROM base AS deps
  5. ARG GOPRIVATE_TOKEN
  6. ENV GOPROXY=https://goproxy.cn,direct # 国内配代理,不然拉包超时
  7. RUN apk add git
  8. RUN git config --global url."http://oauth2:${GOPRIVATE_TOKEN}@192.168.31.20:3000/".insteadOf "http://192.168.31.20:3000/" # 配置git,由于drone和gitea集成,这里配置好权限自动拉取代码
  9. ENV GOPRIVATE=192.168.31.20:3000/*   # 定义了gitea的地址,后面.drone.yml中也用到了此ENV
  10. WORKDIR /app
  11. # Copy the go.mod and go.sum files to download dependencies
  12. COPY go.mod go.sum ./
  13. RUN go mod download -x  # 我开始没配置代理加了-x
  14. # Build the Go application
  15. FROM base AS builder
  16. WORKDIR /app
  17. COPY --from=deps /go/pkg/ /go/pkg/
  18. COPY . .
  19. RUN go build -o main .
  20. # Use the alpine base image for the production image
  21. FROM alpine:3.17
  22. WORKDIR /app
  23. # Copy the built executable and any other necessary files
  24. COPY --from=builder /app/main .
  25. #COPY --from=builder /go/bin/gops /usr/local/bin/
  26. # Expose the port the application listens on
  27. EXPOSE 8080
  28. # Run the application
  29. CMD ["./main"]
复制代码
3.4、项目必做修改项

push上面的文件后就可以进行drone构建了,构建开始后会有很多报错
3.4.1 gitea无法触发webhook

我们在drone.yml中配置了触发构建,但是上面文件提交后没有成功触发drone的构建
通过查看gitea的日志发现是webhook的白名单里没有drone地址
2024/08/31 17:17:35 …s/webhook/webhook.go:122:handle() [E] [66d2ce75-9] webhook.Deliver failed: Post “http://192.168.31.30:8888/hook?secret=VnTPAuVZzMQMMfBixM4zpA54Nv8rP82w”: dial tcp 192.168.31.30:8888: webhook can only call allowed HTTP servers (check your webhook.ALLOWED_HOST_LIST setting), deny ‘192.168.31.30(192.168.31.30:8888)’
解决方法:
我们之前已经将gitea的配置文件映射到了本地
/data/gitea/gitea/gitea/conf/app.ini
文件末了增加内容,然后重启gitea容器让其生效
  1. [webhook]
  2. ALLOWED_HOST_LIST = *
复制代码
3.4.2 drone信任项目

允许push会出现untrusted错误

此操纵需要管理员执行,在项目中启用Trusted

如果没有Trusted,详细查抄是否在docker-compose中启用了DRONE_USER_CREAT,需要和gitea管理员用户名对的上

3.4.3 dockerfiel git验证失败

time=“2024-08-31T10:20:47Z” level=fatal msg=“Error authenticating: exit status 1”
Error response from daemon: Get “https://192.168.31.20:3000/v2/”: http: server gave HTTP response to HTTPS client


这里确认了Dockerfile中url是http协议,还需要在daemon.json中新增
"insecure-registries" : ["192.168.31.20:3000"]
添加后重启docker
3.4.4 拉取git镜像失败

docker pull drone/git:latest 失败,这个需要宿主机开启docker proxy了,开启proxy后login harbor等内网操纵会失败,需要机动开关。
还可以开启镜像堆栈
"registry-mirrors": ["http://hub-mirror.c.163.com"]
四、构建体验

4.1、开始一个build

可以提交代码触发,也可以手动新增

4.2、pipline执行

上面报错调整了很多次,包括添加国内镜像堆栈源,可以看到DRONE的分支情况变量打印出来了,$GOPRIVATE_TOKEN是废弃变量

4.3、确认镜像推送结果

镜像堆栈中也存在镜像

另外这里要增补一下,我的harbor是本地配置了hosts文件,并且开启了SSL,证书文件和jenkins构建一样放在了/etc/docker/certs.d/下,
推送失败后需要查抄harbor用户的用户名密码和账号权限,我直接login是可以登录的
  1. $ cat /etc/docker/certs.d/login
  2. docker login harbor.baga.live -u 'robot$baga' -p 'tKHmmQvhF8e1l8Vut5WXlIB4CwudyBK1'
复制代码
出现题目后查看3.4.x部分
至此demo测试已经完成~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表