Drone CI + GitLab持续集成的基础设施搭建

Docker安装

使用包管理安装或者参照官方文档安装:英文文档 中文文档

Docker Compose

使用包管理安装或者参照官方文档安装:英文文档 中文文档

为什么选择使用 Docker Compose?

我们都知道,Docker 就可以直接实例化容器,为什么还要额外安装 docker-compose 呢? docker-compose 的优势在于统一管理配置。如果编排多个容器的时候,Docker 固然也能胜任,但是管理起来没有 docker-compose 来得方便,比如我需要更改容器中的某个参数,Docker 原生命令需要重新编译容器,并且要把其他需要设置的所有的参数带上。而 docker-compose 的话,虽然原理是一样的,但是我们需要做的就少很多了,只需要找到 docker-compose.yml 文件,修改对应的参数,然后重新执行 build-run 就可以了,是不是相对方便了很多?机器擅长的事情就交给机器去做,这样人类就可以拥有更多时间去享受生活啦!

GitLab设置Application

这里我们主要介绍 DroneGitLab 怎么配合使用,需要用到其他托管工具的可以参照官方文档,英文文档 中文文档。下面继续讲解如何设置 GitLabApplication。首先打开GitLab并登入,点击头像下方的 Settings然后点击左边栏的 Application:

Click Settings

输入 Application 的名字和回调地址,名字随意取,回调地址输入你 Drone 和用到的域名并在后面加上 authorize 即可,比如: https://drone.my-domain.com/authorize ,域名不需要可以访问,添加 Application 的过程中不会发送请求到你填写的这个域名,不会验证这个域名的可访问性,你可以稍后再配置这个域名到你的 Drone Web 中。

Enter Name and Redirect URI

记下生成的 Application IdSecret,稍后配置 Drone 的时候需要用到。

编写 docker-compose.yml

docker-compose 是一个用于多容器编排的Docker官方工具,利用这个工具可以快速、简便地编排多个容器。因为我们需要用到Drone,所以 docker-compose 文件大概长成这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version: "3.7"
services:
# drone server container
drone-server:
# 偷懒直接使用官方镜像,Alpine Linux编译的容器体积是最小的
image: drone/drone:alpine
container_name: drones # 容器别名
restart: always # 每次启动Docker会自启动容器
networks: # 设置容器所在网络,方便之后容器间通信
- webnet
volumes: # 映射容器里面的目录到本机,格式:本机目录:容器目录
- /srv/drone:/var/lib/drone
environment: # 容器里面的环境变量
- DRONE_ADMIN=zmcdbp # Drone的管理员
- DRONE_DEBUG=true # Debug 模式,调试的时候可以打开,默认是关闭的
- DRONE_OPEN=true # 启用Drone
- DRONE_HOST=https://drone.mydomain.com # 设置Drone的域名,要于上面配置GitLab的Application时的域名保持一致
- DRONE_GITLAB=true # 启用Drone的GitLab服务,默认是关闭的
- DRONE_GITLAB_URL=https://git.my-gitlab.com # 设置GitLab的域名
- DRONE_GITLAB_CLIENT=your-gitlab-application-key # GitLab的Application中的key
- DRONE_GITLAB_SECRET=your-gitlab-application-secret # GitLab的Application中的secret
- DRONE_SECRET="my-drone" # Drone Server和Drone Agent通信加密
drone-agent:
image: drone/drone:alpine
container_name: dronea
restart: always
networks:
- webnet
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock # Drone Agent 需要用到Docker来实例化容器
environment:
- DRONE_DEBUG=true
- DRONE_SERVER=drone-server:9000
- DRONE_SECRET="my-drone"

OK,是不是很简单?

Nginx容器(可选)

如果你服务器没有安装 Nginx ,使用 Docker 可以很方便地快速安装一个 Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
services:
# ...
nginx:
image: nginx:stable-alpine
container_name: nginx
ports:
- "80:80"
- "443:443"
restart: always
volumes:
- /path/to/webroot:/var/www/html:rw # 配置站点目录
- /path/to/nginx/sites:/etc/nginx/sites:ro # Nginx的站点配置文件目录(可以在nginx.conf中修改这个文件夹
- /path/to/nginx/logs:/var/log/nginx:rw # Nginx的日志目录
- /path/to/nginx/your-nginx.conf:/etc/nginx/nginx.conf:rw # Nginx的默认配置文件
networks:
- webnet # 与其他容器保持在同一网络中

就这样搞定了 Nginx ,是不是超简单?当然你还可以使用 Dockerfile 来定制自己的 Nginx 容器,以后会再写文章介绍怎么使用 Dockerfile 定制自己的容器,敬请期待。

配置Drone Web

搞定上面的 docker-compose.yml 之后就可以执行以下命令创建容器和网络了:

1
docker-compose up -d

docker-compose up -d

因为我已经创建过,所以之后提示 up-to-date,如果你是第一次创建的话,会有一个 下载-编译 的过程。Anyway,我们需要用到的容器就这样创建好了。让我们先看看容器运行是否正常:

1
docker-compose ps

docker-compose ps

接下来我们配置 Drone Web ,下面是配置 Nginx 的站点文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
upstream drone {
server drone-server:8000;
}

server {
listen 80;
server_name drone.your-domain.com;
## ssl
#listen 443 ssl;
## ssl cert
#ssl_certificate /path/to/your/domain/cert.pem;
## ssl key
#ssl_certificate_key /path/to/your/domain/key.pem;

location / {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;

proxy_pass http://drone;
}

## if you use let's encrypt
#include /etc/nginx/configs/letsencrypt.conf;

# logs
error_log /var/log/nginx/drone_error.log;
access_log /var/log/nginx/drone_access.log;
}

#server {
# server_name drone.your-domain.com;
# return 301 https://$host$request_uri;
#}

如果你不需要用到 HTTPS301重定向 的话,直接复制上面的代码并把 server_name 改成自己的域名即可。记得要把这个文件放到上面编写 Nginx 容器时映射到本地的 Nginx 站点 目录下。比如你是跟我一样设置的话就应该是在:/path/to/nginx/sites 这个目录下。

添加好配置文件之后,接下来需要做的当然是需要重启 Nginx 啦,如果你和我一样使用的是容器化的 Nginx 的话,执行下面这条命令即可重启 Nginx 容器:

1
docker-compose restart nginx

restart nginx container

如果你使用的是本地的 Nginx 并且使用的是 systemd 服务管理,那么可以执行以下命令:

1
sudo systemctl reload nginx

systemd nginx reload

没有反馈有点慌?不要怕,Linux下面没有输出就是没有问题!当然,我们还是看看 Nginx 是否运行正常比较稳妥。查看 systemd 中的 Nginx 是否运行正常:

1
sudo systemctl status nginx

systemctl status nginx

查看容器是否运行正常:

1
docker-compose ps

docker-compose ps

访问Drone Web

一切OK,我们访问一下刚刚配置好的Drone Web:

Access Drone Web

设置需要Build的项目

设置需要持续集成的项目:

setting repositories

编写.drone.yml文件

前面这些只是开胃菜,重头戏是这个看似简单的 .drone.yml 文件的编写,由于篇幅较长,我决定另开一篇文章叙述。

Happy Ending

Drone + GitLab 的基础设施搭建和配置到这就结束了,感谢大家的阅读。希望大家能从这篇文章中得到帮助。如果你对这篇文章有任何意见或建议,都欢迎给我发送邮件,优质的文章离不开读者的反馈。