zoukankan      html  css  js  c++  java
  • 集成omnibus-ctl 开发一个专业的软件包管理工具

    前边有转发过来自chef 团队的一篇omnibus-ctl 介绍文章,以下尝试进行项目试用

    就是简单的集成,没有多少复杂的操作

    环境准备

    • ruby
      ruby 使用2.6.3 使用 rbenv 安装,可以参考rbenv mac&&linux 安装简单说明
    • bundle
      bundler 的安装可以直接使用gem,其他途径存在版本的问题,安装方法
    gem install bundler
    • 可选配置gem source
    gem source -r https://rubygems.org/
    gem source -a https://gems.ruby-china.com/
    • 安装omnibus

      脚手架模式

    gem install omnibus

    简单项目集成omnibus-ctl

    项目是一个简单的模拟gitlab 的软件包,没有多少操作

    • 初始化项目
    omnibus new gitlab
    • 项目结构
    ├── Berksfile
    ├── Gemfile
    ├── Gemfile.lock
    ├── README.md
    ├── config
    ├── projects
    └── gitlab.rb
    └── software
    ├── gitlab-ctl.rb
    └── preparation.rb
    ├── files
    └── gitlab-ctl-commands
    └── config.rb
    ├── omnibus.rb
    └── package-scripts
        └── gitlab
            ├── postinst
            ├── postrm
            ├── preinst
            └── prerm
    • 说明
      以上config/software/gitlab-ctl.rbfiles/gitlab-ctl-commands 是添加的文件
    • 代码说明
      Gemfile 因为需要集成omnibus-ctl 所以需要引用gem 包,我修改了source 为国内的
    source 'https://gems.ruby-china.com/'
    # Install omnibus
    gem 'omnibus', '~> 6.0'
    # gem 'omnibus-ctl', '~> 0.6.0'
    gem 'omnibus-software', git: 'https://github.com/chef/omnibus-software.git'
    # Use Chef's software definitions. It is recommended that you write your own
    # software definitions, but you can clone/fork Chef's to get you started.
    # gem 'omnibus-software', github: 'chef/omnibus-software'
    # This development group is installed by default when you run `bundle install`,
    # but if you are using Omnibus in a CI-based infrastructure, you do not need
    # the Test Kitchen-based build lab. You can skip these unnecessary dependencies
    # by running `bundle install --without development` to speed up build times.
    group :development do
      # Use Berkshelf for resolving cookbook dependencies
      gem 'berkshelf'
      # Use Test Kitchen with Vagrant for converging the build environment
      gem 'test-kitchen'
      gem 'kitchen-vagrant'
    end
     

    config/project/gitlab.rb 项目包信息描述,包含依赖以及项目信息

    #
    # Copyright 2019 YOUR NAME
    #
    # All Rights Reserved.
    #
    name "gitlab"
    maintainer "rongfengliang"
    homepage "https://github.com/rongfengliang"
    # Defaults to C:/my on Windows
    # and /opt/my on all other platforms
    install_dir "#{default_root}/#{name}"
    build_version Omnibus::BuildVersion.semver
    build_iteration 1
    # Creates required build directories
    dependency "preparation"
    dependency "gitlab-ctl"  # 我们需要依赖的soft 定义
    # my dependencies/components
    # dependency "somedep"
    exclude "**/.git"
    exclude "**/bundler/git"
     

    config/software/gitlab-ctl.rb 我们的包软件定义:
    这个实际上就是对omnibus-ctl 的一个包装

    name "gitlab-ctl"
    dependency "omnibus-ctl"
    source :path => File.expand_path("files/gitlab-ctl-commands", RbConfig::CONFIG['project_root'])
    build do
      block do
        open("#{install_dir}/embedded/bin/gitlab-ctl", "w") do |file|
          file.print <<-EOH
    #!/bin/bash
    # Ruby environment if gitlab-ctl is called from a Ruby script.
    for ruby_env_var in RUBYOPT \
                        BUNDLE_BIN_PATH \
                        BUNDLE_GEMFILE \
                        GEM_PATH \
                        GEM_HOME
    do
      unset $ruby_env_var
    done
    #{install_dir}/embedded/bin/omnibus-ctl gitlab #{install_dir}/embedded/service/omnibus-ctl $@
           EOH
        end
      end
      command "chmod 755 #{install_dir}/embedded/bin/gitlab-ctl"
      # additional omnibus-ctl commands
      sync "#{project_dir}/", "#{install_dir}/embedded/service/omnibus-ctl/"
    end
     

    files/gitlab-ctl-commands 自定义命令:

    add_command 'config', 'reconfig for gitlab server', 1 do |cmd_name|
          puts 'run config'
          reconfigure
      end

    运行&&测试

    • 初始化依赖
    bundle install --binstubs
    • 构建
    sudo bin/omnibus build gitlab
    • 效果
    tree pkg/
    pkg/
    ├── gitlab-0.0.0+20190701053352-1.el7.x86_64.rpm
    ├── gitlab-0.0.0+20190701053352-1.el7.x86_64.rpm.metadata.json
    ├── gitlab-0.0.0+20190701062746-1.el7.x86_64.rpm
    ├── gitlab-0.0.0+20190701062746-1.el7.x86_64.rpm.metadata.json
    └── version-manifest.json
    • 安装软件包
    yum install gitlab-0.0.0+20190701062746-1.el7.x86_64.rpm
    已加载插件:fastestmirror
    正在检查 gitlab-0.0.0+20190701062746-1.el7.x86_64.rpm: gitlab-0.0.0+20190701062746-1.el7.x86_64
    gitlab-0.0.0+20190701062746-1.el7.x86_64.rpm 将被安装
    正在解决依赖关系
    --> 正在检查事务
    ---> 软件包 gitlab.x86_64.0.0.0.0+20190701062746-1.el7 将被 安装
    --> 解决依赖关系完成
    依赖关系解决
    ===============================================================================================================
     Package 架构 版本 大小
    ===============================================================================================================
    正在安装:
     gitlab x86_64 0.0.0+20190701062746-1.el7 /gitlab-0.0.0+20190701062746-1.el7.x86_64 46 M
    事务概要
    ========================================
    • 生成的软件包目录结构
    tree -L 3 /opt/gitlab/
    /opt/gitlab/
    ├── bin
    ├── embedded
    ├── bin
    ├── bundle
    ├── bundler
    ├── c_rehash
    ├── erb
    ├── gem
    ├── gitlab-ctl
    ├── irb
    ├── libtool
    ├── libtoolize
    ├── makedepend
    ├── omnibus-ctl
    ├── openssl
    ├── pkg-config
    ├── rake
    ├── rdoc
    ├── ri
    ├── ruby
    └── update_rubygems
    ├── include
    ├── ffi.h
    ├── ffitarget.h
    ├── libltdl
    ├── ltdl.h
    ├── openssl
    ├── ruby-2.6.0
    ├── X11
    ├── yaml.h
    ├── zconf.h
    └── zlib.h
    ├── lib
    ├── config_guess
    ├── engines
    ├── libcrypto.a
    ├── libcrypto.so -> libcrypto.so.1.0.0
    ├── libcrypto.so.1.0.0
    ├── libffi-3.2.1
    ├── libffi.a
    ├── libffi.la
    ├── libffi.so -> libffi.so.6.0.4
    ├── libffi.so.6 -> libffi.so.6.0.4
    ├── libffi.so.6.0.4
    ├── libltdl.a
    ├── libltdl.la
    ├── libltdl.so -> libltdl.so.7.3.0
    ├── libltdl.so.7 -> libltdl.so.7.3.0
    ├── libltdl.so.7.3.0
    ├── libruby.so -> libruby.so.2.6.3
    ├── libruby.so.2.6 -> libruby.so.2.6.3
    ├── libruby.so.2.6.3
    ├── libssl.a
    ├── libssl.so -> libssl.so.1.0.0
    ├── libssl.so.1.0.0
    ├── libyaml-0.so.2 -> libyaml-0.so.2.0.5
    ├── libyaml-0.so.2.0.5
    ├── libyaml.a
    ├── libyaml.la
    ├── libyaml.so -> libyaml-0.so.2.0.5
    ├── libz.a
    ├── libz.so -> libz.so.1.2.11
    ├── libz.so.1 -> libz.so.1.2.11
    ├── libz.so.1.2.11
    ├── pkgconfig
    └── ruby
    ├── service
    └── omnibus-ctl
    ├── share
    ├── aclocal
    ├── doc
    ├── info
    ├── libtool
    ├── man
    ├── pkgconfig
    └── util-macros
    └── ssl
    ├── cert.pem -> certs/cacert.pem
    ├── certs
    ├── misc
    └── openssl.cnf
    ├── LICENSE
    ├── LICENSES
    ├── bundler-LICENSE.md
    ├── cacerts-index.815ca599c9df.txt
    ├── config_guess-config.guess
    ├── config_guess-config.sub
    ├── libffi-LICENSE
    ├── libtool-COPYING
    ├── libyaml-LICENSE
    ├── makedepend-COPYING
    ├── omnibus-ctl-LICENSE
    ├── openssl-LICENSE
    ├── pkg-config-lite-COPYING
    ├── ruby-BSDL
    ├── ruby-COPYING
    ├── rubygems-LICENSE.txt
    ├── ruby-LEGAL
    ├── util-macros-COPYING
    ├── xproto-COPYING
    └── zlib-README
    ├── version-manifest.json
    └── version-manifest.txt
     
     
    • 使用gitlab-ctl
      因为打包制作的比较简单,配置path 路径我们就可以直接使用gitlab-ctl
    export PATH=$PATH:/opt/gitlab/embedded

    使用命令:

    gitlab-ctl
    I don't know that command.
    /opt/gitlab/embedded/bin/omnibus-ctl: command (subcommand)
    config
      reconfig for gitlab server
    General Commands:
      cleanse
        Delete *all* my data, and start from scratch.
      help
        Print this help message.
      reconfigure
        Reconfigure the application.
      show-config
        Show the configuration that would be generated by reconfigure.
      uninstall
        Kill all processes and uninstall the process supervisor (data will be preserved).
    Service Management Commands:
      graceful-kill
        Attempt a graceful stop, then SIGKILL the entire process group.
      hup
        Send the services a HUP.
      int
        Send the services an INT.
      kill
        Send the services a KILL.
      once
        Start the services if they are down. Do not restart them if they stop.
      restart
        Stop the services if they are running, then start them again.
      service-list
        List all the services (enabled services appear with a *.)
      start
        Start services if they are down, and restart them if they stop.
      status
        Show the status of all the services.
      stop
        Stop the services, and do not restart them.
      tail
        Watch the service logs of all enabled services.
      term
        Send the services a TERM.
     
    • 说明
      可以看出我们这样就搞出来了一个和gitlab安装包类似的ctl 了,实际上gitlab 安装包也是集成的omnibus-ctl,只是里面功能更复杂而已。
      通过项目omnibus-gitlab 我们可以了解到更多关于omnibus-ctl 的用法

    参考资料

    https://github.com/gitlabhq/omnibus-gitlab
    https://blog.chef.io/2015/05/26/omnibus-ctl-what-is-it-and-what-can-it-do-for-you/
    https://github.com/rongfengliang/omnibus-ctl-demo

  • 相关阅读:
    MyBatis使用
    华为如何实现基于Git的跨地域协同开发
    推荐一款华为最新的自动化代码检查工具
    我是如何进行code review的
    谈谈敏捷开发
    软件测试管理的一点小心得
    (转)技术转管理可能遇到的 3 大挑战及解决方案
    领域驱动设计和实践
    NET开源项目
    asp.net搭建mybatis开发环境
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/11114158.html
Copyright © 2011-2022 走看看