基于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信息
立即安装(错误解决问题-数据库主机地址问题)
默认同属于启动的默认网桥中)查看容器对应的ip信息
修改数据库主机地址:
然后正常安装了且可以需要登入:
此时可以进入到我们的仓库:
最终我们的访问的仓库地址为:http://192.168.219.131:3000/
新建gogs仓库
Drone同步仓库项目信息
根据配置文件启动的,访问地址是:http://192.168.219.131:8080
同步这个这个需要注意事项点:
如果需要再流水线构建的过程中进行宿主机的目录的挂载的话,需要使用管理员身份信息进行开启我们的信任按钮:
如果没有看到这个开关的话,说明你使用的账号不是管理员信息,可以通过数据库信息修改,也可以再构建流水线的过程中设置用户信息:
# 这行非常关键,加上之后,使用 yourUsername 用户名登录 drone 便成为了管理员,如果不加,则看不到Trusted那个按钮
- DRONE_USER_CREATE=username:zyx308711822,admin:true
Drone同步仓库项目之后开始激活
这个激活操作之后,会默认的在gogs那进行配置webhooks
git检测项目,并定制好项目的容器启动和配置文件
定义我们的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秘钥信息管理 流程
用小乌龟,执行提交我们的代码到仓库
查看流水构建情况:
构建完成后,访问我们的fastapi服务的接口
访问地址为:http://192.168.219.131:8980/
验证测试,再修改一下我们的代码,再提交一次!
遇到问题重启或者修复docker
systemctl daemon-reload && systemctl restart docker
问题2Gogs的web钩子的配置:
开启相关Drone服务之后,不需要手动再进行Gogs的web钩子的配置,只需要进行drone项目下的同步激活配置即可
关于drone一些原理基础
drone通过的仓库激活后,则会再对应的仓库上进行自动的配置一个webhook,无需手动再仓库配置(除非你需要自己定义这个webhook,)只有激活配置后,仓库的更新之后才会通知drone执行相关的流水线任务。
.drone.yml 的文件主要是用于描述构建与部署的流程
drone每个步骤就是个容器,每个插件也是个容器,各种组合来进行相关脚本的执行,不管编译,提交到镜像仓库,部署,通知等功能都是由镜像的功能
drone 针对不同类型的runner还有不一样的执行器类型,使用需要使用特点的类型处理相关逻辑
pipeline只是负责把容器启动,至于容器做什么任务的系统不关心
未完待续…