盘古是javashop团队内部总结多年的部署经验推出的一款开源的devops工具, 致力于在提供简单、使用、高效的可持续集成服务。在目前流行的devops工具中缺少对机器、仓库、步骤、环境变量的明确定义、操作,盘古提供了上述的资源的管理,内置常见java,、PHP、nodejs、mysql、nginx等常见环境的执行器(直接编排为步骤),并提供了导出导入功能、一键复制流水线,极大方便了部署过程。通过环境变量和配置文件可以实现复杂的大型项目统一配置。未来计划支持k8s的流水线编排,感谢您的star,您的支持是我们不断完善的最大动力! 欢迎加入盘古交流群:最下方扫码进群。
对比流行的devops工具(如jenkins、瓦力等),盘古汲取了他们的众多优点,并结合我们在实际使用中碰到的问题,尝试给大家提供一款更加简便易用的devops工具。
基于Java+h2,一个jar包即可运行
开箱即用是盘古追求的第一目标,再使用jenkins、瓦力等等工具的过程,希望可以提供最简便的安装过程。
(1、盘古明确定义出步骤、依赖、检查等概念,希望提供极低的编排门槛
(2、内置git clone、安装jdk、安装maven、mysql、nginx、nodejs等等常见执行器,简化编排过程
(3、步骤可以暂停跳过、拖拽排序编排步骤,方便部署异常情况调试
(4、内置检查器,可检测编排步骤是否确认成功
(5、导出导入编排文件,一键复制编排
在大型的项目devops过程中,需要统一定义数据账号密码、秘钥、域名等等的配置文件,盘古抽象出环境变量、配置文件的概念来解决这类问题。统一定义如mysql密码、spring boot配置文件等
提供机器管理、标签设置,按机器按标签,批量部署
提供仓库管理、方便部署编排
按项目汇总配置文件、环境变量,简化编排过程
插件式扩展、希望借助开源社区的力量, 提供无限可能
请根据您的情况选择
前置条件:安装docker,可参考这里:
https://pangu.javamall.com.cn/docs/#/docker
运行盘古
通过如下命令来运行盘古:
docker volume create pangudata
docker run --rm -d -p 8080:8080 --name pangu -v pangudata:/opt/pangu/database registry.cn-beijing.aliyuncs.com/javashop-enation/pangu:1.0.0
访问 http://ip:8080是否启动成功
前置条件安装Java 请参考https://www.runoob.com/java/java-environment-setup.html
通过如下命令来运行盘古:
wget -P /home/ https://mirrors.javamall.com.cn/pangu/1.0.0/pangu.tar.gz
tar -xzvf /home/pangu.tar.gz
cd /home/pangu
java -jar ./pangu-1.0.0.jar
上述命令会独占当前窗口,您可以使用nohup来运行盘古:
cd /home/pangu
nohup java -jar ./pangu-1.0.0.jar > /home/pangu/pangu.log 2>&1 &
注意:必须在当前目录执行启动命令否则无法登陆
基于源码安装盘古命令如下:
git clone https://gitee.com/javashop/pangu.git
cd pangu
mvn clean install -DskipTests
完成安装后,访问:ip:8080,默认账号/密码是admin/admin
您需要准备一台linux机器来体验盘古并在盘古中将机器配置好(我们将此机器命名为“测试机”)
我以安装docker,并部署一个mysql实例为例,体验部署的编排及执行。
首先需要您新增一个部署:
1、部署名字随意(比如mysql部署)
2、部署服务器:选择刚刚我们建立的“测试机”
3、环境变量:暂时可以先不选择
我们来编排这个部署,在盘古中内置了很多执行器,这些执行器是我们组织编排的核心
在这个步骤管理中,我们新增两个步骤:
第一个步骤:安装docker
如上图所示,执行器选择安装docker,步骤的名字命名为"安装docker"
第二个步骤:安装mysql
点击“执行部署”跳转到执行界面,来体验基于盘古的第一次部署。
要执行部署操作的目标机器,部署时可以选择部署一台或多台机器,也可以将机器按标签来分类,然后按标签来部署。
部署的编排核心是步骤,一次部署包含多个步骤,比如:
步骤1:克隆源码
步骤2:编译源码
步骤3:运行Jar
步骤是顺序执行的,只有上一个步骤执行成功后下一个才会被执行,否则整个部署将被终止。
盘古将步骤分为执行器和检查器两个部分(检查器是可选的),执行器执行具体的部署动作(比如安装mysql),检查器负责检查这个部署动作是否执行成功。
盘古内置了一些常用的执行器和检查器,如:“SSH命令执行”、“git clone”、“安装maven”、“端口检查器”等,详解下面的列表。
执行器名称 |
ssh命令执行 |
git clone |
安装maven |
安装mysql |
安装redis |
安装node |
您可以通过安装插件来使用别人开发的执行器或检查器。您也可以通过开发插件来扩展执行器或检查器。
这里的仓库是指的git源码仓库,在"git clone"执行器中可以选择要clone的仓库
在部署的编排过程中,我们有这样的场景:
1、安装mysql时指定mysql的密码
2、将密码配置在程序相应的配置文件中
盘古是通过”环境变量“和”配置文件“实现上述过程的自动化的。通过定义一组环境变量,比如:那么在配置文件中就可以通过${mysql.username}这种语法来引用这个变量(遵循freemaker语法)
您需要编辑部署,使某个环境变量项目和部署关联才能使环境变量生效
配置文件需要使用”写入配置文件“这个执行器来将配置文件写入到具体的服务器某个位置
盘古中的执行器和检查器是以插件的形式提供的,您可以开发自己的插件来拓展执行器和检查器。
插件开发插件包括一下几种:
插件类型 |
kind标识 |
说明 |
执行器 |
executor |
在部署时被执行 |
检查器 |
checker |
完成某个步骤时,对结果检测 |
1、插件开发
盘古的插件是用yml格式定义的:
#插件版本
version: 1.0
metadata:
#类型,必须
#可选值:
#1.executor:执行器
#2.checker:检查器
#3.deployment:部署
kind: executor
#定义插件名称,必须
name: "git clone"
#定义id,必须,不能有空格
id: git_clone
#定义插件描述,可以为空
desc: git clone 插件
#定义作者名字,必须
author: javashop
#定义作者的链接,可以为空
author_url: "https://www.javamall.com.cn"
#定义要传输到服务器中的文件
#source是本地文件路径,以classpath为根目录的相对路径
#target是远程目标路径,可以使用${worksapce}变量
copy:
- source: executor/git_clone/git_clone.sh
target: ${workspace}/git_clone.sh
#定义要执行的命令
command:
#定义命令的类型,目前支持ssh 命令,必须
type : ssh
exec :
- "sh ${workspace}/git_clone.sh"
#插件的配置项,可以是多个配置项,可以为空
#每个配置项,会在配置界面展示
#客户输入的值在解析命令的时候会通过$ {变量名}解析出来
#type支持:
#1、input :单行文本
#2、textarea:多行文本
config :
item:
title: 源码目标路径
name: dir
type: input
htmlcss: "width:100px"
插件可以存放在两个位置:
1、源码的resources目录
2、打包后的jar同级plugins目录
子目录
目录 |
说明 |
executor | 存放执行器yml文件 |
checker | 存放检查器yml文件 |
插件可以是单独直接在相应的文件夹中,也可以自己独立一个文件夹存放,比如:
如上图所示,"plugin-one"直接存放在executor目录中,"plugin-two"单独在一个文件夹中,一般地是这个插件还存在除了yml文件以外的文件所以单独存在一个文件夹比较方便。
首先您需要熟悉git fork
可以参考下面的文档:https://gitee.com/help/articles/4128#article-header0
Fork盘古插件仓库
请fork下面的仓库:https://gitee.com/javashop/pangu-plugin
建立插件文件
在您fork的仓库中:在resources目录中建立你的插件文件,如:/resources/executor/test.yml
编写插件
根据需求按规则编写yml文件,您可以参考这个示例插件
测试插件
使用如下代码测试插件:
@RunWith(SpringRunner.class)
@SpringBootTest()
@ComponentScan("com.enation.pangu")
public class PluginTest {
/**
* 插件业务类
*/
@Autowired
ExecutorManager executorManager;
/**
* ssh客户端
*/
SshClient sshClient;
/**
* 环境变量
*/
Map env = new HashMap();
//环境变量
String workspace = "/opt/workspace/";
/**
* 测试前构建ssh client及 workspace
* @throws IOException
*/
@Before
public void init() throws IOException {
env.put("workspace",workspace);
//在这里定义测试机的信息
sshClient = SshClientFactory.createSsh("root", "123456", "192.168.2.55", 22);
//先创建workspace
sshClient.exec("mkdir -p "+ workspace,text->{
out.println(text);
});
}
/**
* 测试结束后断开ssh连接
* @throws IOException
*/
@After
public void clean() throws IOException {
sshClient.disconnect();
}
/**
* 执行器测试
* @throws ScriptException
*/
@Test
public void gitClone() throws IOException {
//环境变量
env.put("username", "2323");
env.put("password", "2323");
env.put("git_url", "https://gitee.com/javashop/pangu.git");
//执行插件,第一个参数时插件id,第二个参数是插件类型,第三个参数是环境变量,第四个参数是ssh客户端
boolean result = executorManager.runExecutor("git_clone",PluginType.executor, env, sshClient);
out.println(result);
}
/**
* 检查器测试
* @throws IOException
*/
@Test
public void checkerTest() throws IOException {
//执行插件,第一个参数时插件id,第二个参数是插件类型,第三个参数是环境变量,第四个参数是ssh客户端
boolean result = executorManager.runExecutor("install_one", PluginType.checker, env, sshClient);
out.println(result);
}
}
注意:开发好的插件,需要在插件页面点击同步才会出现在相应的列表中
欢迎您将插件贡献给盘古,共享方式为需要您从自己的fork的仓库建立一个PR到如下仓库 https://gitee.com/javashop/pangu-plugin
操作方式参考如下文档:https://gitee.com/help/articles/4128#article-header0
创建pull request时需要您备注好插件的作用以及您的联系方式,或扫描计入盘古微信交流群,发送一个消息给我们,以便我们及时审核您的PR,如果我们审核通过后,就可以被其他人安装使用啦。
请先扫码并关注公共账号,可以自动加入盘古交流群: