使用Jenkins对以太坊Dapp应用持续集成

在项目实战开发中,持续集成是一种有效的敏捷开发手段,由自动化流程管控程序从递交代码到最终发布之间的一系列流程,实现高效、可靠的部署过程。

持续集成的准备

要相对项目进行持续集成,需要做一些准备工作,在我看来,主要有以下三点:

  • 项目工程化
  • 源码版本化
  • 测试自动化

所谓项目工程化,并不是说用IDE创建一个工程目录开始写代码,而是指的是项目需要用工程化管理工具,可以脱离IDE环境独立非交互式运行,因为IDE对于自动化持续集成没有任何帮助,所以要求项目必须能脱离IDE环境独立集成。通常这些工具同时包含有依赖管理、自动化测试等一系列自动化托管的功能。基本上所有常见的编程语言都有流行的工程化管理工具。比如常见的有:

  • C/C++: automake + autoconf
  • Java: Maven/Gradle
  • NodeJS: npm
  • Ruby: Bundler

等等。这些工程化管理工具几乎都涵盖了从开发到测试的一系列基本功能,比如依赖安装,自动化测试等等。使用工程化管理工具的好处在于大大简化自动化流程的构建,无需用户手写大量的脚本去处理这些过程,并且易于统一化管理。所以要想持续集成,首先必须工程化管理项目

源码版本化这个比较容易理解,就是通过Git/SVN之类的版本控制工具管理源代码,好处就不用多说了,用过版本控制做开发的人都深有体会。

测试自动化这个对于持续集成是最重要的,但反而是最容易被忽视的。这个说起来很简单,就是写自动化测试代码,能通过project manager跑起来即可。但是实际开发的项目又有几个项目有自动化测试呢?自动化测试对开发人员素质的要求会比较高,但是却是持续集成中必不可缺的一环。通过自动化测试反馈项目开发中是否引入了新的问题,是否具备部署条件。

当满足这三点之后,就具备了持续集成的基础,我们就可以继续下一步了。

以太坊项目的持续集成

了解持续集成的一些基本操作和流程之后,进入今天的正题,对以太坊Dapp项目持续集成。首先我们必须将项目工程化。以太坊项目有个很方便的工程化框架Truffle,我们就用它帮助我们工程化项目。

本篇我们使用Truffle官方文档中的quickstart进行演示持续集成,本篇中开发代码不是重点,而quickstart已经包含有构建-测试-发布的代码了,所以我们直接用它讲解持续集成的操作就够了。

NOTE: 以下命令均使用BASH环境,Linux/MacOS直接终端运行即可,对于Windows环境,可以在Cygwin/MingW32模拟环境下运行,Windows 10系统也可以考虑在WSL环境中安装Ubuntu运行。

首先安装NodeJS,这个就不说了。

$ npm install -g truffle
$ mkdir metacoin_ci_example
$ cd metacoin_ci_example/
$ truffle unbox metacoin
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

  Compile contracts: truffle compile
  Migrate contracts: truffle migrate
  Test contracts:    truffle test

项目工程和代码都已经就绪,为了管理项目依赖,我们可以考虑使用npm:

