标签 CI 下的文章

GitHub and all CI tools

持续集成(CI)工具可以帮助你在每次提交时执行测试,并将报告结果提交到合并请求,从而帮助维持团队的质量标准。结合持续交付(CD)工具,你还可以在多种配置上测试你的代码,运行额外的性能测试,并自动执行每个步骤,直到进入产品阶段

有几个与 GitHub 集成的 CI 和 CD 工具,其中一些可以在 GitHub Marketplace 中点击几下安装。有了这么多的选择,你可以选择最好的工具 —— 即使它不是与你的系统预集成的工具。

最适合你的工具取决于许多因素,其中包括:

  • 编程语言和程序架构
  • 你计划支持的操作系统和浏览器
  • 你团队的经验和技能
  • 扩展能力和增长计划
  • 依赖系统的地理分布和使用的人
  • 打包和交付目标

当然,无法为所有这些情况优化你的 CI 工具。构建它们的人需要选择哪些情况下服务更好,何时优先考虑复杂性而不是简单性。例如,如果你想测试针对一个平台的用特定语言编写的小程序,那么你就不需要那些可在数十个平台上测试,有许多编程语言和框架的,用来测试嵌入软件控制器的复杂工具。

如果你需要一些灵感来挑选最好使用哪个 CI 工具,那么看一下 Github 上的流行项目。许多人在他们的 README.md 中将他们的集成的 CI/CD 工具的状态显示为徽章。我们还分析了 GitHub 社区中超过 5000 万个仓库中 CI 工具的使用情况,并发现了很多变化。下图显示了根据我们的拉取请求中使用最多的提交状态上下文,GitHub.com 使用的前 10 个 CI 工具的相对百分比。

我们的分析还显示,许多团队在他们的项目中使用多个 CI 工具,使他们能够发挥它们最擅长的。

Top 10 CI systems used with GitHub.com based on most used commit status contexts

如果你想查看,下面是团队中使用最多的 10 个工具:

这只是尝试选择默认的、预先集成的工具,而没有花时间根据任务研究和选择最好的工具,但是对于你的特定情况会有很多很好的选择。如果你以后改变主意,没问题。当你为特定情况选择最佳工具时,你可以保证量身定制的性能和不再适合时互换的自由。

准备好了解 CI 工具如何适应你的工作流程了么?


via: https://github.com/blog/2463-github-welcomes-all-ci-tools

作者:jonico 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我最近买了新 MacBook Pro 作为我的主要的安卓开发机,我的老式的 MacBookPro(13 寸,2011 年后期发布,16GB 内存, 500G 的固态硬盘,内核是 i5,主频 2.4GHz,64 位),我也没卖,我清理了它,并把他变成了一个 MacOS 和Ubuntu 双引导的持续集成(CI)服务器。

写这篇文章我主要想总结一下安装步骤,好给自己以后作参考,当然,这篇文章也是给同行看的,只要他们感兴趣。好了,现在开始:

  1. 配置一个新的 Ubuntu ,以便运行 Android SDK。
  2. 安装 Jenkins CI 服务来拉取、编译、运行测试托管在 Github 的多模块 Android 项目。
  3. 安装 Docker 并在容器中运行 MySQL 服务器和 SonarQube。来运行由 Jenkins 触发的静态代码分析。
  4. Android app 配置需求。

第一步-安装 Ubuntu:

我将使用 Ubuntu 作为持续集成的 SO,因为 Ubuntu 有一个强大的社区,它可以解决你遇到的任何问题,而且我个人推荐总是使用 LTS 版本,当前是 16.04 LTS。已经有很多教程教大家在各种硬件上怎么安装了,我就不废话了,贴个下载链接就行了。

有人可能很奇怪:用什么桌面版,服务器版多好。额,这个嘛,萝卜青菜,各有所爱。我倒不在乎 UI 占用的那点运算资源。相反,用那一点资源换来生产力的提升我觉得挺值的。

第二步-远程管理:

SSH 服务器

Ubuntu 桌面版默认安装并没有 ssh 服务器,所以你想远程通过命令行管理的话就只好自己安装。

$ sudo apt-get install openssh-server

NoMachine 远程桌面

可能你的持续集成服务器没有挨着你,而是在你的路由器后面,或者其它屋子,甚至还可能远离你数里。我试过各种远程桌面方案,不得不说,IMHO NoMachine 在这方面表现的最好,它只需要你的 ssh 证书就可以工作了(显然你要先把它安装在 CI 和你的机器中)。

第三步-配置环境:

这里我打算安装 Java8,Git,和 Android SDK,Jenkins 需要它们来拉取、编译和运行 android 项目。

SDKMAN!

这个超级厉害的命令行工具让你可以安装各种流行的 SDK(比如说,Gradle、Groovy、Grails、Kotlin、 Scala……),并可以以容易方便的方式列出它们和在各个并行版本中切换。

它们最近又增加了对 JAVA8 的支持,所以我使用它来安装 Java,而是用流行的 webupd8 仓库。所以在你安装开始前,务必要想清你要不要安装 SDKMAN,话说回来,最好还是装上,因为我们以后应该会用到。

安装 SDKMAN! 很容易,执行以下命令即可:

$ curl -s "https://get.sdkman.io" | bash

Oracle JAVA8

因为我们已经安装了 SDKMAN! ,所以安装 JAVA8 就相当简单了:

$ sdk install java

或者使用 webupd8 这个仓库:

Git:

安装git的命令也非常直观,就不废话了。

$ sudo apt install git

Android SDK

这下面这篇文章的底部

你可以找到 “Get just the command line tools” 等字样,复制这个链接。比如:

https://dl.google.com/android/repository/tools_r25.2.3-linux.zip

下载,然后解压到 /opt/android-sdk-linux 下:

$ cd /opt
$ sudo wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
$ sudo unzip tools_r25.2.3-linux.zip -d android-sdk-linux

我们使用 root 用户创建了该目录,所以我们需要重新授权来使我们的主要用户对它可读可写。

$ sudo chown -R YOUR_USERNAME:YOUR_USERNAME android-sdk-linux/

然后,在 ~/.bashrc 文件下设置 SDK 的环境变量

$ cd
$ nano .bashrc

在文件底部写入这些行(注意,但要在 SDKMAN! 配置文件前):

export ANDROID_HOME="/opt/android-sdk-linux"
export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"

关闭此终端,再打开一个新的终端看看环境变量是否正确生效:

$ echo $ANDROID_HOME
/opt/android-sdk-linux

然后我们启动图形界面的 Android SDK 管理器,并安装你所需的平台和依赖:

$ android

运行 Android SDK Manager 的图形交互界面

第四步-Jenkins 服务器

这里,我要讲讲怎么安装、配置该服务器,并创建 Jenkin 任务来拉取、构建和测试 Android 项目,并怎样获取控制台输出。

安装 Jenkins

你可以在下面的链接找到 Jenkins 服务器相关信息:

我们有许多办法运行 Jenkins,比如说运行 .war 文件,作为 Linux 服务,作为 Docker 容器等等。

我起初是想把它当做 Docker 容器运行,但是后来我意识到正确地配置代码文件夹、android-sdk 文件夹的可见性,和插到运行的 Android 测试机上的物理设备的 USB 可见性简直是一场噩梦。

少操点心,我最终决定以服务的方式,增加 Stable 仓库的 key 来通过 apt 安装和更新。

$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -

编辑 source.list,写入这一行:

$ sudo nano /etc/apt/sources.list
#Jenkin Stable
deb https://pkg.jenkins.io/debian-stable binary/

然后安装:

sudo apt-get update
sudo apt-get install jenkins

在你的用户组里面增加 jenkins ,允许其读写 Android SDK 文件夹。

$ sudo usermod -a -G 你的用户组 jenkins

Jenkins 服务在开机引导时就会被启动,并可通过 http://localhost:8080 访问:

安装完毕会有一些安全预警信息,跟着引导程序走,你的 Jenkins 就会运行了。

启用安装成功的 Jenkins 服务器。

Jenkins 配置

启用成功后,会有提示程序提示你安装插件,单击 “Select plugins to Install” 就可以开始浏览所有插件,然后选择你要安装的插件就 OK 了 。

安装 Jenkins 插件

创建管理员用户,并完成安装。

要完成安全需要配置环境变量 ANDROID_HOMEJAVA_HOME

点击 Manage Jenkins,接着 Configure System。

滚动文件至底部,在全局属性模块中找到环境变量,并增加 ANDROID_HOMOE,和 JAVA_HOME 变量。

给所有 Jenkins 任务增加全局变量

创建 Jenkins 任务

一个 Jenkins 任务定义了一系列不间断的操作。如果你跟随本篇引导的话,那么你可以使用我已经在 GitHub 上为你准备了一个 Android 练习项目,你可以使用这个来试试手。它只是一个多模块的 app,带有单元测试、Android 测试,包括 JaCoCo、SonarQube 插件。

首先创建一个新的 Freestyle 任务项目,取名为 Hello_Android。不要在名字中使用空格,这样可以避免与 SonarQube 不兼容的问题。

创建一个 Freestyle Jenkins 任务

接下来就是配置了,我给每一部分都做了截屏。

概况

这部分比较繁琐,你可以在这里变更任务的名字、增加简介。如果你使用 GitHub 项目,你还可以写下项目的 URL(不要 *.git,这是 url 的部分,不是仓库的)。

项目 Url 配置

源代码管理

这时候我们就要选择我们的 CVS 作为 Git,并且增加仓库的 url(这次就要包括 *.git)然后选择分支拉取。因为这是一个公开的 GitHub 仓库,我们就不需要提交证书了,否则的话就要设置账号和密码。

相比于使用你的带有完全权限的公开仓库,我更倾向于为你的私有库创建一个新的只读用户来专门配给 Jenkins 任务使用。

另外,如果你已经使用了双因子认证,Jenkins 就无法拉取代码,所以为 Jenkins 专门创建一个用户可以直接从私有库中拉取代码。

配置仓库

构建触发器

你可以手动开始构建,也可以远程地、周期性地、或者在另一个任务构建完成之后开始构建,只要这些改变可以被检测到。

最好的情况肯定是一旦你更改了某些地方,就会立刻触发构建事件,Github 为此提供了一个名叫 webhooks 的系统。

这样,我们就可以配置来发送这些事件到 CI 服务器,然后触发构建。显然,我们的 CI 服务器必须要联网,并且可以与 GitHub 服务器通信。

你的 CI 服务器也许为了安全只限于内网使用,那么解决办法就只有集中周期性的提交。我就是只有工作时才打开 CI,我把它设置为每十五分钟轮询一次。轮询时间可以通过 CRON 语法设置,如果你不熟悉,请点击右侧的帮助按钮获取带有例子的丰富文档。

仓库轮询配置

构建环境

这里我推荐设置构建超时来避免 Jenkings 占用内存和 CPU ,毕竟有时候有意外发生。当然,你还可以插入环境变量和密码等等。

构建超时

构建

现在是见证魔法的时刻了,增加一个 Build 步骤,引入 Gradle 脚本,选择 Gradle Wrapper (默认情况下,Android 项目带有 Gradle Wrapper,不要忘记把它检入到 Git ),然后定义你要执行哪些任务:

  1. clean:清除之前构建的所有历史输出,这样可以确保没有东西缓存,从头构建。
  2. asseembleDebug: 生成调试 .apk 文件。
  3. test:在所有模块上执行 JUnit 测试。
  4. connectedDebugAndroidTest:在连接到 CI 的实体机上执行安卓测试单元(也可以使用安装了安卓模拟器的 Jenkins 插件,但是它不支持所有型号,而且相当麻烦)。

