基于docker-compose 搭建gogs+drone环境

  • 编写编排文件
  • 新建gogs仓库
  • Drone同步仓库项目信息
  • 用Dockerfile 构建定制启动fastapi服务:
  • 定制启动fastapi服务docker-compose.yml:
  • 定义.drone.yml流水线
  • 构建完成后,访问我们的fastapi服务的接口



Gogs 是一款类似GitHub的开源文件/代码管理系统(基于Git),Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务,使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 所有平台,包括 Linux、Mac OS X、Windows 以及 ARM 平台。

Drone 是一个轻量级的 jenkins ,可以简单的实现软件的流水线化测试、编译、部署。并且可以和 gitlab github gogs gitea 轻松的结合到一起。

编写编排文件

version: '3'
services:
  gogs:
    image: gogs/gogs:latest
    container_name: gogs
    ports:
      - "3000:3000"
      - "10022:22"
    volumes:
      - ./data/fastapi_drone/gogs:/data

  gogspgdb:
    image: "postgres:9.4"
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 123456
      POSTGRES_DB: gogs
    ports:
      - '5566:5432'
    volumes:
      - ./data/fastapi_drone/pgdata:/var/lib/postgresql/data

  drone-server:
    image: drone/drone:latest
    container_name: drone-server
    ports:
      - "8080:80"
      - "8443:443"
    volumes:
      - ./data/fastapi_drone/drone:/var/lib/drone/
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_DEBUG=true
      # 启动日志,默认是关闭的
      - DRONE_LOGS_TRACE=true
      # 启动 debug 日志,默认是关闭的
      - DRONE_LOGS_DEBUG=true
      - DRONE_OPEN=true
      # 设置 drone-server 使用的 host 名称,可以是 ip 地址加端口号;容器中可以使用容器名称代替
      - DRONE_SERVER_HOST=drone-server
      - DRONE_GIT_ALWAYS_AUTH=false
      # 开启 gogs
      - DRONE_GOGS=true
      - DRONE_GOGS_SKIP_VERIFY=false
      # gogs 服务地址,使用容器名 + 端口号
      - DRONE_GOGS_SERVER=http://gogs:3000
      # drone 的提供者,本项目中为 gogs 服务
      - DRONE_PROVIDER=gogs
      # 配置 drone 数据库
      - DRONE_DATABASE_DRIVER=sqlite3
      # 配置 drone 数据库文件
      - DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite
      # 协议,可选 http、https
      - DRONE_SERVER_PROTO=http
      # 秘钥,用于 drone-server 与 drone-agent 之间的 RPC 请求
      - DRONE_RPC_SECRET=xiaozhong
      # 秘钥,用于 drone-server 与 drone-agent 直接的请求
      - DRONE_SECRET=xiaozhong
      #  这行非常关键,加上之后,使用 yourUsername 用户名登录 drone 便成为了管理员,如果不加,则看不到Trusted那个按钮,也可以修改数据库!
      - DRONE_USER_CREATE=username:zyx308711822,admin:true

  drone-agent:
    image: drone/agent:latest
    container_name: drone-agent
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_DEBUG=true
      # 启动日志,默认是关闭的
      - DRONE_LOGS_TRACE=true
      # 启动 debug 日志,默认是关闭的
      - DRONE_LOGS_DEBUG=true
      # 设置 drone-server 使用的 host 名称,可以是 ip 地址加端口号;容器中可以使用容器名称代替
      - DRONE_RPC_SERVER=http://drone-server
      # 秘钥,用于 drone-server 与 drone-agent 之间的 RPC 请求
      - DRONE_RPC_SECRET=xiaozhong
      - DRONE_SERVER=drone-server:9000
      # 秘钥,用于 drone-server 与 drone-agent 直接的请求
      - DRONE_SECRET=xiaozhong
      - DRONE_MAX_PROCS=5
      #   - DOCKER_HOST=tcp://127.0.0.1:2375

启动相关的容器服务

docker-compose -f drone_docker_compose_linux.yml up

配置gogs信息

docker安装指定版本的mongo docker安装gogs_docker安装指定版本的mongo


docker安装指定版本的mongo docker安装gogs_远程连接_02


立即安装(错误解决问题-数据库主机地址问题)

docker安装指定版本的mongo docker安装gogs_docker_03


默认同属于启动的默认网桥中)查看容器对应的ip信息

docker安装指定版本的mongo docker安装gogs_docker安装指定版本的mongo_04


docker安装指定版本的mongo docker安装gogs_docker安装指定版本的mongo_05


修改数据库主机地址:

docker安装指定版本的mongo docker安装gogs_postgresql_06


然后正常安装了且可以需要登入:

docker安装指定版本的mongo docker安装gogs_docker_07


此时可以进入到我们的仓库:

docker安装指定版本的mongo docker安装gogs_docker安装指定版本的mongo_08


最终我们的访问的仓库地址为:http://192.168.219.131:3000/

新建gogs仓库

docker安装指定版本的mongo docker安装gogs_postgresql_09

Drone同步仓库项目信息

根据配置文件启动的,访问地址是:http://192.168.219.131:8080

docker安装指定版本的mongo docker安装gogs_postgresql_10


同步这个这个需要注意事项点:

如果需要再流水线构建的过程中进行宿主机的目录的挂载的话,需要使用管理员身份信息进行开启我们的信任按钮:

如果没有看到这个开关的话,说明你使用的账号不是管理员信息,可以通过数据库信息修改,也可以再构建流水线的过程中设置用户信息:

#  这行非常关键,加上之后,使用 yourUsername 用户名登录 drone 便成为了管理员,如果不加,则看不到Trusted那个按钮
      - DRONE_USER_CREATE=username:zyx308711822,admin:true

docker安装指定版本的mongo docker安装gogs_postgresql_11


docker安装指定版本的mongo docker安装gogs_工作区_12


Drone同步仓库项目之后开始激活

docker安装指定版本的mongo docker安装gogs_postgresql_13


这个激活操作之后,会默认的在gogs那进行配置webhooks

docker安装指定版本的mongo docker安装gogs_postgresql_14


docker安装指定版本的mongo docker安装gogs_远程连接_15


git检测项目,并定制好项目的容器启动和配置文件

docker安装指定版本的mongo docker安装gogs_docker安装指定版本的mongo_16


定义我们的app测试main.py:

#!/usr/bin/evn python
# -*- coding: utf-8 -*-

from fastapi import FastAPI
from aioredis import create_redis_pool, Redis

import uvicorn
app = FastAPI()

@app.on_event('startup')
async def startup_event():
    """
    获取链接
    :return:
    """
    import psycopg2
    # 获得游标对象
    conn = psycopg2.connect(database="ceshi", user="postgres", password="123456", host="container-db", port="5432")
    cursor = conn.cursor()
    # sql语句
    sql = "SELECT VERSION()"
    # 执行语句
    cursor.execute(sql)
    # 获取单条数据.
    data = cursor.fetchone()
    # 打印
    print("database version : %s " % data)
    # 事物提交
    conn.commit()
    # 关闭数据库连接
    conn.close()

@app.on_event('shutdown')
async def shutdown_event():
    """
    关闭
    :return:
    """

@app.get("/")
def read_root():
    # 测试连接redis
    # 测试连接数据库
    return {"xx同学": "你是我的情人了22222222222222!!!!!"}

if __name__ == '__main__':
    # 启动服务
    uvicorn.run('main:app', host='0.0.0.0', port=8081, debug=True, reload=True, access_log=False,workers=1, use_colors=True)

用Dockerfile 构建定制启动fastapi服务:

vim Dockerfile
docker build -t fastapi .


FROM python:3.7
WORKDIR /app
COPY ./app ./app
COPY requirements.txt .
RUN pip install --upgrade pip -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com \
    && pip install setuptools==33.1.1 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com \
    && pip install -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host pypi.douban.com -r requirements.txt

定制启动fastapi服务docker-compose.yml:

version: '3.7'

services:
  api:
    build: .
    container_name: "fastapitest-api-container"
    command: uvicorn app.main:app --host 0.0.0.0 --port 8080 --reload
    restart: always
    ports:
      - "8980:8080"
    volumes:
      - /data/pythonfastapitest :/usr/src/fastapi
    depends_on:
      - db

  db:
    image: postgres:12.0-alpine
    container_name: "container-db"
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=123456
      - POSTGRES_DB=ceshi
    expose:
      - 5432

volumes:
  postgres_data:



启动方式:
docker-compose -f 名字.yml up

定义.drone.yml流水线

默认的会自己再workspace临时工作区(执行完成后会删除)内自动进行git clone,(也可以自定义)
2: 把拉取最新仓库的代码拷贝到宿主机的某个目录下
3:通过rone-ssh插件进行和宿主机通信,并执行相关的命令

kind: pipeline # 定义对象类型,还有secret和signature两种类型
type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型
name: 测试克隆 # 定义流水线名称

