Administrator
发布于 2024-02-06 / 23 阅读
0

Gitea+Drone+K3s CI/CD持续集成解决方案

Gitea+Drone+K3s CI/CD持续集成解决方案(ubuntu)

1.Gitea

Gitea 是一个自己托管的Git服务程序。他和GitHub, Bitbucket or Gitlab等比较类似。他是从 Gogs 发展而来,Gitea 是一个开源社区驱动的轻量级代码托管解决方案,采用 MIT 许可证。极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。并且他还支持跨平台,支持 Linux, macOS 和 Windows 以及各种架构,除了x86,amd64,还包括 ARM 和 PowerPC。

系统要求:建议使用 2 核 CPU 及 1GB 内存

安装docker

更新apt

sudo apt-get update

安装基本软件

sudo apt-get install curl wget apt-transport-https ca-certificates software-properties-common

添加docker 秘钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

对比:

sudo apt-key fingerprint 0EBFCD88

添加源:

sudo add-apt-repository "deb [arch=arm64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

安装:

sudo apt-get update
sudo apt-get install docker-ce

查看docker 状态

systemctl status docker

添加阿里镜像

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://bhfjayzb.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

安装docker-compose

apt-get install -y docker-compose

安装gitea

创建docker-compose.yml文件

version: "3"
networks:
  gitea:
    external: false
services:
  server:
    image: gitea/gitea:1.16.7
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - gitea
    volumes:
      - /home/data:/data  # /home/data可以替换成你想要的挂载目录
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3030:3000" # 3030可以替换成你想要的端口
      - "322:22" # 322可以替换成22

运行脚本

docker-compose up -d

配置gitea

访问:http://server-ip:3030

设置管理员账号密码:

点击安装后,系统安装完毕会自动登录

创建测试仓库:

创建测试仓库:

2.Drone

关于drone:Drone是一个现代化的持续集成平台,它使用强大的云原生pipeline引擎自动化构建、测试和发布工作流。Drone 与多个源代码管理系统无缝集成,包括 GitHub、GitHubEnterprise、Bitbucket、GitLab和Gitea;它的每个构建都在一个隔离的 Docker 容器中运行;另外它也支持插件,可以使用你熟知的语言轻松的扩展它们。

安装Drone

此处采用docker-compose.yml的方式安装

version: '3'
services:
  drone-server:
    restart: always
    image: drone/drone:2
    ports:
      - "映射宿主机端口:80"
    volumes:
      - 宿主机挂载目录:/var/lib/drone/
      - 宿主机挂载目录:/data/
    environment:
      - DRONE_GITEA_SERVER=http://gitea服务器地址 # 支持http, https
      - DRONE_GITEA_CLIENT_ID=gitea生成的OAuth2客户端ID
      - DRONE_GITEA_CLIENT_SECRET=gitea生成的OAuth2客户端密钥
      - DRONE_SERVER_HOST=drone服务器地址
      - DRONE_SERVER_PROTO=http # 支持http, https
      - DRONE_RPC_SECRET=自定义的Drone与runner通信密钥
      - DRONE_GIT_ALWAYS_AUTH=true
      - DRONE_GIT_USERNAME=部署账户的用户名
      - DRONE_GIT_PASSWORD=部署账户的密码
      - DRONE_USER_CREATE=username:你的管理员账户名,admin:true # 开启管理员账户
  drone-runner-docker:
    restart: always
    image: drone/drone-runner-docker:1
    ports:
      - "3000:3000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_PROTO=http # 支持http, https
      - DRONE_RPC_HOST=drone-server
      - DRONE_RPC_SECRET=自定义的Drone与runner通信密钥
      - DRONE_RUNNER_NAME=drone-runner-docker
      - DRONE_RUNNER_CAPACITY=2

此处需要将gitea的授权信息填写到上方yml文件中

Gitea个人中心的应用设置创建Gitea OAuth application

令牌用于drone-git-username和password

点击创建后将秘钥妥善保管并替换到上面的docker-compose.yml

- DRONE_GITEA_CLIENT_ID=gitea生成的OAuth2客户端ID
- DRONE_GITEA_CLIENT_SECRET=gitea生成的OAuth2客户端密钥
- DRONE_GIT_USERNAME=令牌名称
- DRONE_GIT_PASSWORD=令牌秘钥

生成Drone与runner通信密钥,并替换上面docker-compose.yml对应的字段

openssl rand -hex 16
93b722f581830b9abf11345536b9ecfb

访问drone

http://drone-server-domain

授权

填写登录信息

登录之后就可以看到刚刚我们gitea中的项目

在设置中激活

激活保存

登陆阿里云 创建个人仓库镜像并在drone 中添加secret

使用pipeline

在gitea项目增加.drone.yml文件,内容如下

drone立马就收到提交事件,并及时构建

编写一个完整的pipeline

.drone.yml

kind: pipeline
type: docker
name: claydemo

steps:
  - name: build-jar # 流水线名称
    image: maven:3.8.5-openjdk-8 # 定义创建容器的Docker镜像
    volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
      - name: maven-cache
        path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
      - name: maven-build
        path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
    commands: # 定义在Docker容器中执行的shell命令
      - mvn clean package -DskipTests=true # 应用打包命
      - cp target/claydemo-1.0-SNAPSHOT.jar /app/build/claydemo-0.0.1.jar
      - cp start.sh /app/build/
      - cp Dockerfile /app/build/
      - cp .dockerignore /app/build/
      - cp docker.sh /app/build/

  - name: build-docker
    image: docker
    volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
      - name: maven-build
        path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
      - name: docker
        path: /var/run/docker.sock # 挂载宿主机的docker
    settings:
      dockerfile: /app/build/Dockerfile
    commands: # 定义在Docker容器中执行的shell命令
      - cd /app/build
      - chmod +x docker.sh
      - sh docker.sh
      - docker ps

volumes: # 定义流水线挂载目录,用于共享数据
  - name: maven-build
    host:
      path: /home/data/maven/build # 从宿主机中挂载的目录
  - name: maven-cache
    host:
      path: /home/data/maven/cache
  - name: docker
    host:
      path: /var/run/docker.sock

docker.sh

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

运行结果

注:如触发不成功,检查gitea web钩子