前言 sonarqube 支持多种认证登录方式,如果使用自带的账号体系,需要管理员一个个添加账号,使用起来多有不便。不过一般公司都部署了私有化的 Gitlab,我们可以利用私有的 gitlab 账号来登录 Sonarqube。
获取插件
方式一
如果你的 sonarQube 所在服务器可以联网,直接使用管理员账号登录 sonarqube,在线安装插件。
没有安装 GitLab Auth
插件时,应用市场中会有个 安装
按钮,安装完成后变成了 卸载
。
方式二
或者可以去下载 jar 包。
在 sonarQube 的插件页面找到 Gitlab Auth 插件,下载 Version 1.3.2
虽然网页上写的是支持版本到 7.3,实际我用的 sonarQube 版本为 7.9.4,可以正常使用。
方式三
要是都不行,还可以直接去下载源码,编译。
Github 地址:sonar-auth-gitlab-plugin
下载插件然后通过maven打包然后放入到sonar的插件目录中(/home/sonar/sonarqube/extensions/plugins),重启sonarqube。
注意,无论使用哪种方式安装插件,都需要重启sonarqube
Gitlab 配置
理论上来说,任意内部 Gitlab 注册用户都可以执行下面的操作,但是使用权限较低的用户在认证登录的时候,会出现警告。所以,建议使用 Gitlab的管理员账号进行下面的操作。
创建应用
不同的 Gitlab 版本看到的界面风格差异较大,但是都可以在设置 -> 应用
中找到添加新应用的选项。(英文界面 Settings -> Applications)
这里的 名称
一般就填 SonarQube
好了,等下从 Sonarqube 跳转到 gitlab 页面上时,会显示这个名称,所以尽量取一个有意义的名字。
重定向URI
是最重要的参数,格式是固定的:
http://sonardomain.com/oauth2/callback/gitlab
其中 /oauth2/callback/gitlab
是固定字符串,http://sonardomain.com
是 SonarQube 部署的服务器域名。注意是域名,直接使用 ip 是不行的(来源于官方文档,没有测试是不是真的不可以)
scopes
选择 read_user
即可。
如果你的 Gitlab 版本比较新,页面可能是下面这样子:
配置 sonarQube
需要配置很多项,任意一个没有正确设置,都可能导致不可预料的结果。
配置 gitlab 插件
使用管理员账号登录 sonarQube,在配置 -> 通用配置
选项卡下,找到 gitlab
。
如果没有这个选项,那就是 sonar-auth-gitlab-plugin
插件没安装好,或者忘记重启 sonarQube 了。
这里有个 Authentication
,下面有 3 个提示非常关键:
- 需要使用 HTTPS
- 设置
sonar.core.serverBaseURL
- 设置 Gitlab 回调地址
第一项,这里明确提出 sonarQube
需要才用 HTTPS,真是这样吗,实际不是。我部署时并没有采用 HTTPS ,但是依然可以使用。因为开发服务基本都是内网,安全性问题没那么重要,没必要装证书。
第二个配置等下再说。
第三个实际在配置 Gitlab 的时候,已经设置好了。这就是为什么之前提到的回调链接格式必须固定,这里是理论依据。
开启认证登录
Enabled
开启后,一定要点保存。这个是总开关,开启以后,这个插件才启用,如果以后公司不让用 Gitlab 登录了,关闭这个就行了,其他的都可以不改。
Gitlab 地址
GitLab url
填私有的 Gitlab 地址,注意这个默认值,如果在日志里看到你请求的认证地址是 https://gitlab.com
,就是这个选项没配对。
Gitlab 认证
如果你还没有关闭 Gitlab 配置页面,直接把应用 ID
和密匙
复制进去即可。
密匙设置以后不可见,无法从sonarQube页面看到,点击修改也只能输入新的值。
Allow users to sign-up
是否允许用户注册,也就是说如果 sonarQube 里面没有这个用户,能不能允许这个用户登录。
如果不把这个选项打开,新用户不能通过 Gitlab 自动登录,还得预先设置用户。如果 sonarQube 是强控制的,那就不开这个选项。如果在公司内部使用,打开这个可以省掉维护用户体系。通过 Gitlab 登录的用户,在 sonarQube 里可以看到用户名和邮箱。
可以看到,普通用户显示较少的信息,通过 Gitlab登录的用户可以看到用户名,邮箱,Gitlab 标志。
Gitlab access scope
这个设置,默认为 read_user
,其实在获取 Gitlab 秘钥的时候,有选项如何控制权限,当时选择的就是 read_user
,两边保持一致即可。
如果需要同步 Gitlab 与 sonarQube 的 group,需要将 scope 调整为 api
.
Server base URL
这个配置非常重要,在 sonarQube
的 配置 -> 通用配置 -> 通用
选项卡下,有一项用于设置基本域名。
这个选项默认为空,在 Gitlab 插件的最开始,有个 Authentication
提示,第二条就是说的这个参数。
sonar.core.serverBaseURL
参数值就是复制 sonarQube 浏览器中的域名地址了。
验证效果
退出已经登录的 sonarQube 账号,点击登录可以看到如下页面:
点击登录,会出现提示是否授权,授权以后就可以登录了。
看到图示中的蓝色字,就是在 Gitlab 配置时,设置的名称。
问题汇总
在集成过程中出现了不少问题,现在汇总如下:
The redirect URI included is not valid.
如果Gitlab 授权以后出现如下提示,可以先将浏览器中地址复制到记事本,看一下里面的各种链接是否正确。
http://gitlab.yourdomain.com/oauth/authorize?
client_id=6aa41a2an412dada52fca7cdd50c00a5678ec0fc42678407ac3824bb3152f6d
&redirect_uri=http%3A%2F%2Fsonar.yourdomain.com%2F
oauth2%2Fcallback%2Fgitlab&response_type=code&scope=read_user
最开始,我的 redirect_uri
里面是 localhost:9000 ,实际就是 sonar.core.serverBaseURL
没有配置。
还有要说的是,gitlab 获取秘钥和应用 ID 那里,填的是 sonarQube 的域名,当时 callback URI
填错了,一直报这个错,找了很久原因。
无权访问此页,请联系管理员
You’re not authorized to access this page. Please contact the administrator.
在试验过程中,我开启了一个配置:
用来同步 Gitlab 和 sonarQube 的用户,但是我配置gitlab应用的 gitlab 账号级别太低,不能获取用户信息,导致每次登陆都报错——无权访问此页,请联系管理员。最后在 sonarQube 日志里发现了错误信息,使用 gitlab 管理员获取的秘钥和应用 ID。
是寻找答案的时候,我发现还有一种可能——sonarQube 没有配置 HTTPS。如果出现类似问题,可以尝试自签发一个证书解决。(我现在使用的 sonarQube 没有开启 HTTPS,没有出现此问题)
最后一个不是问题的问题
由于我使用的 sonarQube 版本是 7.9.x,如果你使用的 sonarQube 版本是 8.x 以上,可能会少许不同。因为 sonarQube 商业化进程中,将以前很多通过插件形式支持的功能都去掉了,移入了企业版中。
大部分情况下,可以在 sonarQube 的日志信息中找到蛛丝马迹,千万不要忽略日志里的重要报错信息。