建木,CI/CD自动化部署解决方案

1,713 阅读2分钟

背景

首先恭喜自动化平台“建木”项目进入木兰开源社区孵化,>>>链接<<<。 我一向对未知的事物比较感兴趣,所以在闲暇时间也研究了一下,特此记录下,欢迎大家在此交流学习。

介绍

什么是建木

“建木”是上古先民崇拜的一种圣树传说建木是沟通天地人神的桥梁。伏羲、黄帝等众帝都是通过这一神圣的梯子上下往来于人间天庭。《淮南子·墬形训》亦曰:“建木在都广,众帝所自上下。日中无景,呼而无响,盖天地之中也。”

我们为此项目取名为“建木”,希望本项目也可以成为不同业务场景下相互沟通的桥梁。建木自动化平台以触发器、流程编排、任务分发等功能为平台核心,可以用在各类使用场景下,包括但不限于,CI/CDDevOps、自动化运维、多业务系统集成等使用场景。

"建⽊"整体软件分层如下图,主要分任务执⾏层、流转分发层、概念定义层,配合⽀撑的会有⼀个⽀持服务。

image.png

在建木项目中,最重要的概念是流程/管道定义,使用Yaml格式文件。流程/管道是由一个或者多个节点组成。

  • 流程定义在workflow段落下:

     workflow:
       name: 流程名称
       ref: 流程唯一标识
       description: 流程描述
    
  • 管道定义在pipeline段落下:

    pipeline:
      name: 管道名称
      ref: 管道唯一标识
      description: 管道描述
    
  • 流程与管道的区别是:流程中可定义节点执行顺序

    流程从start类型的节点开始执行,到end类型的节点结束,节点使用sourcestargets来分别指定当前节点的上游与下游节点,如下:

      Start:
          type: start
          targets:
            - Mvn_Deploy
        Mvn_Deploy:
          type: maven:3-jdk11
          sources:
            - Start
          targets:
            - End
        End:
          type: end
          sources:
            - Mvn_Deploy
    

    startend可以分别省略sourcestargets定义,一个节点可以定义多个上游或下游节点,当存在多个下游节点时,当前节点执行成功后会并行触发下游节点,当存在多个上游节点时,当前节点会等待上游节点全部执行成功后才开始执行。

  • 节点定义

    不同的节点类型定义了不同的参数,节点类型预先定义了输入参数输出参数的名称、类型与默认值在流程中配置节点时,可以覆盖输入参数的默认值,例如:

    Mvn_Deploy:
      type: maven:3-jdk11
      sources:
        - Git_Clone
      targets:
        - End
      param:
        maven_snapshot_id: maven-snapshots
        maven_public_id: maven-public
        maven_release_id: maven-releases
    

    在每个节点里,都有对应的参数描述,例如git clone节点:

    image.png

    输出参数:可以在当前节点的输入参数中引用上游节点的输出参数的值:

      Hello_Jianmu:
        type: hello_jianmu:latest
        sources:
          - Start
        targets:
          - Show_Message
        param:
          hello_language: Chinese
      Show_Message:
        type: show_msg:latest
        sources:
          - Hello_Jianmu
        targets:
          - End
        param:
          msg: ${Hello_Jianmu.return_hello} 
    

    注意节点定义可能存在不同的版本,不同版本的节点定义所支持的输入参数输出参数可能完全不同

  • 节点库

    存放节点的地方,目前建木节点库中已有11个节点,你可以任意选择你需要的节点来组成一个CI/CD自动化流程。如果已有节点满足不了你的需求,可以在Gitee上issue

    image.png

  • 密钥管理

    密钥管理是用来保存一些敏感信息,比如gitee的账号密码,服务上的ssh私钥。

    • 密钥可在流程定义中作为节点参数使用,例如:
    param:
      username: ((namespace.username))
      password: ((namespace.password))
    
    • 导入项目时使用

    image.png

Demo演示

环境

此次演示环境为Linuxdocker版本19.03.13docker-compose版本1.29.2

准备

在此之前,需要有个demo项目,并在项目跟目录添加jianmu.yml配置文件,我选择了使用workflow定义流程文件。 >>>demo项目源码<<<

image.png 注意:请忽略项目中其他目录和文件,它们不是重点。

jianmu.yml

workflow:
  name: 测试节点定义“jianmu-test”
  ref: jianmu_test_task
  description: 这是一个测试节点定义,将会在目标服务器115.29.202.92上创建一个demo目录
  Start:
    type: start
    targets:
      - Clone
  Clone:
    type: git_clone:1.0.0   # git clone节点类型, 1.0.0 是版本号
    sources:
      - Start
    targets:
      - Test
    param:
      workspace: jianmu-test
      remote_url: https://gitee.com/schoolmaster_1_709603816/httprun-demo.git  # 项目仓库地址
      ref: refs/heads/master  # 分支
      netrc_password: ((ik.gitee_password))  # 仓库平台密码
      netrc_machine: gitee.com     # 仓库平台 目前支持 gitee.com,github.com,gitlab.com
      netrc_username: ((ik.gitee_username)) # 仓库平台账号
  Test:
    type: ssh_cmd:1.0.0   # ssh_cmd 节点类型 1.0.0 是版本号
    sources:
      - Clone
    targets:
      - End
    param:
      ssh_port: "22"
      ssh_cmd: mkdir -p /root/demo  # 要执行的命令
      ssh_ip: 115.29.202.92   # 目标服务器ip
      ssh_private_key: ((ik.ssh_private_key))   # 目标服务器 ssh 私钥 
      ssh_user: root  # 目标服务器登陆账号
  End:
    type: end
    sources:
      - Test

我的需求:使用git clonessh_cmd两个节点,在目标服务器上创建一个名为demo目录

搭建见面服务

  1. 下载docker-compose.yml

    wget https://gitee.com/jianmu-dev/jianmu-deploy/raw/master/docker-compose.yml
    
  2. 运行

    docker-compose up -d
    

    注意: 启动前请确保webmysql服务对应的端口没有被其他端口占用:

    image.png

  3. 访问服务,可以看到如下页面表示服务搭建成功

    image.png

  4. 添加密钥

    创建gitee认证密钥和创建服务ssh私钥

     1.  创建命令空间:ik
     2.  新增密钥:gitee_username:admin
     3.  新增密钥:gitee_password:123456     
     4.  新增密钥:ssh_private_key: your_ssh_key
    

    分别对应jianmu.yml中的三个变量:

    image.png

  5. 这里我们选择git导入之前准备好的demo项目

    image.png

  6. 输入项目url,选择分支,认证信息后,点击下一步

    image.png

  7. 选择项目下的jianmu.yml,点击保存即可

    image.png

  8. 保存成功之后会在全部项目下新增一个流程。

    image.png

  9. 点击运行即可

    image.png

    这里看到的四个节点就是对应jianmu.yml中定义的四个节点。

  10. 然后在你的目标服务器上,可以看到新建了一个demo目录

    image.png

总结

以上只是简单使用一个demo来测试建木的流程,其实它远远比我们现在看到的还要灵活和强大。后期我会基于一个SpringBoot应用的自动化部署使用,并在其中加入测试自动化,将一个SpringBoot应用从开发-构建-测试-发布走一个完整的CI/CD流程。

参考资料

建木文档

建木节点库

建木Gitee

建木社区

有兴趣的小伙伴可以加入到建木社区微信群,期待,建木因有你们更精彩!

image.png