配置 Gradle

构建后操作

我们将要增加“发布 JUnit 测试报告”,这一步由 JUnit 插件提供,其搜集由 JUnit 测试结果生成的 XML 文件,它会生成漂亮的图表来按时间展示测试结果。

我们 app 模块中,测试运行结果的路径是: app/build/test-results/debug/*.xml

在多模块项目中,其它的“纯” Java 模块中测试结果在这里:*/build/test-results/*.xml

还要增加“记录 JaCoCo 覆盖率报告”,它要创建一张显示代码覆盖率的图表。

运行 Jenkins 任务

只要有任何改变提交到仓库,我们的测试任务将每十五分钟执行一次,但是如果你不想等的话,或者你只是想验证一下配置的改变,你也可以手动运行。单击“现在构建”按钮,当前的构建将出现在构建历史中,点击它可以查看细节。

手动执行任务

最有趣的部分是控制台输出,你可以看到 Jenkins 是如何拉取代码并执行我们之前定义的 Gradle 项目,例如 clean。

控制台输出的开始部分

如果一切都正常的话,控制台将会有如下输出 (任何仓库连接问题,单元测试或 Android 测试的失败都将导致构建失败)。

哈哈哈哈,构建成功,测试结果符合预期

第五步-SonarQube

这部分我会讲讲如何安装、配置 SonarQube ,并配以使用 Docker 作为容器的 MySQL 数据库。

SonarQube 是个代码静态分析工具,它可以帮助开发者写出干净的代码、检测错误和学习最佳体验。它还可以跟踪代码覆盖、测试结果、功能需求等等。SonarQube 检测到的问题可以使用插件十分容易的导入到 Android Studion/IntelliJ 中去。

安装 Docker

安装 Docker 十分容易,按照下面的教程即可:

生成容器

MySQL

我们先搭建一个 MySQL5.7.17 服务器容器,命名为 mysqlserver,它将在开机引导时启动,带有一个在你的家目录下的本地卷,带有密码,服务暴露在 localhost:3306 上(把命令中的 YOUR_USERYOUR_MYSQL_PASSWORD 替换为你自己账号密码)。

$ docker run --name mysqlserver --restart=always -v /home/YOUR_USER/mysqlVolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=YOUR_MYSQL_PASSWORD -p 3306:3306 -d mysql:5.7.17

phpMyAdmin

想要优雅简单地管理 MySQL服务器,我强烈推荐 phpMyAdmin。你只要建立个容器,命名为 phpmyadmin,然后链接到我们的 mysqlserver 容器,它会在开机引导时启动,它暴露在 localhost:9090。使用最新的版本。

$ docker run --name phpmyadmin --restart=always --link mysqlserver:db -p 9090:80 -d phpmyadmin/phpmyadmin

你可以用你的 mysql 密码 YOUR_MYSQL_PASSWORD ,以 root 身份登录 localhost:9090 的 phpMyAdmin 界面,并创建一个数据库 sonar,使用uft8_general_ci 字符集。此外,也创建一个 sonar 的新用户,密码 YOUR_SONAR_PASSWORD,并给它 sonar 数据库的权限。

SonarQube

现在我们已经创建好了我们的 SonarQube 容器,就叫 sonarqube,它会在机器引导时启动,自动链接搭配我们的数据库,服务暴露在 localhost:9090,使用 5.6.4 版本。

$ docker run --name sonarqube --restart=always --link mysqlserver:db -p 9000:9000 -p 9092:9092 -e "SONARQUBE_JDBC_URL=jdbc:mysql://db:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance" -e "SONARQUBE_JDBC_USER=sonar" -e "SONARQUBE_JDBC_PASSWORD=YOUR_SONAR_PASSWORD" -d sonarqube:5.6.4

配置 SonarQube

如果一起都正常,你将在 localhost:9000 看到如下页面:

好了,让我们来配置必要的插件和基本的配置文件:

  1. 在页面的右上角可以登录(默认的管理员账号和密码是 admin/admin)。
  2. 进入到 Administration,然后点击 System,接下来是 Updata Center,最后是 Updates Only。

    • 如果需要的话,更新 Java 插件。
  3. 现在启用,并安装以下插件

    • Android (提供 Android lint 规则)
    • Checkstyle
    • Findbugs
    • XML
  4. 返回顶部,点击重启按钮完成整个安装。

SonarQube 配置文件

我们刚刚安装的插件可以定义配置文件,可以用一套规则去衡量项目的代码质量。

同一时间一个项目只能使用一个配置文件。但是我们可以定义父配置文件并继承规则,所以要对我们的项目执行所有的规则,我们可以创建定制的配置文件并链状串联所有配置文件。

就这么干,点击 Quality Profiles ,跳转到 Create ,然后命名,比如 CustomAndroidProfile。

将 Android Lint 作为父级,然后选择 Android Lint 配置,增加 FindBugs Security Minial 作为上一级,继续此步骤,直到你完成父级继承方案,并且设置 CustomAndroidProfile 作为默认。

继承链

运行 Sonarqube 分析器

现在我们的 SonarQube 已经正式配置完毕,我们需要添加一个 Gradle 任务 sonarqube 到我们的 Jenkins 任务。我们在最后执行。

再次运行 Jenkins 任务,一旦运行完毕,我们可以在 localhost:9090 中看到我们的 sonarQube 控制面板。

分析结果的显示

点击项目名称我们可以进入到不同的显示界面,最重要的可能就是问题界面了。

在下一屏,我将展示一个主要问题,它是一个空构造器方法。就我个人而言,使用 SonarQube 最大的好处就是当我点击“...”时可以在屏幕底部显示解释。这是一个学习编程十分有用的技能。

第六步 附加:配置其他 Android 应用

想要配置 Android 应用得到覆盖率和 sonarqube 的结果,只要安装 JaCoCo 和 Sonarqube 插件就可以了。你也可以在我的示例中得到更多信息

你也可以看看我在云上测试的文章:

最后

啊,你终于走到头了,希望你觉得本文有点用处。你要是发现了任何错误,有任何疑问,别迟疑,赶紧评论。我拼了老命也要帮你。哦,忘了提醒,好东西要和朋友分享。


作者简介:

Entrepreneur & CEO at GreenLionSoft · Android Lead @MadridMBC & @Shoptimix · Android, OpenSource and OpenData promoter · Runner · Traveller


via: https://medium.com/@pamartineza/how-to-set-up-a-continuous-integration-server-for-android-development-ubuntu-jenkins-sonarqube-43c1ed6b08d3#.x6jhcpg98

作者:Pablo A. Martínez 译者:Taylor1024 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你对一次又一次的克隆、构建、测试和部署代码感到厌倦了,可以考虑一下持续集成。持续集成简称 CI,是一种像我们一样的频繁提交的代码库,构建、测试和部署的软件工程实践。CI 可以帮助我们快速的集成新代码到已有的代码库。如果这个过程是自动化进行的,那么就会提高开发的速度,因为这可以减少开发人员手工构建和测试的时间。Drone 是一个自由开源项目,用来提供一个非常棒的持续集成服务的环境,采用 Apache 2.0 协议发布。它已经集成近很多代码库提供商,比如 Github、Bitbucket 以及 Google Code,它可以从代码库提取代码,使我们可以对包括 PHP, Node, Ruby, Go, Dart, Python, C/C++, JAVA 等等在内的各种语言编译构建。它是如此一个强大的平台,它使用了容器和 docker 技术,这让用户每次构建都可以在保证隔离的条件下完全控制他们自己的构建环境。

1. 安装 Docker

首先,我们要安装 docker,因为这是 Drone 的工作流的最关键的元素。Drone 合理的利用了 docker 来构建和测试应用。容器技术提高了应用部署的效率。要安装 docker ,我们需要在不同的 linux 发行版本运行下面对应的命令,我们这里会说明 Ubuntu 14.04 和 CentOS 7 两个版本。

Ubuntu

要在 Ubuntu 上安装 Docker ,我们只需要运行下面的命令。

# apt-get update
# apt-get install docker.io

安装之后我们需要使用service 命令重启 docker 引擎。

# service docker restart

然后我们让 docker 在系统启动时自动启动。

# update-rc.d docker defaults

Adding system startup for /etc/init.d/docker ...
/etc/rc0.d/K20docker -> ../init.d/docker
/etc/rc1.d/K20docker -> ../init.d/docker
/etc/rc6.d/K20docker -> ../init.d/docker
/etc/rc2.d/S20docker -> ../init.d/docker
/etc/rc3.d/S20docker -> ../init.d/docker
/etc/rc4.d/S20docker -> ../init.d/docker
/etc/rc5.d/S20docker -> ../init.d/docker

CentOS

第一,我们要更新机器上已经安装的软件包。我们可以使用下面的命令。

#  sudo yum update

要在 centos 上安装 docker,我们可以简单的运行下面的命令。

#  curl -sSL https://get.docker.com/ | sh

安装好 docker 引擎之后我么只需要简单使用下面的systemd 命令启动 docker,因为 centos 7 的默认初始化系统是 systemd。

# systemctl start docker

然后我们要让 docker 在系统启动时自动启动。

# systemctl enable docker

ln -s '/usr/lib/systemd/system/docker.service' '/etc/systemd/system/multi-user.target.wants/docker.service'

2. 安装 SQlite 驱动

Drone 默认使用 SQlite3 数据库服务器来保存数据和信息。它会在 /var/lib/drone/ 自动创建名为 drone.sqlite 的数据库来处理数据库模式的创建和迁移。要安装 SQlite3 我们要完成以下几步。

Ubuntu 14.04

因为 SQlite3 存在于 Ubuntu 14.04 的默认软件库,我们只需要简单的使用 apt 命令安装它。

# apt-get install libsqlite3-dev

CentOS 7

要在 Centos 7 上安装需要使用下面的 yum 命令。

# yum install sqlite-devel

3. 安装 Drone

最后,我们安装好依赖的软件,我们现在更进一步的接近安装 Drone。在这一步里我们只简单的从官方链接下载对应的二进制软件包,然后使用默认软件包管理器安装 Drone。

Ubuntu

我们将使用 wget 从官方的 Debian 文件下载链接下载 drone 的 debian 软件包。下面就是下载命令。

# wget downloads.drone.io/master/drone.deb

Resolving downloads.drone.io (downloads.drone.io)... 54.231.48.98
Connecting to downloads.drone.io (downloads.drone.io)|54.231.48.98|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7722384 (7.4M) [application/x-debian-package]
Saving to: 'drone.deb'
100%[======================================>] 7,722,384 1.38MB/s in 17s
2015-11-06 14:09:28 (456 KB/s) - 'drone.deb' saved [7722384/7722384]

下载好之后,我们将使用 dpkg 软件包管理器安装它。

# dpkg -i drone.deb

Selecting previously unselected package drone.
(Reading database ... 28077 files and directories currently installed.)
Preparing to unpack drone.deb ...
Unpacking drone (0.3.0-alpha-1442513246) ...
Setting up drone (0.3.0-alpha-1442513246) ...
Your system ubuntu 14: using upstart to control Drone
drone start/running, process 9512

CentOS

在 CentOS 机器上我们要使用 wget 命令从下载链接下载 RPM 包。

# wget downloads.drone.io/master/drone.rpm

--2015-11-06 11:06:45-- http://downloads.drone.io/master/drone.rpm
Resolving downloads.drone.io (downloads.drone.io)... 54.231.114.18
Connecting to downloads.drone.io (downloads.drone.io)|54.231.114.18|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7763311 (7.4M) [application/x-redhat-package-manager]
Saving to: ‘drone.rpm’
100%[======================================>] 7,763,311 1.18MB/s in 20s
2015-11-06 11:07:06 (374 KB/s) - ‘drone.rpm’ saved [7763311/7763311]

然后我们使用 yum 安装 rpm 包。

# yum localinstall drone.rpm

4. 配置端口

安装完成之后,我们要先进行配置才能工作起来。drone 的配置文件在/etc/drone/drone.toml 。默认情况下 drone 的 web 接口使用的是80,而这也是 http 默认的端口,如果我们修改它,请按下面所示的修改配置文件里 server 块对应的值。

[server]
port=":80"

5. 集成 Github

为了运行 Drone 我们必须设置最少一个和 GitHub、GitHub 企业版,Gitlab,Gogs,Bitbucket 关联的集成点。在本文里我们只集成了 github,但是如果我们要集成其他的服务,我们可以在配置文件做修改。为了集成 github 我们需要在github 的设置里创建一个新的应用:https://github.com/settings/developers

Registering App Github

要创建一个应用,我们需要在 New Application 页面点击 Register,然后如下所示填表。

Registering OAuth app github

我们应该保证在应用的配置项里设置了授权回调链接,链接看起来类似 http://drone.linoxide.com/api/auth/github.com。然后我们点击注册应用。所有都做好之后我们会看到我们需要在我们的 Drone 配置文件里配置的客户端 ID 和客户端密钥。

Client ID and Secret Token

在这些都完成之后我们需要使用文本编辑器编辑 drone 配置文件,比如使用下面的命令。

# nano /etc/drone/drone.toml

然后我们会在 drone 的配置文件里面找到[github] 部分,紧接着的是下面所示的配置内容

[github]
client="3dd44b969709c518603c"
secret="4ee261abdb431bdc5e96b19cc3c498403853632a"
# orgs=[]
# open=false

Configuring Github Drone

6. 配置 SMTP 服务器

如果我们想让 drone 使用 email 发送通知,那么我们需要在 SMTP 配置里面设置我们的 SMTP 服务器。如果我们已经有了一个 SMTP 服务,那就只需要简单的使用它的配置文件就行了,但是因为我们没有一个 SMTP 服务器,我们需要安装一个 MTA 比如 Postfix,然后在 drone 配置文件里配置好 SMTP。

Ubuntu

在 ubuntu 里使用下面的 apt 命令安装 postfix。

# apt-get install postfix

CentOS

在 CentOS 里使用下面的 yum 命令安装 postfix。

# yum install postfix

安装好之后,我们需要编辑我们的 postfix 配置文件。

# nano /etc/postfix/main.cf

然后我们要把 myhostname 的值替换为我们自己的 FQDN,比如 drone.linoxide.com。

myhostname = drone.linoxide.com

现在开始配置 drone 配置文件里的 SMTP 部分。

# nano /etc/drone/drone.toml

找到[smtp] 部分补充上下面的内容。

[smtp]
host = "drone.linoxide.com"
port = "587"
from = "[email protected]"
user = "root"
pass = "password"

Configuring SMTP Drone

注意:这里的 userpass 参数强烈推荐一定要改成某个具体用户的配置。

7. 配置 Worker

如我们所知的 drone 利用了 docker 完成构建、测试任务,我们需要把 docker 配置为 drone 的 worker。要完成这些需要修改 drone 配置文件里的[worker] 部分。

# nano /etc/drone/drone.toml

然后取消底下几行的注释并且补充上下面的内容。

[worker]
nodes=[
"unix:///var/run/docker.sock",
"unix:///var/run/docker.sock"
]

这里我们只设置了两个节点,这意味着上面的配置文件只能同时执行2 个构建操作。要提高并发性可以增大节点的值。

[worker]
nodes=[
"unix:///var/run/docker.sock",
"unix:///var/run/docker.sock",
"unix:///var/run/docker.sock",
"unix:///var/run/docker.sock"
]

使用上面的配置文件 drone 被配置为使用本地的 docker 守护程序可以同时构建4个任务。

8. 重启 Drone

最后,当所有的安装和配置都准备好之后,我们现在要在本地的 linux 机器上启动 drone 服务器。

Ubuntu

因为 ubuntu 14.04 使用了 sysvinit 作为默认的初始化系统,所以只需要简单执行下面的 service 命令就可以启动 drone 了。

# service drone restart

要让 drone 在系统启动时也自动运行,需要运行下面的命令。

# update-rc.d drone defaults

CentOS

因为 CentOS 7使用 systemd 作为初始化系统,所以只需要运行下面的 systemd 命令就可以重启 drone。

# systemctl restart drone

要让 drone 自动运行只需要运行下面的命令。

# systemctl enable drone

9. 添加防火墙例外规则

众所周知 drone 默认使用了80 端口而我们又没有修改它,所以我们需要配置防火墙程序允许80 端口(http)开放并允许其他机器可以通过网络连接。

Ubuntu 14.04

iptables 是最流行的防火墙程序,并且 ubuntu 默认安装了它。我们需要修改 iptable 以暴露端口80,这样我们才能让 drone 的 web 界面在网络上被大家访问。

# iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# /etc/init.d/iptables save

CentOS 7

因为 CentOS 7 默认安装了 systemd,它使用 firewalld 作为防火墙程序。为了在 firewalld 上打开80端口(http 服务),我们需要执行下面的命令。

# firewall-cmd --permanent --add-service=http
success

# firewall-cmd --reload
success

10. 访问 web 界面

现在我们将在我们最喜欢的浏览器上通过 web 界面打开 drone。要完成这些我们要把浏览器指向运行 drone 的服务器。因为 drone 默认使用80 端口而我们有没有修改过,所以我们只需要在浏览器里根据我们的配置输入http://ip-address/http://drone.linoxide.com 就行了。在我们正确的完成了上述操作后,我们就可以看到登录界面了。

Login Github Drone

因为在上面的步骤里配置了 Github,我们现在只需要简单的选择 github 然后进入应用授权步骤,这些完成后我们就可以进入工作台了。

Drone Dashboard

这里它会同步我们在 github 上的代码库,然后询问我们要在 drone 上构建那个代码库。

Activate Repository

这一步完成后,它会询问我们在代码库里添加.drone.yml 文件的新名称,并且在这个文件里定义构建的过程和配置项,比如使用那个 docker 镜像,执行那些命令和脚本来编译,等等。

我们按照下面的内容来配置我们的.drone.yml

image: python
script:
 - python helloworld.py
 - echo "Build has been completed."

这一步完成后我们就可以使用 drone 应用里的 YAML 格式的配置文件来构建我们的应用了。所有对代码库的提交和改变此时都会同步到这个仓库。一旦提交完成了,drone 就会自动开始构建。

Building Application Drone

所有操作都完成后,我们就能在终端看到构建的结果了。

Build Success Drone

总结

在本文中我们学习了如何安装一个可以工作的使用 drone 的持续集成平台。如果我们愿意我们甚至可以从 drone.io 官方提供的服务开始工作。我们可以根据自己的需求从免费的服务或者收费服务开始。它通过漂亮的 web 界面和强大的功能改变了持续集成的世界。它可以集成很多第三方应用和部署平台。如果你有任何问题、建议可以直接反馈给我们,谢谢。


via: http://linoxide.com/linux-how-to/setup-drone-continuous-integration-linux/

作者:Arun Pyasi 译者:ezio 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出