$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (metacoin_ci_example)
version: (1.0.0)
description:
entry point: (truffle-config.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to C:\Users\abcfy\projects\metacoin_ci_example\package.json:

{
  "name": "metacoin_ci_example",
  "version": "1.0.0",
  "description": "",
  "main": "truffle-config.js",
  "directories": {
    "test": "test"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this ok? (yes)

一路回车之后就创建好了npm的依赖管理配置文件package.json,熟悉npm的用户可以自行对这个配置文件进行定制。

目前我们只用了truffle一个依赖,添加这个依赖进入package.json即可:

$ npm install -S truffle
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN metacoin_ci_example@1.0.0 No description
npm WARN metacoin_ci_example@1.0.0 No repository field.

+ truffle@4.1.13
added 81 packages in 16.184s

此时package.json文件中就会多出truffle的依赖项,这样我们就通过配置文件的形式管理了依赖。

接下来是版本化,这里为了演示,我们使用Git管理源码,并且最终会托管到github上供读者参考。

$ git init
$ echo -e '.*\n!.gitignore\nnode_modules\nbuild' > .gitignore
$ git add -A
$ git commit -m 'init'

这样我们就初始化了一个git仓库,并且将隐藏文件以及node_modules/目录和build/目录添加到了.gitignore文件中,提交的时候不会将这些文件提交到版本库。如需添加更多忽略文件可以自行编辑.gitignore

为了后面Jenkins的演示,我已将我的工程代码提交到github中: https://github.com/abcfy2/metacoin_ci_example

此时我们就可以在本地实现自动化测试了(喜欢用npm管理测试步骤的可以自行修改package.json中的test配置项,使用npm test命令运行):

$ node_modules/.bin/truffle test
Using network 'test'.

Compiling .\contracts\ConvertLib.sol...
Compiling .\contracts\MetaCoin.sol...
Compiling .\test\TestMetacoin.sol...
Compiling truffle/Assert.sol...
Compiling truffle/DeployedAddresses.sol...


  TestMetacoin
    √ testInitialBalanceUsingDeployedContract (94ms)
    √ testInitialBalanceWithNewMetaCoin (93ms)

  Contract: MetaCoin
    √ should put 10000 MetaCoin in the first account
    √ should call a function that depends on a linked library (63ms)
    √ should send coin correctly (250ms)


  5 passing (2s)

我们还可以在测试环境下测试一下部署(注: 产品环境部署需要消耗GAS,请务必在测试环境中测试无误方可产品部署)

使用Jenkins自动化持续集成

自动化条件都已经具备,最后我们只需要使用一些工具帮助我们自动触发持续集成即可。这里我们使用Jenkins做示范,如果使用其他ci工具,读者可以自行参考ci工具的文档即可。

我们的Jenkins服务器使用Ubuntu Server 16.04做演示。首先安装Jenkins(安装命令来源于Jenkins官方文档):

$ wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
$ sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
$ sudo apt-get update

# Jenkins运行依赖JRE,但是安装包却不依赖JRE,所以需要自己安装,如果系统环境中已有JRE,则openjdk-8-jre这个包不需要安装,以免和系统已有的包冲突。
$ sudo apt-get install -y openjdk-8-jre git jenkins

Jenkins默认监听8080端口,访问8080端口的http应用即可打开Jenkins页面:

image.png

按照提示打开初始化密码的文件(需root权限),将密码填入,进入下一步:

image.png

为了简便操作我们直接选左边安装推荐的插件,如有定制需求的用户选择右边自定义插件:

image.png

等待插件安装完毕,即可结束安装:

image.png
image.png

我们的项目用了nodejs和npm做底层依赖,所以需要在Jenkins中添加NodeJS插件,减少我们的构建环境维护操作(比如不需要手工在Jenkins服务器安装NodeJS了):

image.png

由于truffle test的终端输出有彩色,为了构建日志中输出好看点,还可以添加Jenkins的AnsiColor插件以支持终端彩色输出:

image.png

目前nodejs的LTS版本是8.x,所以我们再在全局工具配置中,添加一个Node JS 8.11.3的安装管理,并且起名为Node 8.x:

image.png

Jenkins的准备过程就完成了,然后我们得告诉Jenkins应该怎么持续集成我们的项目,接下来我们要在项目中创建Jenkins pipeline配置脚本,该脚本使用Groovy DSL语法,有关Jenkins pipeline script详细使用请参考官方文档

在项目目录中新建一个Jenkinsfile文件,内容如下:

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                nodejs('Node 8.x') {
                    ansiColor {
                        sh 'npm install'
                        sh 'node_modules/.bin/truffle compile'
                    }
                }
            }
        }
        stage('Test') {
            steps {
                nodejs('Node 8.x') {
                    ansiColor {
                        sh 'npm install'
                        sh 'node_modules/.bin/truffle test'
                    }
                }
            }
        }
    }
}

上面的脚本中我们用了两个插件的配置,所以请务必确保NodeJSAnsiColor两个插件安装,并且在全局工具配置中添加有Node 8.x这个NodeJS安装管理。

由于目前没有测试环境,所以并未加Deploy配置,读者可以自行根据需要添加部署配置,并且可以灵活的利用Groovy DSL做各种条件判断,以满足各自复杂的需求,这里就不再展开了。

然后进入Jenkins,在新建项目中选择pipeline:

image.png

pipeline配置如下所示:

image.png

我们的Jenkinsfile来源于SCM,填入github的地址即可: https://github.com/abcfy2/metacoin_ci_example.git

保存之后,点击立即构建看看,构建成功应该看到类似于下面这样的输出:

image.png

在Jenkins的项目界面中也能看到pipeline的示意图:

image.png

手工点击Jenkins的构建按钮完成集成的功能我们已经实现,最后就是实现彻底自动化,在git仓库有变动的时候自动触发Jenkins构建项目,这里需要用到git的webhook功能,由于Jenkins有github这个插件,可以帮助我们简化这个操作,参考github集成文档即可: https://jenkins.io/solutions/github/

我这边的测试环境是内网,github无法利用webhook触发jenkins自动构建,这里我就不做演示了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容