# 自订购克隆工作区路径-仅是临时的工作区,执行完成流水线后会自动的进行关闭
workspace:
  path: /drone/src

steps: # 定义流水线执行步骤,这些步骤将顺序执行
  # 将当前拉取下来的工作区内(克隆下来的)的文件,转移到宿主机上
  - name: code-scp
    image: appleboy/drone-scp
    settings:
      host: 192.168.219.131 # 远程连接地址
      username: root # 远程连接账号
      password: 123456
      port: 22 # 远程连接端口
      # 转移到宿主机的某个目录下
      target: /data/fatest
      # 拷贝当前工作区内的相关的所有文件(git拉取下来的项目文件)
      source: .

  # 部署项目
  - name: code-deploy
    image: appleboy/drone-ssh # 链接宿主机的SSH插件镜像
    settings:
      host: 192.168.219.131 # 远程连接地址
      username: root # 远程连接账号
      password: 123456
      port: 22 # 远程连接端口
      # 相关的命令的执行
      script:
        - cd /data/fatest
        # 每次发布更新代码都需要重新构建新的镜像!因为我们的代码是复制到镜像里面去的!
        #- docker-compose stop && echo y | docker-compose rm && docker rmi fatest_api:latest
        - docker-compose stop && docker-compose up -d --build
        # 不要这样写!- docker-compose up --build && docker-compose up -d
         
  - name: notify
    image: drillster/drone-email
    settings:
      host: smtp.qq.com      # 例如 smtp.qq.com
      port: 465  #  例如QQ邮箱端口465
      username: 308711822@qq.com  # 邮箱用户名
      password: 输入你自己的啊!!!!  # 邮箱密码
      subject: "Drone build: [{{ build.status }}] {{ repo.name }} ({{ repo.branch }}) #{{ build.number }}"
      from: 308711822@qq.com
      skip_verify: true
      recipients_only: true  # 只发送给指定邮件收件人,不默认发送给流水线创建人;
      recipients: [ 308711822@qq.com]
    when: # 执行条件
      status: [ changed, failure, success]



注意事项:
1:docker-compose up -d --build 需要后台启动,前台启动少-d的话流水线无法往下执行
2:注意fastapi容器内的开启的端口访问和映射端口的不同!
3:其实上面的写死的相关的账号信息等是不合理,通常我们的是需要把写入到我们的DroneSecrets秘钥信息管理中,然后从里面去获取:

DroneSecrets秘钥信息管理 流程

docker安装指定版本的mongo docker安装gogs_远程连接_17


docker安装指定版本的mongo docker安装gogs_工作区_18


docker安装指定版本的mongo docker安装gogs_docker安装指定版本的mongo_19


用小乌龟,执行提交我们的代码到仓库

docker安装指定版本的mongo docker安装gogs_远程连接_20


查看流水构建情况:

docker安装指定版本的mongo docker安装gogs_postgresql_21


docker安装指定版本的mongo docker安装gogs_docker安装指定版本的mongo_22

构建完成后,访问我们的fastapi服务的接口

访问地址为:http://192.168.219.131:8980/

docker安装指定版本的mongo docker安装gogs_docker安装指定版本的mongo_23


验证测试,再修改一下我们的代码,再提交一次!

docker安装指定版本的mongo docker安装gogs_docker安装指定版本的mongo_24


docker安装指定版本的mongo docker安装gogs_工作区_25


遇到问题重启或者修复docker

systemctl daemon-reload && systemctl restart docker

问题2Gogs的web钩子的配置:

开启相关Drone服务之后,不需要手动再进行Gogs的web钩子的配置,只需要进行drone项目下的同步激活配置即可

docker安装指定版本的mongo docker安装gogs_postgresql_26


docker安装指定版本的mongo docker安装gogs_远程连接_27


docker安装指定版本的mongo docker安装gogs_工作区_28


关于drone一些原理基础

drone通过的仓库激活后,则会再对应的仓库上进行自动的配置一个webhook,无需手动再仓库配置(除非你需要自己定义这个webhook,)只有激活配置后,仓库的更新之后才会通知drone执行相关的流水线任务。
.drone.yml 的文件主要是用于描述构建与部署的流程
drone每个步骤就是个容器,每个插件也是个容器,各种组合来进行相关脚本的执行,不管编译,提交到镜像仓库,部署,通知等功能都是由镜像的功能
drone 针对不同类型的runner还有不一样的执行器类型,使用需要使用特点的类型处理相关逻辑
pipeline只是负责把容器启动,至于容器做什么任务的系统不关心

未完待续…