基于建木CI部署maven项目
2021-12-08 Freedom
基于建木CI部署maven项目
作者:Freedom 发布时间:2021-12-08 09:00:00

1. 前置准备工作

使用环境:

  • 测试环境:

    • 操作系统:Centos7
    • cpu:四核 Common KVM processor
    • 内存:16G
    • docker版本: 20.10.8
  • 建木CI版本:v2.0.0

2. 如何安装建木CI

使用docker-compose的方式来进行部署,关于docker-compose的详细使用方式说明可以参考docker官方文档:https://docs.docker.com/compose/

  • 下载建木CI的docker-compose文件

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

    image-20211203155906170

  • 启动建木CI

    执行docker-compose up -d

    image-20211203160817015

    经过漫长的等待已经将建木CI所需的镜像拉取下来并且启动起来了

  • 看一眼启动的容器

    image-20211203160952874

    可知建木CI由jianmu-ci-ui,jianmu-ci-server以及一个mysql8组成

    jianmu-ci-ui由vue3开发而成,jianmu-ci-server是一个java项目,由springboot开发。使用标准的前后端分离开发方式

  • 访问一下我们刚刚启动的建木CI,输入我们的ip,端口为默认的80端口,发现项目已经启动起来了,大功告成

    image-20211203161331994

  • 想要知道安装建木CI的其他方式以及详细信息,可以参考建木CI官方文档:建木CI快速开始

3. 开始使用建木CI快速构建maven项目

步骤如下:

  1. 挑选适合的节点:节点就是建木CI灵魂,建木CI通过操作这些节点来完成业务操作,每一个节点都有自己特定的职责,每个节点只完成一件事情,建木CI通过编排节点来完成一系列流程操作

  2. 创建建木CI流程的配置文件:在建木CI中,当我们想要完成一个业务操作时,我们首先将它的流程定义出来,这个流程其实就是我们对节点的一个编排,通过这种编排加上我们自己特定的业务参数在编排好的节点之间流通,以此完成我们的业务操作

  3. 基于建木CI平台,运行上述流程配置文件

3.1创建建木CI流程的配置文件

