返回 登录
0

OpenStack CI/CD之Solum使用

阅读5379

Solum是由Rackspace的工程师Adrian Otto于2013年9月在Launchpad上提出的一个BP。该项目聚焦于在OpenStack IaaS平台上,构建PaaS层的持续集成/持续交付(CI/CD)应用,可以简单理解为是一个应用程序App的集成开发平台,当然,它可以做很多事情。Murano是一个App Store(应用存储)服务,而Solum可以将开发的应用程序App发布到Murano中。

它可以实现公有云、私有云或异构云之间的应用可移植性(究其本质是将应用服务docker容器化,而docker可以无差别的运行在异构环境中);通过OpenStack的编排服务Heat实现跨开发者、跨测试、跨生产环境地简化应用程序生命周期管理;集成Git、Jenkins/GitHub持续集成以及集成各种开发环境,如Eclipse、IntelliJ、Komodo等。

Solum使云服务能更简单的应用和集成到用户的开发过程中。通过一个push 按钮就可以提交代码到一个 OpenStack 云上。 其本身就是专为 OpenStack 设计的,利用现有的 OpenStack 服务,比如 Heat、Nova、Glance、Keystone、Neutron 等。 同时也是一个社区驱动的项目,这个项目主要贡献者来自Rackspace、eBay、dotCloud、Cumulogic 和 CloudSoft、99Cloud等。Solum 包括两个逻辑子系统:控制面板和数据面板。如下图所示。

图片描述

  • 对于开发人员:通过一个自动化的CI/ CD流程,提供一个易于使用和快速开发应用的OpenStack环境。
  • 对于发布管理:通过支持不同的环境(dev、test、staging、prod)和权限(即谁可以部署到prod),提供简化应用程序生命周期管理的能力。

CI/CD的整个工作内容涵盖了最开始的应用程序代码开发—>自动化测试—>软件打包—>自动化部署—>测试验证—>再到最后的应用交付这一完整流程。换言之,Solum让OpenStack同时提供IaaS+PaaS的服务实现提供了可能性。

典型的PaaS功能如,将Git仓库,Eclipse工具,SDK、CLI四个来源的应用通过Heat自动部署到OpenStack管理的Docker容器中,使用Load balancing功能为应用提供负载均衡能力,并使用Neutron 提供对网络的支持(这是目前最好的方式,比Kuddler、Kubernets这些提供的网络都强的多),最后可以使用Ironic裸机服务部署CoreOS系统等。

Solum与Docker容器的集成方式有多种,支持使用Nova的nova-docker插件、Magnum服务和Heat编排服务等。通过集成,Solum得以实现将application部署运行在Docker容器中,而application是以git repo源码方式构建的。

Solum概念理解

在Solum的使用过程中,常涉及到的是languagepack、appfile和变量配置文件等。

  • Languagepacks

Languagepacks负责定义应用程序需要的运行环境。建立一个languagepack,Solum分别需要一个 dockerfile文件和git repo仓库。Solum通过创建一个docker和存储镜像来构建和部署应用程序。自然,languagepack是一个包含了微操作系统、测试工具、build.sh脚本等公共基础服务的base image。

  • appfile

dockerfile文件用于构建docker镜像,而appfile文件则使用yaml语法用来定义你的应用程序。通常包括了应用的版本号、应用程序名称、运行环境(即languagepack)、git repo仓库地址、测试和运行的脚本、应用程序的端口号等。

  • 应用程序配置和环境变量文件(params.yaml)

可以使用环境变量对Solum部署的应用程序进行配置,提供一个参数文件在创建应用程序的过程中注入环境变量。类似于OpenStack glance镜像制作中的cloud-init。参数文件也使用yaml语法编写,key:value结构。如下所示。

# cat params_test.yaml
key: ssh_private_key
user: user_name
password: password

该项目发展的主要关注点,包括:

  • 持续集成(CI)应用:包括Git应用、构建和单元测试、生成镜像、运行功能测试、使用Heat部署镜像等;
  • 持续交付(CD)应用:包括自动化部署、管理和运行apps(monitoring、autoscaling、self-healing)、应用程序版本控制和回滚等;
  • 环境管理:包括权限(即谁可以部署应用到prod),并运行测试环境等;
  • 开发工具:包括IDE plugins、SDK、CLI、UI console等;

总体而言,该项目还处于发展阶段,并不是很成熟、稳定。但无疑,Solum和Murano等项目的组合应用将会更加精彩,值得关注和研究。

1.安装Solum

目前,Solum仅支持在Ubuntu系统上部署,因此这里创建一个新的Ubuntu 14.04版本的虚拟机或物理机,使用root用户登录和DevStack部署。

1)关闭Firewalld

# ufw disable

2)创建一个solumuser用户

   # useradd solumuser -m -d /home/solumuser -s /bin/bash
   # visudo
   # solumuser ALL=(ALL) NOPASSWD: ALL

3)设置solumuser用户密码

# passwd solumuser

4)退出root用户,使用solumuser用户登录

5)设置DevStack

   $ DEVSTACK_DIR="${HOME}/devstack"
   $ mkdir -p ${DEVSTACK_DIR}
   $ sudo apt-get install -y git python-pip
   $sudo git clone https://git.openstack.org/openstack-dev/devstack.git ${DEVSTACK_DIR}
   $ cd ${DEVSTACK_DIR}
   $sudo wget https://raw.githubusercontent.com/devdattakulkarni/solum-provenance/master/local.conf
   $ sudo chown -R solumuser ${DEVSTACK_DIR}
   $ sudo chgrp -R solumuser ${DEVSTACK_DIR}

