# 使用容器技术,搭建一套 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

  1. 使用终端登陆 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
  1. 配置 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
  1. 浏览器首次访问 git.canicode.cn/install 进行安装,完成初始化,除了下面几个须修改,可选设置则填管理员帐号密码(我填的用户名是 git,方便后面使用同一名称),其他默认即可。
点击查看代码
SSH 服务域名: git.canicode.cn
SSH 服务端口: 10000
HTTP 服务端口: 10001
Gitea 基本 URL: http://git.canicode.cn/
1
2
3
4

初始化配置

  1. 浏览器登陆 git.canicode.cn,右上角菜单进入管理后台-应用配置,查看所有可自定义配置项,如果需要修改调整,则使用终端登陆 CentOS7 服务器,进入 gitea 容器中修改。我的关闭了注册入口,打开了邮箱功能。
点击查看代码
docker container ps
docker exec -it CONTAINERID /bin/sh
vi /data/gitea/conf/app.ini
1
2
3

邮件配置

# 三、Drone server

  1. 浏览器登陆 git.canicode.cn,右上角菜单进入设置-应用,创建保存一个 Gitea OAuth 应用程序。 创建OAuth应用程序 保存OAuth名称密钥
  2. 使用终端登陆 CentOS7 服务器,使用 openssl 生成 secret。
点击查看代码
openssl rand -hex 16
1
  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
  1. 使用 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
  1. 浏览器访问 drone.canicode.cn,首次进入会重定向到 git.canicode.cn 进行登陆授权,点击应用授权即可。 OAuth应用授权

# 四、Drone runner

  1. 使用终端登陆 CentOS7 服务器,如果没有下载过镜像,则下载镜像。
点击查看代码
docker pull drone/drone-runner-docker:1
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
  1. 使用 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

# 五、Drone CI/CD

  1. 浏览器访问登陆 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
  1. 浏览器访问登陆 drone.canicode.cn,打开 git/blog 和 SETTINGS,根据下图配置即可。 设置Drone CI
  2. 本地电脑提交代码到远程仓库后,Drone 会自动运行脚本进行构建部署。(发现个问题,长时间没有提交更新、触发webhooks后,需要手动去SYNC一次) Drone构建部署
  3. 本站点就是基于以上步骤,进行搭建、构建部署,自动更新内容。
点击查看代码
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
Last Updated: 2023/9/18 06:50:08