买了丐版服务器,如何搭建CI/CD,我选Drone
有了服务器(腾讯云:CPU-2核 内存-2GB 硬盘50G)(海外:CPU-2核 内存-1GB 硬盘50G),如何快速让项目上线,这里就需要CI/CD。说到CI/CD, 大家常用的有jenkins,gitlab自带的CI/CD等等等, 但是这两者都太笨重了。
jenkins 硬件要求
硬件最低要求:
- 256 MB 内存
- 1 GB 硬盘空间
小团队推荐的硬件配置:
- 1 GB+ 内存
- 50 GB+ 磁盘空间
gitlab ci/cd 硬件要求
硬件最低要求:
- 2核 2G以上内存(不包含2GB,2GB内存运行的时候内存直接爆掉)
官网给出的推荐配置:
- 4核 4GB内存 支持500个用户,8核 8GB内存 支持1000个用户
这配置jenkins也能安装成功(gitlab想到不要想了),但都太勉强,海外的尤其紧张,综合下来我那小小服务器扛不住啊。 想想以后还要部署其他docker项目, 汗流浃背。
贴上一张腾讯云上面, 通过docker部署drone内存占用情况。
12 + 17 + 33 闲时仅仅只占用72M的内存
安装docker
snap install docker
安装drone
建议大家可以先看文档,国内咱就选gitee,海外就github,下面贴上我在github和gitee的部署代码配置。敏感信息都用***,如何获取,参考中文文档
国内 + gitee
// docker-compose.yml
version: '3.7'
# 创建自定义网络
networks:
drone:
# external: false
driver: bridge
services:
# 数据库服务
drone-db:
image: postgres:latest
container_name: drone-db1
restart: always
networks:
- drone # 加入到drone网络
ports:
- '8001:5432' # 8081为容器暴露到服务器的端口,5432为容器内改应用的端口
environment:
- POSTGRES_USER=name** # PGSQL默认用户名
- POSTGRES_PASSWORD=password*** # PGSQL默认密码
- POSTGRES_DB=db** # PGSQL默认数据库的名字
volumes:
- /root/docker/drone0/db:/var/lib/postgresql/data # 数据卷,前者为服务器真实位置,后者为改应用在容器内的位置
# Drone Server 服务
drone-server:
image: drone/drone:latest
container_name: drone-server1
restart: always
networks:
- drone # 加入到drone网络
ports:
- '8002:80'
- '8003:443'
environment:
- DRONE_SERVER_PROTO=https # 访问协议,创建webHooks和重定向
- DRONE_SERVER_HOST=**.****.com # 主机名称,创建webHooks和重定向
- DRONE_RPC_SECRET=**** # 与 drone runner 通讯的密钥 你可以使用 openssl 生成共享密钥:openssl rand -hex 16
- DRONE_USER_CREATE=username:***,admin:true # 管理员账户 这个账号名一定要与代码托管网站的用户名一致
- DRONE_DATABASE_DRIVER=postgres # 数据库类型
- DRONE_DATABASE_DATASOURCE=postgres://name**:password***@drone-db/db_name?sslmode=disable # 数据库连接
- DRONE_GIT_ALWAYS_AUTH=true # 使用 oauth 身份验证信息拉取代码
- DRONE_GITEE_SERVER=https://gitee.com
- DRONE_GITEE_CLIENT_ID=**** # GITEE 客户端 id
- DRONE_GITEE_CLIENT_SECRET=***** # GITEE 客户端 密钥
- DRONE_GITEE_SKIP_VERIFY=false # 禁用 GITEE 链接时 tls 验证
volumes:
- /volumes/drone/server:/data
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- drone-db
# Drone Docker Runner
drone-runner:
image: drone/drone-runner-docker:latest # 目前drone-runner-docker最新版本为 1.8.0
container_name: drone-runner1
restart: always
networks:
- drone # 加入到drone网络
links:
- drone-server
ports:
- '8004:3000'
environment:
# - DRONE_RUNNER_NAME=docker-runner
- DRONE_RUNNER_CAPACITY=2 # 限制runner可执行的并发管道数量
- DRONE_RPC_PROTO=https # 访问drone server 协议
- DRONE_RPC_HOST=**.***.com # 访问drone server 服务器地址
- DRONE_RPC_SECRET=*** # 与 drone server 通讯的密钥
# - DRONE_UI_USERNAME=*** # Drone Runner 的 UI 用户账号
# - DRONE_UI_PASSWORD=*** # Drone Runner 的 UI 用户密码
# - DRONE_RUNNER_NETWORKS=drone_net
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- drone-server
海外 + github
// docker-compose.yml
version: '3.7'
# 创建自定义网络
networks:
drone:
# external: false
driver: bridge
services:
# 数据库服务
drone-db:
image: postgres:latest
container_name: drone-db1
restart: always
networks:
- drone # 加入到drone网络
ports:
- '8001:5432' # 8081为容器暴露到服务器的端口,5432为容器内改应用的端口
environment:
- POSTGRES_USER=name** # PGSQL默认用户名
- POSTGRES_PASSWORD=password** # PGSQL默认密码
- POSTGRES_DB=db_name # PGSQL默认数据库的名字
volumes:
- /root/docker/drone0/db:/var/lib/postgresql/data # 数据卷,前者为服务器真实位置,后者为改应用在容器内的位置
# Drone Server 服务
drone-server:
image: drone/drone:latest
container_name: drone-server1
restart: always
networks:
- drone # 加入到drone网络
ports:
- '8002:80'
- '8003:443'
environment:
- DRONE_SERVER_PROTO=http # 访问协议,创建webHooks和重定向
- DRONE_SERVER_HOST=**.****.com # 主机名称,创建webHooks和重定向
- DRONE_RPC_SECRET=****** # 与 drone runner 通讯的密钥 你可以使用 openssl 生成共享密钥:openssl rand -hex 16
- DRONE_USER_CREATE=username:***,admin:true # 管理员账户 这个账号名一定要与代码托管网站的用户名一致
- DRONE_DATABASE_DRIVER=postgres # 数据库类型
- DRONE_DATABASE_DATASOURCE=postgres://name**:password**@drone-db/db_name?sslmode=disable # 数据库连接
- DRONE_GIT_ALWAYS_AUTH=true # 使用 oauth 身份验证信息拉取代码
- DRONE_GITHUB_CLIENT_ID=******* # GITHUB 客户端 id
- DRONE_GITHUB_CLIENT_SECRET=******* # GITHUB 客户端 密钥
- DRONE_GITHUB_SKIP_VERIFY=false # 禁用 GITHUB 链接时 tls 验证
volumes:
- /volumes/drone/server:/data
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- drone-db
# Drone Docker Runner
drone-runner:
image: drone/drone-runner-docker:latest # 目前drone-runner-docker最新版本为 1.8.0
container_name: drone-runner1
restart: always
networks:
- drone # 加入到drone网络
links:
- drone-server
ports:
- '8004:3000'
environment:
# - DRONE_RUNNER_NAME=docker-runner
- DRONE_RUNNER_CAPACITY=2 # 限制runner可执行的并发管道数量
- DRONE_RPC_PROTO=http # 访问drone server 协议
- DRONE_RPC_HOST=drone-server # 访问drone server 服务器地址
- DRONE_RPC_SECRET=*** # 与 drone server 通讯的密钥
# - DRONE_UI_USERNAME=user*** # Drone Runner 的 UI 用户账号
# - DRONE_UI_PASSWORD=password** # Drone Runner 的 UI 用户密码
# - DRONE_RUNNER_NETWORKS=drone_net
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- drone-server
通过 docker-compose.yml 安装
docker-compose up -d
nginx 泛域名配置端口
通过map,方便管理端口, 就像js里面的key value一样。
map $http_host $subdomain {
"~^(?P<sub>[^.]+)\.[^.]+\.[^.]+$" $sub;
}
map $subdomain $proxy_port {
drone 8002;
drone1 8001;
drone3 8003;
drone4 8004;
}
location / {
if ($proxy_port != "") {
proxy_pass http://$server_addr:$proxy_port;
}
proxy_pass http://$server_addr:3000;
}
Drone 安装成功后
如果一切顺利, 没有报错, 访问后,应该是这个页面,没有配置nginx的的就先通过端口访问。
登录页面
gitee授权
为项目编写.drone.yml文件
.drone有自己的打包方式, 但我们平时基本上是使用docker, 这里我就结合docker部署
- /var/run/docker.sock:/var/run/docker.sock 使用docker
- event: tag 通过tag执行不同的环境部署
// .drone.yml
kind: pipeline
name: default
pipeline:
build-dev:
image: docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock
commands:
- docker-compose -f docker-compose.test.yml down
- docker-compose -f docker-compose.test.yml build
- docker-compose -f docker-compose.test.yml up -d
when:
event: tag
branch: '*'
ref: refs/tags/test.*
build-prod:
image: docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock
commands:
- docker-compose -f docker-compose.prod.yml down
- docker-compose -f docker-compose.prod.yml build
- docker-compose -f docker-compose.prod.yml up -d
when:
event: tag
branch: '*'
ref: refs/tags/prod.*
登录成功,项目部署成功后