6)执行stack.sh脚本安装

   $ cd ${DEVSTACK_DIR}
   $ ./stack.sh

该过程中,会提示输入所需的Solum用户名密码。

若安装失败,可以再次执行安装命令。

$ ./unstack.sh && ./stack.sh

2.使用Solum部署应用

由于,目前还不能稳定的在Dashboard页面上使用Solum,故此这里使用Cli命令的方式来使用。

2.1 创建 languagepack

1)加载环境变量文件

# source ~/devstack/openrc

2)首先,创建一个名称为Python的languagepack

顾名思义,Languagepack即我们常用的开发语言,可以是Python,也可以是Java、Go等语言。

$ solum languagepack create python \
https://github.com/rackspace-solum-samples/solum-languagepack-python.git

图片描述

3)查看创建的languagepack信息

$ solum languagepack show python

图片描述

4)查看创建的python languagepack日志信息

$ solum languagepack logs python
+--------------------------------------+---------------------+-----------------------------------------------------------------------------+
| resource_uuid                        | created_at          | local_storage                                                               |
+--------------------------------------+---------------------+-----------------------------------------------------------------------------+
| 061e2358-9971-4d32-8da0-3850e0237a6a | 2016-09-24 05:19:07 | /var/log/solum/worker/languagepack-cfeeb79e-11cf-476b-9b5c-4a0673cd84db.log |
+--------------------------------------+---------------------+-----------------------------------------------------------------------------+

5)查看Solum所有的languagepack

$ solum languagepack list
+--------------------------------------+--------+-------------+--------+--------------------------------------------------------------------------+
| uuid                                 | name   | description | status | source_uri                                                               |
+--------------------------------------+--------+-------------+--------+--------------------------------------------------------------------------+
| 061e2358-9971-4d32-8da0-3850e0237a6a | python | None        | READY  | https://github.com/rackspace-solum-samples/solum-languagepack-python.git |
+--------------------------------------+--------+-------------+--------+--------------------------------------------------------------------------+

2.2 部署Application

使用YAML文件部署Application。Solum支持使用自定义的YAML文件创建Solum application应用,而项目本身在solum/examples/apps/目录下也自带了些样例,如下所示。

# tree solum/examples/apps/
solum/examples/apps/
|-- README
|-- cherrypy.yaml
|-- docker_registry.yaml
|-- github-reporting.yaml
|-- java_app.yaml
|-- mysql.yaml
|-- nodejs_app.yaml
|-- python_app.yaml
`-- solum-pep8.yaml
0 directories, 9 files

这里,我们使用由Solum项目提供的appfile文件来构建和部署一个Python的web应用程序。在此之前,我们先看看这个yaml文件描述了哪些内容和事情(事件流程)。该yaml文件工作流程清晰,典型的是一个类似Jenkins持续集成系统所做的活儿。首先是定义了该应用的名称等信息、git clone master分支上的代码仓库,然后,运行单元测试、构建和部署应用程序,最后,将主机的80端口映射到容器的80端口上。

比如,python_app.yaml 文件内容如下所示:

# cat examples/apps/python_app.yaml 
version: 1
name: cherrypy
description: python web app
languagepack: python
source:
  repository: https://github.com/rackspace-solum-samples/solum-python-sample-app.git
  revision: master
workflow_config:
  test_cmd: ./unit_tests.sh
  run_cmd: python app.py
trigger_actions:
- unittest
- build
- deploy
ports:
- 80

2.3 应用程序配置和环境变量

使用Solum部署的应用程序可以使用环境变量进行配置,提供一个参数文件在创建应用程序的过程中注入环境变量。这里,使用一个param.yaml变量文件,用于传递参数给python_app.yaml app应用。

1)使用yaml文件构建应用:

$ solum app create --app-file apps/python_app.yaml \
--param-file plans/parameters/param.yaml

图片描述

2)使用deploy命令部署该应用到docker容器中:

$ solum app deploy 887be1d4-3834-4abd-9eee-8a564320aa9f

图片描述

3)最后,查看该应用的创建状态:

$ solum app show 887be1d4-3834-4abd-9eee-8a564320aa9f

图片描述

4)一旦应用程序创建好了,即status字段值显示为“DEPLOYMENT_ COMPLETE”时,便可以使用curl命令操作app_url字段的值来操作该应用程序。

$ curl http://10.10.10.142:80

5)正如所述,Solum把languagepack和从源码处构建的应用程序部署在Docker容器中。因此,可以使用docker相关命令对其进行操作。如下查看上面步骤中创建的docker镜像和容器。

$ docker images
$ docker ps -a

图片描述

如何更新应用开发

如果你熟悉Jenkins和GitHub/GitLab使用,相信对这里所述的流程并不感到陌生。即,当我们把Solum App的trigger_ uri地址添加在Github某个项目下的Webhooks后。这样,当你每次使用git push命令将代码提交到github仓库中时,webhook会发送一个POST请求http://10.10.10.142:9777 /V1/触发器/ < trigger_id >给Solum,让它自动创建一个新的docker镜像,并重新部署你的应用程序。

小结

最后,具体如何去使用,读者们可以结合自身所面临的研发测试、业务流程和CI/CD等挑战和需求,让其更有效的投入到环境中。

一个一目了然的官方Demo地址:https://wiki.openstack.org/wiki/Solum

作者:徐超

评论