[i=s] 本帖最后由 行者赖 于 2016-3-25 17:24 编辑
[align=center] Redmine 入门三——Redmine 和 Jenkins 集成 [/align] Redmine 和 Jenkins 分别提供了插件用来支持相互操作。 redmine_jenkins 是在 Redmine 中集成 Jenkins 的 job 的启动和构建查看的插件。管理员需要在项目下面配置 Jenkins 的地址和用户名和密码,注意这里配置的用户名和密码通过明文的方式存储在数据库表中。 官方链接http://www.redmine.org/plugins/redmine_jenkins GitHub 下载地址:http://jbox-web.github.io/redmine_jenkins/
图一:Redmine 项目配置中添加 Jenkins 的链接和用户信息
图二:Redmine 中 Jenkins 工程的启动和 job 查看页面 redmine-plugin 是在 Jenkins 中集成 redmine 的用户信息和项目链接的插件。可以允许使用 Redmine 的用户信息登陆 Jenkins。 GitHub 地址https://github.com/jenkinsci/redmine-plugin
图三:Jenkins 中启用 Redmine 用户信息进行验证,需要配置 Redmine 使用的数据库信息,这里给出一个能够读取用户表权限的用户即可
图四:配置 Redmine 站点信息(没有使用过)
这两个插件已经基本上满足基础的集成需求,但是在深入应用还有一些不尽如人意的地方。
一, 用户访问不够灵活。前面提到 Redmine 使用配置 Jenkins 填写的用户名的明文信息去访问 Jenkins,这样无论是那个用户在 Redmine 中启动了 job 对于 Jenkins 来说都是相同的用户信息。介于 Jenkins 中可以使用 Redmine 的用户信息进行访问,通过修改两个插件的代码可以完成相关的需求。
1.1 修改 redmine 插件 redmine_jenkins\app\services\ jenkins_client.rb
[code]@options[:username] = User.current.login.to_s
@options[:password] = User.current.api_key.to_s
#@options[:username] = opts[:username] if opts.has_key?(:username)
#@options[:password] = opts[:password] if opts.has_key?(:password)[/code]
使用登陆用户的用户名和 api_key 访问 Jenkins
1.2 修改 Jenkins 插件
redmine-plugin\src\main\resources\hudson\plugins\redmine\RedmineSecurityRealm\config.jelly 增加
/f:entry
允许用户配置是否使用 api 验证,如果为 true 则 api_token 和密码都可以进行登陆。
src\main\java\hudson\plugins\redmine\dao\MySQLAuthDao.java 增加
String query = String.format("SELECT * FROM %s,tokens WHERE %s = ? and %s.id=tokens.user_id and tokens.action='api'", loginTable, userField, loginTable);
userData.setApitokenvalue(results.getString("value"));
判断 api 值是否正确
src\main\java\hudson\plugins\redmine\RedmineSecurityRealm.java 修改
[code] String version, String loginTable, String userField, String passField, String saltField,String apiToken ) {
if (userData.getPassword().equals(encryptedPassword)) {
LOGGER.info("Encrypted Password: " + encryptedPassword);
return getUserDetails(username, userData.getPassword());
} else if (this.apiToken.equals("true")){
if (password.equals(userData.getApitokenvalue())) {
LOGGER.warning("Api password: "+password);
return getUserDetails(username, userData.getApitokenvalue());
}
}
public String getApiToken() {
return apiToken;
}[/code]
二, Redmine 启动 Jenkins 的 job 不能使用带参数的 job。原始的 redmine_jenkins 插件不支持带带参数启动,但是实际工作中,大部分 job 都需要参数才能正常工作。
通过修改 redmine_jenkins\app\use_cases\jenkins_jobs\trigger_build.rb 可以增加带参数启动方法。
[code] if 条件
build_number = jenkins_client.job.build(jenkins_job.name, {}, opts)
else
build_number = jenkins_client.job.build(jenkins_job.name, params, opts)
end[/code]
由于每个地方使用的参数都不一样,这里就详细描述传递参数方法了。
好吧没有上传图片的权限,附件也传不上来。