Gogs + Drone 实现CI/CD(CI)
本文通过docker-compose方式安装运行drone,先将drone的server和agent镜像拉取到本地,这样docker-compose脚本执行速度会快一点。当然,不是必须先拉取drone镜像,完全可以直接用docker-compose执行编写好的脚本。
拉取drone镜像
sudo docker pull drone/drone:1.0.0-rc.5 sudo docker pull drone/agent:1.0.0-rc.5
安装docker-compose,已安装的话可跳过。
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
需要创建一个目录,在此目录下编写docker-compose.yml文件,然后运行docker-compose命令
mkdir /etc/drone
vi /etc/drone/docker-compose.yml
docker-compose.yml内容如下:
version: '3' services:
drone-server:
image: drone/drone:1.0.0-rc.5
ports:
- 10081:80
volumes:
- /var/lib/drone:/var/lib/drone
- /var/run/docker.sock:/var/run/docker.sock
restart: always
env_file:
- /etc/drone/server.env drone-agent:
image: drone/agent:1.0.0-rc.5
command: agent
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: always
env_file:
- /etc/drone/agent.env
生成drone和agent之间通信需要的密钥
LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 65 && echo
此次生成的密钥内容为:MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
在/etc/drone/目录创建文件server.env,保存如下内容:
DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
DRONE_SERVER_HOST=192.168.1.137:10081
DRONE_SERVER_PROTO=http
DRONE_OPEN=true
DRONE_GOGS=true
DRONE_GOGS_SERVER=http://192.168.1.137:10080
DRONE_PROVIDER=gogs
DRONE_LOGS_TRACE=true
DRONE_LOGS_DEBUG=true
agent.env内容如下:
DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
DRONE_RPC_SERVER=http://192.168.1.137:10081
DRONE_LOGS_TRACE=true
DRONE_LOGS_DEBUG=true
通过命令启动drone
docker-compose up -d
本地访问drone服务器地址http://192.168.1.137:10081,用gogs账号登录drone
登录失败,gogs服务器connection refused,应该是端口问题,那就开放gogs端口。请确保gogs已经启动。
sudo firewall-cmd --zone=public --add-port=10080/tcp --permanent
sudo firewall-cmd --reload
登录之后在drone面板先同步gogs代码仓库,选择一个仓库,在设置选项填写之前生成的密钥,保存设置之后,gogs仓库会生成一个web hook
由于之前已经配置好了gogs,进入项目仓库,更新web钩子,将推送地址加上drone服务器端口号
更新web hook之后,点击下面的测试推送,如果失败提示connection refused的话,就开放drone的10081端口。
为这个空仓库新增.drone.yml文件
kind: pipeline
name: greeting steps:
- name: en
image: alpine
commands:
- echo hello
- echo world - name: es
image: alpine
commands:
- echo hola
- echo mundo - name: fr
image: alpine
commands:
- echo bonjour
- echo monde - name: zh
image: alpine
commands:
- echo 你好
- echo 世界
提交到gogs仓库后,自动触发web hook事件,drone会执行yml文件中的脚本
然鹅构建却一直pending...
这个drone.yml脚本比较简单,只是简单的打印消息,然而不解的是不知道为什么没有输出。不得其解就继续翻官方文档和各种issue以及网络教程,没什么头绪就把配置项尽可能写全一点,发现原来是数据库配置项的原因,drone默认使用sqlite做数据持久化,但是文档也写明说不需要额外的配置,但是按照目前的配置,虽然web hook可以触发,但是pipeline任务一直处于pending状态,加上数据库配置项,终于有了动静。
虽然官方强烈建议使用postgres而不是mysql,但是既然drone支持使用mysql,而且我安装的就是mysql,那当然是使用mysql配置项了。drone还强烈建议使用gitea而不是gogs呢。在server.env中加上下面这两行配置,mysql账号密码和ip改成自己的。
DRONE_DATABASE_DRIVER=mysql
DRONE_DATABASE_DATASOURCE=root:password@tcp(1.2.3.4:3306)/drone?parseTime=true
也可以使用下面的配置,会在配置路径下产生sqlite脚本,drone产生的数据会保存在这个脚本中。
- DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite
- DRONE_DATABASE_DRIVER=sqlite3
重新执行一下pipeline脚本,终于成功。
以上的docker-compose.yml也可以整合为一个文件,贴一下内容,可供参考
version: '3'
services:
drone-server:
image: drone/drone:1.0.0-rc.5
ports:
- 10081:80
volumes:
- ./drone:/var/lib/drone/
- /var/run/docker.sock:/var/run/docker.sock
restart: always
environment:
- DRONE_OPEN=true
- DRONE_SERVER_HOST=192.168.1.137:10081
- DRONE_SERVER_PROTO=http
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_DEBUG=true
- DRONE_GOGS=true
- DRONE_GOGS_SERVER=http://192.168.1.137:10080
- DRONE_PROVIDER=gogs
- DRONE_DATABASE_DATASOURCE=root:your_password@tcp(192.168.1.137:3306)/drone?parseTime=true
- DRONE_DATABASE_DRIVER=mysql
- DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
drone-agent:
image: drone/agent:1.0.0-rc.5
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: always
environment:
- DRONE_RPC_SERVER=http://192.168.1.137:10081
- DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
- DRONE_LOGS_TRACE=true
- DRONE_LOGS_DEBUG=true
记录一下可能会遇到的问题:
1、web hook可以正常推送消息,而pipeline脚本一直pending,检查drone-server的数据库配置项;
2、以非root用户运行,可能会遇到docker权限问题,需要将当前用户加入到docker用户组,避免重新登录的话可以su root,然后再su当前用户;
3、pipeline脚本执行的时候抛出docker权限异常,需要将drone-agent挂载docker执行目录。
通过此番操作,已经实现了持续集成,要实现持续交付,关键在于.drone.yml的编写,Deployment部分待下回推送代码之后再做分享。
顺便说一下drone的文档,1.0之前的文档提供的安装方式是docker compose,有中文文档;1.0之后的文档提供的安装方式的使用docker,只有英文版,不过好像断层了,没有提供1.0版本之前的文档链接。
Gogs + Drone 实现CI/CD(CI)的更多相关文章
- 基于Gogs+Drone搭建的私有CI/CD平台
请移步 基于Gogs+Drone搭建的私有CI/CD平台
- CI/CD
CI/CD 啥是CI/CD CI: continuous integration, 持续集成.就是频繁地把开发的工作提交到主线代码.主要是为了解决集成问题.什么是集成问题呢,白话说,就是从你本地的代码 ...
- Serverless 实战 —— Funcraft + OSS + ROS 进行 CI/CD
前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准 ...
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)
前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 打算用三个篇幅来记录完整的全过程 觉得有帮助的朋友~可以左上 ...
- 【漫话DevOps】Agile,CI/CD,DevOps
随着DevOps理念的普及与扩散,可能会被一大堆名字概念搞的莫名其妙,理清它们之间的关系可以帮助团队知道DevOps如何落地,改善工作流程. Here's a quick and easy way t ...
- Azure 实践(4)- CI/CD .netcore项目Docker构建及部署
上篇已介绍了.netcore项目构建的相关步骤,本篇继续完善 1.什么是CI/CD CI/CD 中的"CI"始终指持续集成,它属于开发人员的自动化流程.成功的 CI 意味着应用代码 ...
- drone 0.8.8 集成gogs 进行ci/cd 处理
drone 是一个不错的基于容器的ci/cd 工具,运行简单,同时插件也挺多,基本常见的轻量级的任务都是可以搞定的 环境准备 使用docker in docker docker-compose 文件 ...
- 自建Git服务Gogs和CI/CD服务Drone
自建Git服务Gogs和CI/CD服务Drone 项目:https://gogs.io Gogs运行 docker run -d --name=gogs -p 10022:22 -p 10088:30 ...
- 容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD
什么是CI/CD 持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每 ...
- Gogs+Drone搭建CI/CD平台
Gogs 是由 Go 语言编写的 Git 服务器,由中国人主导开发的一款开源项目,搭建方便并且拥有完善的中文文档,配合 Drone 可以实现持续集成/持续部署.本文介绍如何通过 Docker 搭建 G ...
随机推荐
- 000 装docker
直接参考别人的文章,经过验证,没有问题,需要网络. URL: https://www.cnblogs.com/qgc1995/archive/2018/08/29/9553572.html 我是虚拟机 ...
- layer.msg 弹出不同的效果的样式
icon 1到6的不同效果 layer.msg(,time:, shift: });//一个勾 layer.msg(,time:, shift: });//一个叉 layer.msg(,time:, ...
- shell编程系列19--文本处理三剑客之awk中的字符串函数
shell编程系列19--文本处理三剑客之awk中的字符串函数 字符串函数对照表(上) 函数名 解释 函数返回值 length(str) 计算字符串长度 整数长度值 index(str1,str2) ...
- java 数据相除
编程的人都知道,java中的“/”.“%”运算,其中前者为取整,后者取余数.那么有没有快捷的运算方法取正常的运算结果呢? /** * TODO 除法运算,保留小数 * @author 袁忠明 * @d ...
- SQL查询优化 LEFT JOIN和INNER JOIN
作者:VerySky 推荐:陈敬(Cathy) SQL查询优化 LEFT JOIN和INNER JOIN 1,连接了八个数据库表,而且全部使用LEFT JOIN,如下所示: Resource_Reso ...
- Codeforces Round #556 (Div. 2) D. Three Religions 题解 动态规划
题目链接:http://codeforces.com/contest/1150/problem/D 题目大意: 你有一个参考串 s 和三个装载字符串的容器 vec[0..2] ,然后还有 q 次操作, ...
- html如何修改hr水平直线的粗细
hr是常见的超文本标签,是一条水平直线,要设置该直线变粗一些.可以先把hr本身的border隐藏掉,然后设置border-top-width,也就是只留上边框,如图:hr的默认高度height是0,所 ...
- 【linux学习笔记四】文件搜索命令
一 文件搜索 locate //在后台数据库中按文件名搜索 搜索速度更快 locate 文件名 //locate命令所搜索的后台数据库 /var/lib/mlocate //更新数据库 updated ...
- 【linux学习笔记三】链接命令
链接命令:ln link =============华丽的分割线============= ln又有软链接和硬链接 //硬链接特征(不建议创建硬链接) 1.拥有相同的i节点和存储block块,可以看做 ...
- anywhere随启随用的静态文件服务器
手机移动端调试,也可以使用anywhere anywhere -p 8080 指定端口 anywhere -s 保持浏览器关闭 anywhere -h localhost -p 8080 通过主机名 ...