0


gitea+drone+harbor实现CICD

前言

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

一、gitea部署

1.1、docker-compose文件准备

官方文档地址
https://docs.gitea.com/installation/install-with-docker

version:"3"networks:gitea:external:falseservices:server:image: gitea/gitea:1.18.5
    container_name: gitea
    environment:- USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=mysql
      - GITEA__database__HOST=db:3306- GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=gitea
    restart: always
    networks:- gitea
    volumes:- ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:-"3000:3000"-"222:22"depends_on:- db

  db:image: mysql:8.0restart: always
    environment:- MYSQL_ROOT_PASSWORD=gitea
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=gitea
      - MYSQL_DATABASE=gitea
    networks:- gitea
    volumes:- ./mysql:/var/lib/mysql

1.2、docker-compose启动gitea

docker-compose up -d

映射了3000端口,可以按需修改。第一次访问web时需要初始化配置,修改

基础URL

站点名称

,并配置

管理员账号设置

,账号待会儿drone compose文件中会用到
gitea初始化配置

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文件准备

version:"3"services:drone:image: drone/drone:latest
    restart: always
    container_name: drone
    ports:-"8888:80"#端口映射#- "443:443"         environment:             .31.20:3000 #gitea地址- DRONE_GITEA_CLIENT_ID=1e9b7f4e-6194-4d8f-b534-73e31f4589f5 # 上面创建的OAuth token- DRONE_GITEA_CLIENT_SECRET=gto_7nqtr3op5llqkrm2n7wmuijtgabn3labr7nb4eyaobcmpycvriia
      - DRONE_RPC_SECRET=8899 #密钥,与runner中的相同- DRONE_SERVER_HOST=192.168.31.30:8888#drone服务器地址- DRONE_SERVER_PROTO=http 
      - DRONE_REPO_TRUSTED=true  # 排错增加 没什么用- DRONE_USER_CREATE=username:baga,admin:true# 创建的drone管理员用户需要和gitea管理员相同,都是baga,不相同后面会有报错- DRONE_GIT_USERNAME=baga
      - DRONE_GIT_PASSWORD=AbC123,. #可选字符串值。覆盖用于验证和克隆私有仓库的默认 git 用户名和密码。- TZ=Asia/Shanghai
    volumes:- ./drone_data:/data
      
  runner:image: drone/drone-runner-docker:latest
    container_name: runner
    restart: always
    volumes:- /var/run/docker.sock:/var/run/docker.sock
    environment:- DRONE_RPC_PROTO=http #http 或 https- DRONE_RPC_HOST=drone #连接 Drone 服务器的主机名(和可选端口)- DRONE_RPC_SECRET=8899 #设置密钥- DRONE_RUNNER_CAPACITY=2 #限制运行程序可同时执行的管道数量- DRONE_RUNNER_NAME=runner
      - DRONE_TRACE=true #跟踪级别日志记录- DRONE_DEBUG=true #启用调试级日志记录- TZ=Asia/Shanghai
    ports:-"3030:3000"depends_on:- 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

git init 
gitadd.git commit -m"first commit"git remote add origin ssh://[email protected]:222/baga/go-1.git
git push -u origin master

确认项目

3.2、drone同步项目

在这里插入图片描述
在这里插入图片描述

3.3、为项目准备文件和secret

drone中配置全局secret,harbor的用户名和密码,在drone.yml中引用
这里名称可能有歧义,按需修改
在这里插入图片描述

.drone.yml和Dockerfile
文件

.drone.yml
---kind: pipeline 
type: docker   
name: sijia-test

platform:os: linux
  arch: amd64

steps:-name: build-sijia-test # 阶段任务的名称image: plugins/docker:20.13# drone构建使用docker版本environment:GOPRIVATE_TOKEN:from_secret: GOPRIVATE_TOKEN # 这个是drone中配置的secret,这次demo中没有作用,可以忽略settings:registry: harbor.baga.live # 指定harbor仓库repo: harbor.baga.live/baga/go-1# 推送镜像的路径username:from_secret: gitea_registry_username # 从drone全局变量中读取的secret,是harbor的用户名password:from_secret: gitea_registry_password # 同上,harbor的密码no_cache:falsedockerfile: docker/Dockerfile  # 代码中dockerfile的路径和名称pull_image:falsepurge:truetags:["${DRONE_BRANCH}","${DRONE_BRANCH}-${DRONE_COMMIT_SHA:0:7}"]# 镜像的tagbuild_args_from_env:- GOPRIVATE_TOKEN
    volumes:# 下方进行了此操作解释-name: docker.sock
        path: /var/run/docker.sock
    commands:- /usr/local/bin/dockerd-entrypoint.sh /bin/drone-docker

  -name: test-deploy  # 也是一个步骤,生产环境是更新服务镜像,这里用测试操作代替image: alpine
    commands:-'echo $DRONE_BRANCH $GOPRIVATE_TOKEN'# 输出当前构建的分支名称trigger:branch:- main
    - master
    - release
    - feature-*
  event:- push
    - cron
    - custom

volumes:-name: docker.sock
    host: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
FROM golang:1.22.6-alpine3.20 AS base
ARG GOPRIVATE_TOKEN

# Install dependencies only when needed
FROM base AS deps
ARG GOPRIVATE_TOKEN

ENV GOPROXY=https://goproxy.cn,direct # 国内配代理,不然拉包超时

RUN apk add git
RUN git config --global url."http://oauth2:${GOPRIVATE_TOKEN}@192.168.31.20:3000/".insteadOf "http://192.168.31.20:3000/" # 配置git,由于drone和gitea集成,这里配置好权限自动拉取代码
ENV GOPRIVATE=192.168.31.20:3000/*   # 定义了gitea的地址,后面.drone.yml中也用到了此ENV

WORKDIR /app

# Copy the go.mod and go.sum files to download dependencies
COPY go.mod go.sum ./
RUN go mod download -x  # 我开始没配置代理加了-x# Build the Go application
FROM base AS builder
WORKDIR /app
COPY --from=deps /go/pkg/ /go/pkg/
COPY . .
RUN go build -o main .

# Use the alpine base image for the production image
FROM alpine:3.17
WORKDIR /app

# Copy the built executable and any other necessary files
COPY --from=builder /app/main .
#COPY --from=builder /go/bin/gops /usr/local/bin/# Expose the port the application listens on
EXPOSE 8080

# Run the application
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容器让其生效

[webhook]
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是可以登录的

$ cat /etc/docker/certs.d/login 
docker login harbor.baga.live -u'robot$baga'-p'tKHmmQvhF8e1l8Vut5WXlIB4CwudyBK1'

出现问题后查看3.4.x部分

至此demo测试已经完成~

标签: gitea ci/cd docker

本文转载自: https://blog.csdn.net/sj1163739403/article/details/141759487
版权归原作者 sj1163739403 所有, 如有侵权,请联系我们删除。

“gitea+drone+harbor实现CICD”的评论:

还没有评论