手把手教学-docker+drone+gitea 构建自己的CICD

8,826 阅读5分钟

看了很多 docker+drone+gitea构建cicd的文章之后,自己今天着手捣鼓了下,发现过程中还是会有很多坑等着大家,这里就一一写出,当做记录。

PS:gitlab 比较吃资源,gitea是新秀(gitea从基于GO语言编写的Gogsfork而来,而Gogs已经不维护了,gitea由团队维护),很占用资源很小,gitlab太多用不到的功能。个人项目,或者小团队项目推荐使用gitea.

登录服务器

我的是Mac电脑,我使用ssh命令登录: ssh <username>@<ip>,提示输入密码,就输入passward.

  • ip 是你购买的云服务器的ip地址。
  • usernamepassward是你的用户名和密码。

到这里不出意外就登陆上去了!

安装docker-ce

1. 更新前置工具包

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

2. 如有历史docker先卸载

sudo yum -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

3. 使用以下命令设置稳定存储库

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

4. 安装最新版本的 Docker CEcontainerd

sudo yum -y install docker-ce docker-ce-cli containerd.io

这个过程会比较久,慢慢等吧。

5. 开启docker服务

systemctl start docker # 开启docker
systemctl stop docker # 关闭docker
systemctl status docker # 检查docker
systemctl enable docker # 设置开机自启动

6. 使用国内docker镜像源

vim /etc/docker/daemon.json

然后写入

{"registry-mirrors":["https://registry.docker-cn.com"]}

7. 重启docker服务

sudo systemctl daemon-reload
sudo systemctl restart docker

8. 验证

docker -v
Docker version 20.10.21, build baeda1f

安装 docker-compose

1. 下载命令

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

可以先看下 $(uname -s)$(uname -m) 分别是啥:

echo $(uname -s)
echo $(uname -m)

image.png

2. 解决报错 curl: (35) Encountered end of file

原因是 443 端口未开放,执行以下命令:

# 需要开启防火墙 systemctl start firewalld
firewall-cmd --zone=public --add-port=443/tcp --permanent # 添加 443 端口访问
firewall-cmd --reload # 重新加载让配置生效

3. 解决报错 FirewallD is not running

如果在上一步执行过程中出现 FirewallD is not running 报错,则需要先打开 firewall,执行以下命令。

systemctl start firewalld.service #开启服务
systemctl enable firewalld.service #设置开机启动

4. 授权 docker-compose

sudo chmod +x /usr/local/bin/docker-compose

如果不执行会出现权限问题: -bash: /bin/docker-compose: 权限不够

5. 验证 docker-compose

docker-compose --version
docker-compose version 1.25.1, build a82fef07

image.png

安装 gitea

1. 编写 docker-compose 文件来安装 gitea

mkdir -p home/docker/gitea
cd home/docker/gitea
vim docker-compose.yml

里面编写如下内容

version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:latest # 直接装最新版就好了,没啥好选的,随意
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - gitea
    volumes:
      - ./data:/data  # /home/data可以替换成你想要的挂载目录
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "33000:3000" # 外网33000对应内部容器3000端口
      - "33333:22" # 外网33333对应内部容器22端口

2. 运行 docker-compose

docker-compose up -d 后台启动 Gitea
docker-compose down
docker-compose logs
docker-compose ps 将显示 Gitea 是否正确启动

image.png 上面图里面是旧端口,下面才是新的。 image.png

3. 验证 gitea 是否能正常访问

访问 http://<ip>:33000ip 是你购买的云服务器的ip地址。(注意,不能用33333访问!)

如果出现如下界面:

image.png

原因是 33000 端口未开放,执行以下命令:

# 需要开启防火墙 systemctl start firewalld
firewall-cmd --zone=public --add-port=33000/tcp --permanent 
firewall-cmd --reload # 重新加载让配置生效

如果还是失败,那就不用docker-compose的方式运行,完全可以使用docker运行!先运行docker-compose down 把服务停止,然后运行:

》》》注意防火墙或安全组中放开用到的端口(例如10022和10080)
官网启动方式
docker run -d --name=gitea -p 33333:22 -p 33000:3000 -v /var/lib/gitea:/data gitea/gitea:latest
本次启动方式(新增两个参数,可以根据需要选择)
docker run -d --privileged=true --restart=always --name=gitea -p 33333:22 -p 33000:3000 -v /var/lib/gitea:/data gitea/gitea:latest
# --privileged=true 使用该参数,container内的root拥有真正的root权限(可根据需要选择是否要该参数)
# --restart=always  自动重启容器(可根据需要选择是否要该参数)
# -p 端口映射(宿主机端口:容器端口)
# -v 容器卷挂载 (宿主机目录 :容器目录)

本人使用如下:

docker run -d --privileged=true --restart=always --name=gitea -p 33333:22 -p 33000:3000 -v /var/lib/gitea:/data gitea/gitea:latest

安装 drone+drone-runner

1. 编写 docker-compose 文件来安装 drone+drone-runner

mkdir -p home/docker/drone
cd home/docker/drone
vim docker-compose.yml

里面编写如下内容

version: '3'
services:
  drone-server:
    restart: always
    image: drone/drone:2
    ports:
      - "9999:80"
    volumes:
      - ./:/var/lib/drone/
      - ./data:/data/
    environment:
      - DRONE_GITEA_SERVER=http://xxxxxxxxx:3000/ # Gitea访问地址
      - DRONE_GITEA_CLIENT_ID=xxxxxxxxx # 应用ID,下一步会获取
      - DRONE_GITEA_CLIENT_SECRET=xxxxxxxxx # 应用密钥,下一步会获取
      - DRONE_SERVER_HOST=xxxxxxxxx:9999
      - DRONE_SERVER_PROTO=http # 支持http, https
      - DRONE_RPC_SECRET=xxxxxxxxx # 通信密钥,下一步会获取
      - DRONE_GIT_ALWAYS_AUTH=true
      - DRONE_GIT_USERNAME=xxxxxxxxx # git用户名
      - DRONE_GIT_PASSWORD=xxxxxxxxx # git密码
      - DRONE_USER_CREATE=username:xxxxxxxxx,admin:true # 管理员用户名,开启管理员账户
  drone-runner-docker:
    restart: always
    image: drone/drone-runner-docker:1
    ports:
      - "10000: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=xxxxxxxxx # 通信密钥,下一步会获取
      - DRONE_RUNNER_NAME=drone-runner-docker
      - DRONE_RUNNER_CAPACITY=2

创建文件好后,先不启动,去Gitea配置获取应用ID密钥!!!

2. 运行 docker-compose

docker-compose up -d 后台启动 Gitea
docker-compose down
docker-compose logs
docker-compose ps 将显示 Gitea 是否正确启动

参考文章

docker+gitea+drone实现超轻量级的CI/CD实战

解决 curl: (35) Encountered end of file 问题

Gitea 与 Drone 集成实践:完全基于 Docker 搭建的轻量级 CI/CD 系统