Saturday, April 16, 2022

[CI/CD] 自建 DroneCI + Gitea + Docker Registry + Docker Registry Web 一次搞定

本篇將提供一個 Docker Compose YAML file 的範例,可產生 DroneCI + Gitea + Docker Registry + Docker Registry Web 的 CI/CD環境

Gitea 是蠻多公司的選擇,所以我選用它。同時,在這個講求效率的開發時代,必須要搭配一個 CI/CD 的平台。Drone CI 這是一套開源的持續整合框架,可以幫工程師節省非常多上版的時間,從測試、包版、image化到部屬全部一條龍服務,而且非常容易上手,易於維護,因此我們選用作為平台。

另外,Docker Registry 這就不用再多說了,而方便查詢Registry的Web可以提供快速與便利的介面來查看在Registry內的Docker Images。

先整理一下 Port Mapping List:


上述的系統可以透過執行下列範例 docker-compose YAML file 即完成建置。

( 執行環境: VM with IP: 192.168.56.101 )
假設有個USB Disk:
$ sudo fdisk -l

Disk /dev/sda: 465.8 GiB, 500107861504 bytes, 976773167 sectors
Disk model: Expansion
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x033ceea7

Device     Boot Start       End   Sectors   Size Id Type
/dev/sda1           2 976773166 976773165 465.8G  7 HPFS/NTFS/exFAT 位於 /dev/sda1

我們把它掛載在 /mnt/USB/registry
$ sudo mkdir /mnt/USB

$ sudo mount /dev/sda1 /mnt/USB/


(
更改 Customize the storage location)
volumes:
- /mnt/USB/registry:/var/lib/registry

version: "3.3"
services:
    docker-registry:
        image: registry:2
        environment:
            - REGISTRY_HTTP_ADDR=0.0.0.0:5000
        restart: always
        ports:
            - 0.0.0.0:5000:5000
        volumes:
            - /mnt/USB/registry:/var/lib/registry 
        networks:
            - drone-net
    docker-registry-web:
        image: hyper/docker-registry-web:latest
        environment:
            - REGISTRY_URL=http://192.168.56.101:5000/v2
        restart: always
        ports:
            - 0.0.0.0:8081:8080
        networks:
            - drone-net
    drone-server:
        image: drone/drone:1
        environment:
            - DRONE_GITEA_SERVER=http://192.168.56.101:3000
            - DRONE_GITEA_CLIENT_ID=<客戶端ID>
            - DRONE_GITEA_CLIENT_SECRET=<客戶端密鑰>
            - DRONE_RPC_SECRET=1q2w3e4r #共用密碼(自行設定)
            - DRONE_SERVER_HOST=192.168.56.101:8000
            - DRONE_SERVER_PROTO=http
        restart: always
        ports:
            - 0.0.0.0:8000:80
        networks:
            - drone-net
    drone-runner:
        image: drone/drone-runner-docker:1
        environment:
            - DRONE_RPC_PROTO=http
            - DRONE_RPC_HOST=drone-server
            - DRONE_RPC_SECRET=1q2w3e4r #共用密碼(自行設定)
            - DRONE_RUNNER_CAPACITY=1
            - DRONE_RUNNER_NAME=drone-runner-1
        restart: always
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
        networks:
            - drone-net
    gitea-server:
        image: gitea/gitea:1.13.3
        container_name: gitea
        environment:
          - USER_UID=1000
          - USER_GID=1000
        restart: always
        networks:
          - drone-net
        volumes:
          - ./gitea:/data
        ports:
          - "3000:3000"
          - "222:22"
networks:

drone-net:

當建立 Docker Registry之後,可將 Registry 設定到 insecure 清單可忽略 TLS 協定,接下來在需要使用 Docke rRegistry的主機內設定為到 insecure 清單。

insecure 設定檔路徑「/etc/docker/daemon.json」

{   
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    },
    "insecure-registries":["192.168.56.101:5000"]
}

重新啟動 docker 服務才可以生效

systemctl restart docker

詳細請參考: https://docs.docker.com/registry/insecure/


P.S: 產生 Gitea OAuth

根據文件,第一步要在 Gitea 的設定中找到 Applications 這個頁籤,建立一個新的應用。名稱我們給他 drone,URI 是 http://192.168.56.101:8000

當按下建立應用程式後,可以得到客戶端 ID 與 客戶端密鑰,並將這些資訊填入到YAML 內的 drone-server 所需的環境變數內:

- DRONE_GITEA_CLIENT_ID=<客戶端ID>
- DRONE_GITEA_CLIENT_SECRET=<客戶端密鑰>


參考資料:

在本機使用Docker架Gitea和DroneCI

使用Gitea+Drone打造自己的CI/CD系统









No comments: