Drone 1.0 with Gogs CI/CD

Posted by 小炒肉 on June 18, 2019

Drone搭建的私有CI/CD平台

Drone 是基于 Go语言开发的一款用于 CI/CD DevOps自动化平台, 它基于 Docker 配置以及运行.

官方 github : https://github.com/drone/drone 官方文档: https://docs.drone.io/

环境说明

IP 系统 Kernel docker 版本 docker-compose 版本
192.168.168.102 CentOS 7 4.4.181 18.09.6 1.24.0

安装 Drone

docker 与 docker-compose 安装就略过了。

Drone 使用 docker-compose 直接安装既可。

Drone 支持三种数据库默认为 sqllite3 , 还支持 Mysql 与 Postgres

这里就使用 mysql

这里关闭 firewalld 与 selinux

mysql 的 compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '2'
services:
  mysql:
    image: mysql:5.7
    hostname: mysql
    container_name: mysql
    restart: always
    volumes:
    - ./data/mysql/data:/var/lib/mysql
    - ./data/mysql/logs:/opt/local/mysql/logs
    - ./data/mysql/binlog:/opt/local/mysql/binlog
    - /etc/localtime:/etc/localtime
    environment:
    - MYSQL_ROOT_PASSWORD=123456
    - TZ=Asia/Shanghai
    ports:
      - "192.168.168.102:3306:3306"

创建一个 Gogs

1
2
3
4
5
6
7
8
9
10
11
12
13
  gogs:
    image: gogs/gogs
    hostname: gogs
    container_name: gogs
    restart: always
    volumes:
    - /etc/localtime:/etc/localtime
    - ./data/gogs:/data
    ports:
      - "192.168.168.102:3000:3000"
    depends_on:
      - mysql

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
# 登录 mysql , 创建 gogs 以及 drone 数据库

mysql -uroot -p123456 -h 127.0.0.1

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.26    |
+-----------+
1 row in set (0.00 sec)


mysql> CREATE DATABASE IF NOT EXISTS gogs CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)


mysql> create database drone;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| drone              |
| gogs               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)


配置 gogs

1
2
# 使用浏览器 访问 http://192.168.168.102:3000

1
2
# 这里配置相关数据库信息 并将localhost 修改为 192.168.168.102

1
2
3
4
5
6
7
8
9
10
11
# 登录 gogs 以后,创建一个测试的仓库

创建新的仓库:
     拥有者: jicki
     仓库名称: drone
     仓库描述: 测试 drone 仓库
     .gitignore: Actionscript
     授权许可: Apache License 2.0
     自述文档: Default
     使用选定的文件和模板初始化仓库

图1

配置 drone 的compose

Drone 支持常见的Git仓库,例如 Github,Gitlab, Bitbucket以及Gogs等。

这里使用 Gogs, 不同的 git 仓库 配置有所不同。

1
2
3
4
5
# 创建一个 secret 用于 Agent 与 Server 间的通讯

[[email protected] ~]# openssl rand -hex 16
dfde64837533976ee7dbf4a87e03ad1f

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
37
38
39
40
41
services:
  drone-server:
    image: drone/drone:latest
    hostname: drone-server
    container_name: drone-server
    restart: always
    environment:
      - DRONE_LOGS_DEBUG=true
      - DRONE_GIT_ALWAYS_AUTH=false
      - DRONE_AGENTS_ENABLED=true
      - DRONE_GOGS_SERVER=http://192.168.168.102:3000
      - DRONE_RPC_SECRET=dfde64837533976ee7dbf4a87e03ad1f
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_SERVER_HOST=192.168.168.102:8000
      - DRONE_SERVER_PROTO=http
      - DRONE_TLS_AUTOCERT=false
    volumes:
      - /etc/localtime:/etc/localtime
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data/drone:/var/lib/drone/
    ports:
      - 8000:80
      - 6443:443
    depends_on:
      - mysql
  drone-agent:
    image: drone/agent:latest
    hostname: drone-agent
    container_name: drone-agent
    restart: always
    environment:
      - DRONE_DEBUG=true
      - DRONE_RPC_SERVER=http://192.168.168.102:8000
      - DRONE_RPC_SECRET=dfde64837533976ee7dbf4a87e03ad1f
      - DRONE_RUNNER_CAPACITY=2
    volumes:
      - /etc/localtime:/etc/localtime
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - drone-server

验证 Drone 服务

1
2
3
4
5
6
7
8
9
10
11
12
# 使用浏览访问

http://192.168.168.102:8000


# 这里特别注意,因为我们关联的是 gogs 的 git

# 所以这里登录 drone 的时候,必须使用 gogs 的账号密码

# 所以这里我们 部署 CI/CD 的时候~可以使用一个 管路员账号

# 或者使用一个有 所有组权限 的账号

图2

激活仓库

图3

图4

图5

图6

创建一个 .drone.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建一个 .drone.yml 并上传到 gogs 仓库中


# 这里是 单 Agent, 的 pipeline

# 1.0 版本支持 多 Agent, 多个 node 区分的 pipeline

vi .drone.yml

kind: pipeline
name: default

steps:
- name: frontend
  image: alpine
  commands:
  - echo "This My Drone CI Test!"

图7

图8

图9

1
2
# 创建一个 后端 golang

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vi main.go


package main

import (
    "fmt"
)

func main() {
    fmt.Printf("hello world");
}

func hello() string {
    return "hello world";
}

1
2
3
4
5
6
7
8
9
10
11
12
vi main_test.go

package main

import "testing"

func TestHello(t *testing.T) {
    if hello() != "hello world" {
        t.Error("Testing error")
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 编辑 .drone.yml 文件,增加后端

vi .drone.yml

kind: pipeline
name: default

steps:
- name: frontend
  image: alpine
  commands:
  - echo "This My Drone CI Test!"

- name: backend
  image: golang
  commands:
  - go build
  - go test

图10

图11

图12