下面对建木CI的流程配置文件进行一个详细的说明

  • 什么是流程配置文件:流程配置文件是一种DSL(领域特定语言),当我们想完成一系列的操作(可能是项目的ci/cd流程,可能是省去我们重复操作的流程)时,我们程序员用我们能明白的方式去定义这个流程,建木CI使用yaml去定义这一流程

    建木CI的DSL提供了两种语法

    1. 流程定义(workflow DSL):流程定义规定了我们的流程如何走,有选择分支,有条件判断,这些逻辑共同来完成我们的一个流程定义,如下图

      image-20211203164453644

    2. 管道定义(pipeline DSL):管道定义就像是“不分叉”的流程定义,没有选择分支,没有条件判断,一个节点扣着一个节点走,像一根管道一样,因为真实的业务场景有很多管道式的流程,所以建木CI推出这一类型流程DSL,如下图

      image-20211203164544221

  • 在定义这个流程时,我们要想明白我们的目的是什么:我们要部署我们的maven项目,然后来挑选适合的节点

    1. 首先我们要将此项目从我们的仓库中git下来,使用git clone节点从git仓库中将项目clone下来

    2. 将项目git下来之后,我们要构建我们的项目,使用maven 构建节点将项目打成docker镜像,并且将其push到自己的docker hub仓库

    3. push到自己的仓库之后,我们要想办法去把项目启动起来,我们会使用docker pull,docker run命令把项目启动起来,所以我们使用ssh 执行命令节点将镜像拉取下来并且运行它

    4. 项目部署完成了之后,总得有人来告诉我们项目部署完成了吧,所以我们使用企业微信通知节点通知项目部署完成

    5. 上述步骤,是不是一环扣着一环,故我们使用管道定义来完成这一maven项目的部署

  • 下面开始流程DSL的配置

    1. 根DSL的配置

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      # 流程DSL的名字
      name: hello 建木CI
      # 流程DSL的描述
      description: 建木CI快速部署maven项目
      # 全局定义的环境变量
      global:
      param:
      # 环境变量名和值
      # 其中my-docker-hub-username指在https://hub.docker.com/注册账号的用户名
      image_name: my-docker-hub-username/jianmu-build-maven-project
      # 表示使用管道DSL, 下面的所有节点都在pipeline下进行配置
      pipeline:
    2. git clone节点

      1
      2
      3
      4
      5
      6
      7
      8
      # git clone
      git_clone:
      # 使用git clone的版本
      type: git_clone:1.2.0
      # 使用git clone参数时的输入参数
      param:
      # 配置远程的git源,即从哪个url上clone项目
      remote_url: https://gitee.com/canon_xi/hello-jianmu.git
    3. maven构建节点

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      # maven构建
      maven_jib_build:
      # maven构建的版本
      type: maven_build:1.3.1-jdk11
      param:
      # maven构建的行为
      mvn_action: install
      # 在哪个目录下进行构建,这里的${git_clone.git_path}表示从上一个节点git_clone的输入参数git_path中取得,也可以理解为取环境变量,节点的输出参数会变成环境变量
      workspace: ${git_clone.git_path}
      # 打镜像时取的镜像名称,取的是根DSL配置的全局环境变量
      image_name: ${global.image_name}
      # 打镜像时指定的tag
      image_tag: ${git_clone.git_branch}
      # 会将我们的镜像push到docker hub中,需指定docker hub的用户名。
      # 很多时候,我们的业务参数中包含了我们一些比较私密的信息,我们并不想将它明文的展示出来,建木CI也提供了密钥管理的功能
      # 我们使用((...))的语法从建木CI密钥管理处取得它的值
      # 更多关于密钥用法和详细信息请参考:https://docs.jianmu.dev/guide/secrets.html
      docker_username: ((docker_hub.username))
      # 指定docker hub的密码
      docker_password: ((docker_hub.password))
      # 从哪里去拉取我们maven项目的依赖,这里使用阿里云的镜像拉取依赖
      maven_public_url: https://maven.aliyun.com/repository/public
    4. ssh执行

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      # ssh执行
      deploy_server:
      # ssh_cmd版本
      type: ssh_cmd:1.0.1
      param:
      # 在哪台机器上执行命令,配置ip
      ssh_ip: xxx.xxx.xxx.xxxx
      # 目标机器的私钥,这里使用建木CI提供的密钥管理平台
      # 初次设置SSH生成公钥私钥可以参考https://segmentfault.com/a/1190000007530568,然后把生成的私钥填入建木CI提供的密钥管理平台即可
      ssh_private_key: ((jianmu_ci.server_private_key))
      # 执行的具体命令
      ssh_cmd: >-
      docker pull my-docker-hub-username/jianmu-build-maven-project:master
      &&
      docker run -d --name helloJianmu -p8888:8888 my-docker-hub-username/jianmu-build-maven-project:master
      &&
      echo done
    5. 企业微信发送信息

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      # 企业微信发送信息
      send_message:
      # 企业微信发送信息的版本
      type: qywx_notice:1.2.1
      param:
      # 微信机器人的回调地址,也使用建木CI的密钥管理起来
      bot_webhook_url: ((charbot.webhook_url))
      mentioned_mobile_list: "[]"
      # 发送的具体信息
      text_content: "建木CI快速部署maven项目完成"
      msgtype: "text"
      mentioned_list: "[]"

    关于如何配置建木CI平台的流程DSL,也可以参考建木CI官方文档的流程编排环节,链接:建木CI流程编排

  • 将上述DSL组合起来,形成详细流程DSL配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    name: hello 建木CI
    description: 建木CI快速部署maven项目
    # 全局定义的环节变量
    global:
    param:
    image_name: my-docker-hub-username/jianmu-build-maven-project
    # 使用管道DSL
    pipeline:
    # git clone
    git_clone:
    type: git_clone:1.2.0
    param:
    remote_url: https://gitee.com/canon_xi/hello-jianmu.git
    # maven构建
    maven_jib_build:
    type: maven_build:1.3.1-jdk11
    param:
    mvn_action: install
    workspace: ${git_clone.git_path}
    image_name: ${global.image_name}
    image_tag: ${git_clone.git_branch}
    docker_username: ((docker_hub.username))
    docker_password: ((docker_hub.password))
    maven_public_url: https://maven.aliyun.com/repository/public
    # ssh执行
    deploy_server:
    type: ssh_cmd:1.0.1
    param:
    ssh_ip: xxx.xxx.xxx.xxxx
    ssh_private_key: ((jianmu_ci.server_private_key))
    ssh_cmd: >-
    docker pull my-docker-hub-username/jianmu-build-maven-project:master
    &&
    docker run -d --name helloJianmu -p8888:8888 my-docker-hub-username/jianmu-build-maven-project:master
    &&
    echo done
    # 企业微信发送信息
    send_message:
    type: qywx_notice:1.2.1
    param:
    bot_webhook_url: ((charbot.webhook_url))
    mentioned_mobile_list: "[]"
    text_content: "建木CI快速部署maven项目完成"
    msgtype: "text"
    mentioned_list: "[]"
  • 在建木CI中配置流程DSL

    点击新增项目

    image-20211203142403420

    添加流程DSL

    image-20211203142455653

  • 添加成功后在建木CI的dashboard出现hello jianmu

    image-20211203142747886

  • 点击进去可以看见

    image-20211203142933165

    一切整装待发

  • 点击开始按钮

    image-20211203143014322
  • 等待一会可以看见

    image-20211203140457253

    已经运行完成

  • 查看各个节点的流程日志

    image-20211203140633659

    image-20211203140752882

    image-20211203140819408

    image-20211203140836048

    未发现异常,此时建木CI快速部署maven项目流程完成

    我们的企业微信也收到了部署成功的通知

    image-20211206110818310

3.2 访问我们刚刚部署项目

访问 ip:8888/jianmu/hello 即可得到 “Hello jianmu”

1
2
3
4
5
6
7
8
9
10
11
@RestController
@RequestMapping("jianmu")
public class HelloJianmuController {
@GetMapping("hello")
public String helloJianmu(){
return "Hello jianmu";
}
}
--------- application.yml------------
server:
port: 8888

image-20211206110930419

得到来自建木CI的问候