# 使用容器技术,搭建一套 CI/CD 流水线
# 一、环境准备
资源 | 服务器配置/版本号/镜像下载 | 安装文档 |
---|---|---|
Linux | CentOS7 2 核 4G 内存 | aliyun (opens new window) |
Docker | Docker version 19.03.12 | docker (opens new window) |
Nginx | nginx version: nginx/1.18.0 | nginx (opens new window) |
Drone | docker pull drone/drone:1 | Server (opens new window) Runners (opens new window) |
Gitea | docker pull gitea/gitea:latest | gitea (opens new window) |
Node | docker pull node | node (opens new window) |
# 二、gitea
- 使用终端登陆 CentOS7 服务器,使用 Docker Image 创建启动 gitea 容器服务。
点击查看代码
mkdir -p /var/lib/gitea
docker run -d --name=gitea -p 10000:22 -p 10001:3000 -v /var/lib/gitea:/data gitea/gitea:latest
1
2
2
- 配置 Nginx 代理、域名、SSL 证书和端口(如阿里云服务器厂商有安全组规则限制,须设置允许访问端口),然后 nginx -t 和 nginx -s reload 验证重启一下 nginx 服务。
点击查看代码
upstream git {
server localhost:10001;
}
server {
listen 443 ssl;
server_name git.canicode.cn;
ssl_certificate /etc/nginx/cert/cert/git.canicode.cn.crt;
ssl_certificate_key /etc/nginx/cert/cert/git.canicode.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #指定加密算法
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://git;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name git.canicode.cn;
add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";
rewrite ^/(.*) https://$server_name/$1 permanent;
}
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
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
- 浏览器首次访问 git.canicode.cn/install 进行安装,完成初始化,除了下面几个须修改,可选设置则填管理员帐号密码(我填的用户名是 git,方便后面使用同一名称),其他默认即可。
点击查看代码
SSH 服务域名: git.canicode.cn
SSH 服务端口: 10000
HTTP 服务端口: 10001
Gitea 基本 URL: http://git.canicode.cn/
1
2
3
4
2
3
4
- 浏览器登陆 git.canicode.cn,右上角菜单进入管理后台-应用配置,查看所有可自定义配置项,如果需要修改调整,则使用终端登陆 CentOS7 服务器,进入 gitea 容器中修改。我的关闭了注册入口,打开了邮箱功能。
点击查看代码
docker container ps
docker exec -it CONTAINERID /bin/sh
vi /data/gitea/conf/app.ini
1
2
3
2
3
# 三、Drone server
- 浏览器登陆 git.canicode.cn,右上角菜单进入设置-应用,创建保存一个 Gitea OAuth 应用程序。
- 使用终端登陆 CentOS7 服务器,使用 openssl 生成 secret。
点击查看代码
openssl rand -hex 16
1
- 配置 Nginx 代理、域名、SSL 证书和端口(如阿里云服务器厂商有安全组规则限制,须设置允许访问端口),然后 nginx -t 和 nginx -s reload 验证重启一下 nginx 服务。
点击查看代码
upstream drone {
server localhost:10002;
}
server {
listen 443 ssl;
server_name drone.canicode.cn;
ssl_certificate /etc/nginx/cert/cert/drone.canicode.cn.crt;
ssl_certificate_key /etc/nginx/cert/cert/drone.canicode.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://drone;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name drone.canicode.cn;
add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";
rewrite ^/(.*) https://$server_name/$1 permanent;
}
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
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
- 使用 Docker Image 创建启动 Drone server 容器服务。
点击查看代码
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_GITEA_SERVER=https://git.canicode.cn \
--env=DRONE_GITEA_CLIENT_ID=客户端ID \
--env=DRONE_GITEA_CLIENT_SECRET=客户端密钥 \
--env=DRONE_RPC_SECRET=服务器secret \
--env=DRONE_USER_CREATE=username:git,admin:true \
--env=DRONE_SERVER_HOST=drone.canicode.cn \
--env=DRONE_SERVER_PROTO=https \
--publish=10002:80 \
--publish=10003:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 浏览器访问 drone.canicode.cn,首次进入会重定向到 git.canicode.cn 进行登陆授权,点击应用授权即可。
# 四、Drone runner
- 使用终端登陆 CentOS7 服务器,如果没有下载过镜像,则下载镜像。
点击查看代码
docker pull drone/drone-runner-docker:1
1
- 使用 Docker Image 创建启动 Drone runner 容器服务。
点击查看代码
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=https \
-e DRONE_RPC_HOST=drone.canicode.cn \
-e DRONE_RPC_SECRET=服务器secret \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=${HOSTNAME} \
-p 3000:3000 \
--restart always \
--name runner \
drone/drone-runner-docker:1
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 使用 docker logs runner 命令,如输出下面日志,则说明运行正常。
点击查看代码
time="2020-09-04T04:57:29Z" level=info msg="starting the server" addr=":3000"
time="2020-09-04T04:57:29Z" level=info msg="successfully pinged the remote server"
time="2020-09-04T04:57:29Z" level=info msg="polling the remote server" arch=amd64 capacity=2 endpoint="https://drone.canicode.cn" kind=pipeline os=linux type=docker
1
2
3
2
3
# 五、Drone CI/CD
- 浏览器访问登陆 git.canicode.cn,创建一个 blog 新仓库,然后 git clone 到本地电脑,新建一个 .drone.yml 文件。
点击查看代码
kind: pipeline
name: docker
steps:
- name: build
image: node:latest
settings:
restore: true
mount:
- node_modules
volumes:
- name: site_root
path: /tmp/site_root
commands:
- npm install
- npm run build
- cp -rf docs/.vuepress/dist/* /tmp/site_root
volumes:
- name: site_root
host:
path: /usr/share/nginx/blog
trigger:
branch:
- master
event:
- push
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
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
- 浏览器访问登陆 drone.canicode.cn,打开 git/blog 和 SETTINGS,根据下图配置即可。
- 本地电脑提交代码到远程仓库后,Drone 会自动运行脚本进行构建部署。(发现个问题,长时间没有提交更新、触发webhooks后,需要手动去SYNC一次)
- 本站点就是基于以上步骤,进行搭建、构建部署,自动更新内容。
点击查看代码
server {
listen 443 ssl;
server_name www.canicode.cn canicode.cn;
ssl_certificate /etc/nginx/cert/cert/www.canicode.cn.crt;
ssl_certificate_key /etc/nginx/cert/cert/www.canicode.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/blog;
index index.html index.htm;
}
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name www.canicode.cn canicode.cn;
add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";
return 307 https://$host$request_uri;
}
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
如何创建发布 →