本文介绍使用Jenkins构建SAE应用的持续集成。

前提条件

在开始持续集成之前,需要完成下述的准备工作。
  1. 获取阿里云的Access Key ID和Access Key Secret。

    1. 使用已经开通了SAE服务的主账号登录阿里云官网。
    2. 进入Access Key控制台,创建Access Key ID和Access Key Secret。EDAS使用 Jenkins 创建持续集成01
  2. 在使用Jenkins自动部署应用之前,需要先在SAE控制台中创建一个可以部署的应用。
    1. 登录SAE控制台
    2. 参考应用部署概述,部署应用。
    3. 在左侧导航栏中单击应用管理,并进入应用详情页面,获取应用ID的字段内容。在SAE控制平台获取应用ID
  3. 使用GitLab托管您的代码。您可以自行搭建Gitlab或者使用阿里云Code

    本文使用通过自行搭建的GitLab做演示,关于Gitlab的更多信息请参见GitLab

  4. 了解并使用Jenkins。关于Jenkins的更多详细信息请参见Jenkins官网

背景信息

使用Jenkins可以构建SAE应用的持续集成方案。该方案涉及下面的计算机语言或开发工具,阅读本文需要对下述的语言或工具有一定的理解。

工具 说明
Maven Maven是一个项目管理和构建的自动化工具。
Jenkins Jenkins是一个可扩展的持续集成引擎。
GitLab GitLab是一个利用Ruby on Rails开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。 它拥有与GitHub类似的功能,能够浏览源代码,管理缺陷和注释。

配置项目

参考通过toolkit-maven-plugin插件自动化部署应用修改项目配置,添加toolkit-maven-plugin及部署信息。您在修改完项目配置后,建议在本地使用Maven构建验证配置是否正确。

安装和配置Jenkins

  1. 进入Jenkins官网下载安装Jenkins。
  2. 在Jenkins控制台的菜单栏中选择系统管理 > 插件管理,安装Git和GitLab插件。
    • 安装GIT Client Plugin和GIT Plugin插件可以帮助Jenkins拉取Git仓库中的代码。
    • 安装Gitlab Hook Plugin插件可以帮助Jenkins在收到Gitlab发来的Hook后触发一次构建。
    安装和配置 Jenkins
  3. 安装Maven构建工具,请参见Maven官网

    在Jenkins控制台的菜单栏中选择系统管理 > 全局工具配置,选择Maven版本名称并配置路径。

     Jenkins 控制台设置Maven
  4. 在Jenkins服务器上生成SSH RSA密钥对,并将公匙导入GitLab,实现Jenkins拉取GitLab代码时自动认证。
    1. 参考GitLab文档,在Jenkins服务器运行Jenkins软件的用户下,生成SSH RSA密钥对。
      EDAS在 Jenkins 服务器运行 Jenkins 软件的用户下,生成 SSH RSA 密钥对
    2. 进入GitLab首页,在菜单栏选择Settings > Deploy Keys ,并单击new deploy key 添加key,导入在Jenkins服务器上创建的SSH RSA公匙。
      EDAS使用Jenkins在gitlab导公钥1EDAS使用Jenkins在gitlab导公钥2
  5. 创建Jenkins任务。
    1. 在Jenkins首页左侧导航栏中单击新建,创建Jenkins任务,并选择构建一个自由风格的软件项目
      EDAS使用Jenkins集成之创建项目
    2. 源码管理页面中选择Git,并设置相关参数。
      • Repository URL:您的项目的Git协议地址。
      • Credentials:安全凭证,选择即可(前提是运行Jenkins软件的用户的SSH RSA公匙已添加到该Git项目所在的GitLab中,否则将会报错)。
      EDAS使用Jenkins集成之源码管理
    3. 单击构建触发器页签,选中轮询SCM
    4. 单击构建环境页签,选中Add timestamps to the Console Output(为控制台输出的信息添加时间戳)。
    5. 单击构建页签,然后单击增加构建步骤
    6. Invoke top-level Maven targets区域设置Maven VersionGoals。如果您想部署多模块工程,请参见创建多模块工程的Jenkins任务
      • Maven Version:单击该选项后面的下拉框,选择在全局工具配置里配置的Maven 版本名称
      • Goals:填入 mvn clean package toolkit:deploy -Dtoolkit_profile=toolkit_profile.yaml -Dtoolkit_package=toolkit_package.yaml -Dtoolkit_deploy=toolkit_deploy.yaml (如有其它参数,请根据实际情况填入)
      SAE

      Maven配置完成后,在配置正确后,提交变更到GitLab步骤中便可通过POP API方式调触发应用部署。

配置Gitlab的Web Hook,实现自动构建

  1. 右键单击GitLab工程,然后选择Setting > Web Hooks
  2. Web Hooks 页面的在URL 文本框中输入http://jenkins服务器地址:jenkins服务器监听端口/git/notifyCommit?url=本项目的git协议地址

    例如:http://192.168.XX.XX:8080/git/notifyCommit?url=git@code.aliyun.com:tdy218/hello-edas.git

    配置 Gitlab 的 Web Hook,实现自动构建

    图中表示的Jenkins服务器地址为您的Jenkins服务器的Web访问地址如192.168.XX.XX:8080

  3. 配置完成后,单击Test Hook,进行测试。
    配置 Gitlab 的 Web Hook结果

配置正确后,提交变更到GitLab

如果上述步骤配置正确,提交后将会触发一次GitLab Hook。Jenkins在接收到该Hook后会构建您的Maven项目,并在构建结束时调用SAE POP API脚本触发部署。
说明 构建的Maven项目中配置了通过SAE POP API方式部署应用的脚本。

提交部署成功输出的日志信息(Build Number > 控制台输出)。

15:58:51 [INFO] Deploy application successfully!
15:58:51 [INFO] ------------------------------------------------------------------------
15:58:51 [INFO] BUILD SUCCESS
15:58:51 [INFO] ------------------------------------------------------------------------
15:58:51 [INFO] Total time: 24.330 s
15:58:51 [INFO] Finished at: 2018-12-25T15:58:51+08:00
15:58:51 [INFO] Final Memory: 23M/443M
15:58:51 [INFO] ------------------------------------------------------------------------
15:58:51 Finished: SUCCESS
			

如果部署失败,可以登录SAE控制台 ,在左侧导航栏中选择应用管理 > 应用列表 ,在应用列表页面单击具体应用名称,进入应用详情页面。在左侧导航栏单击变更记录来查看此次部署任务的执行过程。

创建多模块工程的Jenkins任务

创建多模块工程的Jenkins任务和安装和配置Jenkins的第5步基本相同,只需要调整下调用顶层Maven目标。如果工程为多模块工程,想在Jenkins中部署子模块的话,那么需要在父模块中调用mvn clean install命令,然后在子模块中调用mvn clean package toolkit:deploy -Dtoolkit_profile=toolkit_profile.yaml -Dtoolkit_package=toolkit_package.yaml -Dtoolkit_deploy=toolkit_deploy.yaml命令。以Demo工程为例,工程结构如下。

sh-3.2# tree -L 1 carshop
carshop
├── detail
├── itemcenter
├── itemcenter-api
└── pom.xml            

其中,detail、itemcenter、itemcenter-api为子模块,现在想部署itemcenter模块的话,那么需要在父工程中设置一个clean install构建目标,然后在itemcenter模块中设置clean package toolkit:deploy -Dtoolkit_profile=toolkit_profile.yaml -Dtoolkit_package=toolkit_package.yaml -Dtoolkit_deploy=toolkit_deploy.yaml构建目标。

SAE