参考链接:

背景:

已经搭建Nexus3.6.0,需要迁移原有 两个 nexus2上的jar包 到nexus3统一管理。

分析:

  • Nexus2.x 服务器直接存储jar包
  • Nexus3.x 服务器存储的是二进制文件
  • 所以不能通过 copy原Nexus2.x服务器上的 repositories目录 到nexus3.X,刷新index方式来迁移。

迁移导入方法:

  1. 官方Upgrading
    具体实施可以参考上一篇blog。
    这种方法有两个小问题:
    - 需要原nexus版本为2.14.x版本
    - 每个nexus2导入都会在nexus3上面都会创建一个仓库,不适合有多个nexus2统一迁移到一个nexus3

  2. mvn deploy命令上传
    如果原nexus2待迁移的jar包并不多,可以使用这种方式。
    1. 只上传jar,自动生成pom.xml (独立jar,pom不需要依赖其它)
    mvn deploy:deploy-file -DgroupId=$groupId -DartifactId=$artifactId -Dversion=$version -Dpackaging=jar -DrepositoryId=nexus -Durl=http://$ip:8081/repository/$repository_name -Dfile=$path/XX.jar

    2. 上传jar 和 pom.xml (pom里面有依赖)
    mvn deploy:deploy-file -DgroupId=$groupId -DartifactId=$artifactId -Dversion=$version -DgeneratePom=false -Dpackaging=jar -DrepositoryId=nexus -Durl=http://$ip:8081/repository/$repository_name -DpomFile=$path/pom.xml -Dfile=$path/XX.jar
    需要注意:
    - 命令里面-DrepositoryId=nexus对应的是本机mvn settings.xml文件配置
    - 写脚本封装上面命令实现批量迁移

  3. http协议上传
    直接使用http put 文件到/repository/$repo-id/$path-of-file
    curl -v -u admin:admin123 –upload-file pom.xml http://$ip:8081/repository/maven-releases/org/foo/1.0/foo-1.0.pom
    我们需要上传的文件:jar和pom.xml

    创建 mavenimport.sh 脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

# Get command line params
while getopts ":r:u:p:" opt; do
case $opt in
r) REPO_URL="$OPTARG"
;;
u) USERNAME="$OPTARG"
;;
p) PASSWORD="$OPTARG"
;;
esac
done

find . -type f -not -path '*/\.*' -not -path '*/\^archetype\-catalog\.xml*' -not -path '*/\^maven\-metadata\-local*\.xml' -not -path '*/\^maven\-metadata\-deployment*\.xml' -exec curl -u $USERNAME:$PASSWORD -X PUT -v -T {} $REPO_URL{} \;
登陆到Nexus2.x服务器执行
    cd $releases_dir
    cp $path/mavenimport.sh .
    sh mavenimport.sh -u admin -p admin123 -r http://$ip:8081/repository/$release_repository_name

    cd $snapshots_dir
    cp $path/mavenimport.sh .
    sh mavenimport.sh -u admin -p admin123 -r http://$ip:8081/repository/$snapshots_repository_name

需要注意:
    - 上面命令里面 -u admin -p admin123 请更换成nexus管理员帐户密码 (nexus默认管理员/密码 admin/admin123)
    - 上面命令里面 $releases_dir 是指Nexus2.x服务器上存储releases仓库路径。
    - 上面命令里面 $snapshots_dir 是指Nexus2.x服务器上存储snapshots仓库路径。
    - 如果不切换到上面目录里面,那么上传的jar包 group_id会有问题。

Comment and share

背景:

公司主要使用git作为代码管理仓库,现需要把部分使用svn管理的代码迁移到git。

需求:

需要保留所有 branches、主干、tags的历史记录。

迁移方法:

使用git官方提供的git svn命令

系统环境:

  • OS: macOS 10.13.3
  • SVN:1.9.4
  • GIT:2.16.2

迁移步骤:

  1. 获取指定svn代码库涉及的开发同学名单并转换:
    svn log $SVN_URL –xml | grep author | sort -u | perl -pe ‘s/.>(.?)<.*/$1 = /‘ > user.txt

user.txt内容如下:
dev1_name =
dev2_name =
因为svn只有用户名,而git需要提供用户名和邮箱,所以我们需要做下用户转换。
修改上述命令得到的user.txt如下:
dev1_name = dev1_name
dev2_name = dev2_name
2. 使用git svn cloned代码库到本地:
git svn clone $SVN_URL –no-metadata –authors-file=user.txt -s
3. 调整本地库目录结构:
cd $project_dir
mv .git/refs/remotes/origin/tags/$tags_name .git/refs/tags/
mv .git/refs/remotes/origin/$branches_name .git/refs/heads/
rm -rf .git/refs/remotes/origin
4. 上传本地库到remote仓库:
git remote add origin $GIT_URL
git push origin –all
git push origin –tags

PS:

  1. 如果svn历史记录太多,而且并不需要很久之前的版本的话,可以选择从指定版本进行转换。
    git svn clone $SVN_URL -r $指定版本:HEAD
  2. 较新版本的git都原生带了 git svn命令,如果你使用的git版本没有此命令,建议升级新版git或者单独安装git-svn命令。
  3. git clone命令执行时间主要和 原SVN库大小、log多少有关。
  4. svn迁移git后需要注意git不支持空目录,需要使用在空目录增加隐藏文件来上传,通常使用.gitkeep文件。
  5. 如果原SVN库结构不是规范的branches、tags、trunk结构
    git svn clone $SVN_URL –branches= –tags= –trunk=
    如果没有tags的话–tags可以不写,branches同理;subdir写相对路径即可
    上面使用的-s参数表示的是–stdlayout适合标准结构的SVN项目。

Comment and share

背景

公司拆分子公司,需要把现有Gitlab也分离出来。

搭建环境:

  • centos6.5
  • gitlab8.8.5

搭建方法:

  • Omnibus package installation

遇到问题:

安装完成,执行 #gitlab-ctl reconfigure 报错如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[execute] /opt/gitlab/embedded/bin/psql: symbol lookup error: /opt/gitlab/embedded/bin/psql: undefined symbol: PQconnectdbParams
[execute] /opt/gitlab/embedded/bin/psql: symbol lookup error: /opt/gitlab/embedded/bin/psql: undefined symbol: PQconnectdbParams

================================================================================
Error executing action `run` on resource 'execute[create gitlab database user]'
================================================================================

Mixlib::ShellOut::ShellCommandFailed
------------------------------------
Expected process to exit with [0], but received '127'
---- Begin output of /opt/gitlab/embedded/bin/psql --port 5432 -h /var/opt/gitlab/postgresql -d template1 -c "CREATE USER gitlab" ----
STDOUT:
STDERR: /opt/gitlab/embedded/bin/psql: symbol lookup error: /opt/gitlab/embedded/bin/psql: undefined symbol: PQconnectdbParams
---- End output of /opt/gitlab/embedded/bin/psql --port 5432 -h /var/opt/gitlab/postgresql -d template1 -c "CREATE USER gitlab" ----
Ran /opt/gitlab/embedded/bin/psql --port 5432 -h /var/opt/gitlab/postgresql -d template1 -c "CREATE USER gitlab" returned 127

问题分析:

因为我的centos服务器上面已经装了postgresql的8.4.18版本;

1
2
3
4
[root@gitlab0 ~]# rpm -qa|grep postgres
postgresql-8.4.18-1.el6_4.x86_64
postgresql-devel-8.4.18-1.el6_4.x86_64
postgresql-libs-8.4.18-1.el6_4.x86_64

使用/opt/gitlab/embedded/bin/psql的时候找不到对应的库(/opt/gitlab/embedded/lib/postgresql)。

解决方法1:

卸载postgresql-8.4.18,卸载gitlab,然后重新安装gitlab。

卸载gitlab方法如下:

1
2
3
4
sudo gitlab-ctl stop
sudo gitlab-ctl uninstall
sudo gitlab-ctl cleanse
sudo rm -rf /opt/gitlab

解决方法2:

增加gitlab带的psql所需lib路径到系统LD_LIBRARY_PATH

1
2
3
4
5
6
7
8
9
# vi /etc/profile

export LD_LIBRARY_PATH=/opt/gitlab/embedded/lib:/tmp/product.......

# source /etc/profile

# echo $LD_LIBRARY_PATH

/opt/gitlab/embedded/lib:/tmp/product.......

PS:

  1. 增加/opt/gitlab/embedded/lib路径到$LD_LIBRARY_PATH最前面,因为是按顺序加载路径,所以如果加到最后面还是不能成功。
  2. 路径之间使用:分隔

然后再执行#gitlab-ctl reconfigure,即可成功。

1
gitlab Reconfigured!

查看postgresql版本:

1
2
3
4
[root@gitlab0 ~]# /opt/gitlab/embedded/bin/psql --version
psql (PostgreSQL) 9.2.16
[root@gitlab0 ~]# psql --version
psql (PostgreSQL) 8.4.18

参考链接:

http://dreamlikes.cn/archives/78

Comment and share

背景:

dev准备更新某个基础数据库表结构,为了评估影响范围和后续通知协作,需要找出使用此表的代码库。

思路:

  1. 查询数据库的连接IP,根据IP查询部署在上面的服务,根据服务找对应代码库。
    • 难点:
      • 并不是所有服务都会实时连接数据库,可能会漏掉;
      • 服务器上面部署的服务太多,还需要再做过滤。
    • 综上,这个思路否定。
  2. 直接通过关键字查询代码库源码来定位。
    • 难点:
      • 需要拥有大范围的代码库权限
      • 多目录文件查询涉及关键字文件
    • 解决方案:
      • 作为公司SCM权限不是问题
      • 使用OpenGrok来做关键字查询

参考链接:

实施步骤:

  1. 搭建OpenGrok:
    • 安装jdk-1.8
    • 安装tomcat-8
    • 安装Exuberant Ctags 下载地址
      1
      2
      3
      4
      5
      $ tar zxvf ctags-5.8.tar.gz
      $ cd ctags-5.8/
      $ ./configure
      $ make
      $ make install
    • 安装opengrok 下载地址 | 安装使用wiki
      1
      2
      3
      $ tar zxvf opengrok-1.1-rc16.tar.gz
      $ cd opengrok-1.1-rc16/bin/
      $ OPENGROK_TOMCAT_BASE=/path/to/my/tomcat/install ./OpenGrok deploy
  2. 下载代码
    • 创建一个公共代码库存放目录:
      1
      2
      $ mkdir -p /root/wwl/code/svn
      $ mkdir -p /root/wwl/code/git
    • 根据需要下载svn代码:
      1
      2
      $ cd /root/wwl/code/svn
      $ svn checkout svn_urls
    • 根据需要下载git代码:
      1
      2
      $ cd /root/wwl/code/git
      $ git clone git_urls
    • PS:如果要想查询所有分支代码
      • svn:直接checkout 包含branches目录url即可;
      • git:需要clone多次git_url到不同目录,然后cd到各自目录执行git checkout branch_name;
      • 建议只下载master/trunk和最新dev分支即可。
  3. 加载OpenGrok索引
    1
    2
    3
    $ ./OpenGrok index <absolute_path_to_your_SRC_ROOT>
    例如:
    ./OpenGrok index /root/wwl/code
    PS:如果代码文件很多的话,加载索引会很久。晚上执行第二天来看结果吧。
  4. 关键字查询
    • web端登陆:
      1
      <HOST>:<PORT>/source
    • 执行查询:
      logo

PS:

  1. OpenGrok还支持文件类型查询过滤等功能,各位可以自行尝试使用;
  2. 除了数据库表查询以外,常见的还有api调用查询;
  3. 这种方案是后置的,如果能在系统设计之初和迭代过程积极维护开发文档,形成系统整体调度架构图形的话,会另我们开发更加自信;
  4. 借此机会推动开发团队规范开发文档和产出系统调度架构图形。

Comment and share

背景:

公司之前使用nexus2.13.0版本的nexus,管理毕竟混乱。现搭建nexus3.6.0版本进行规范统一管理。

上篇记录nexus3搭建配置过程,本篇记录迁移nexus2.13.0版本库到nexus3.6.0版本过程。

迁移思路方法:

迁移范围:

仓库 类型 是否迁移
proxy 代理远端仓库 已经在nexus3.6.0版本配置增加,不需要迁移
hosted-3rd 本地内部仓库-第三方 之前没有使用,不需要迁移
hosted-Snapshots 本地内部仓库-快照版本 之前使用比较混乱沟通确认舍弃,不需要迁移
hosted-Releases 本地内部仓库-稳定版本 需要迁移

迁移方法:

如果原有hosted-Releases存放的jar包不多的话,可以考虑下载所有jar到本地,然后使用命令deploy到nexus3.6.0。

现状是原有库里面的jar包很多,groupId很多而且比较不规范(目录层级很复杂)。

参考链接:

升级方法:官方文档

根据官方升级文档说明nexus2.14.1(或者之后版本)才能直升nexus3.x。因为原有nexus版本为2.13.0,所有需要先升级到2.14.x后,再迁移到nexus3.6.0版本。

升级路径为:
nexus2.x – nexus2.14.x – nexus3.x

迁移步骤:

  1. 搭建nexus2.14.5
    • 官网下载 All platforms - Nexus Repository Manager OSS 2.x - bundle.zip
    • 解压缩、安装运行
    • ps:windows遇到的坑,需要使用管理员权限进行cmd安装
      logo
      logo
      logo
  2. 迁移原有nexus2.13.0仓库到nexus2.14.5
    • 仓库存放目录:sonatype-work\nexus\storage
    • 拷贝原nexus2.13.0的sonatype-work\nexus\storage\releases目录下的依赖文件
    • 覆盖nexus2.14.5的releases目录文件
    • 重启nexus2.14.5并刷新索引
      logo
      logo
      logo
  3. 迁移nexus2.14.5仓库到nexus3.6.0
    • 在nexus2.14.5上面配置Upgrade Agent
      logo
      logo
    • 在nexus3.6.0上面执行Upgrade
      logo
      logo
      logo
      logo
      logo
      logo
      logo
      logo
      logo
      logo

后续

使用这种方法,原有的release仓库迁移成功。
logo

但是同时原有nexus的Privileges、Roles、Users也会过来,需要后续进行调整。

当然此方法也可以用来全量升级nexus2.x到nexus3.x。

Comment and share

Nexus3搭建配置

in SCM

参考链接:

PS:

  • nexus分为nexus-repository-oss(免费版)和nexus-repository-pro(商业版)
  • 主要使用版本:2.x和3.x
  • 版本区别:官方文档

JAVA项目依赖管理方法:

  1. 所有依赖jar包都上传提交到代码库里面:
    • 优点:直接获取代码库代码就可以进行编译打包,不需要依赖外部网络(独立个人小项目)
    • 缺点:
      • 依赖包体积很大,导致代码获取推送太耗时和占用带宽;
      • 基础框架依赖包每个代码库都要存放一份(空间浪费);
      • 当前依赖包版本不明确。
  2. 依赖包编译过程中下载,不上传到代码库:
    • 优点:
      • 代码库干净,体积小;
      • 项目显性配置依赖包版本和引用阶段清晰明了。

私服的优点:

  1. 统一服务器代理外部依赖(节省外网带宽);
  2. 项目下载依赖通过内部网络的进行(更快);
  3. 托管内部项目依赖(协作更方便);
  4. 托管第三方依赖(例如:合作伙伴的依赖包)
    logo

搭建环境版本:

  • OS: Windows Server 2012 R2
  • JDK: 1.8.0_71
  • nexus-repository-oss 3.6.0-02

搭建步骤:

  1. 安装JDK
  2. 官网下载:nexus-3.6.0-02-win64.zip,解压缩
  3. 配置windows服务:官方文档
    1
    $install-dir/bin/nexus.exe /install <optional-service-name>
  4. 启动服务:
    1
    nexus.exe /start <optional-service-name>
  5. 网页端登陆配置Nexus
    • http://$ip:8081
    • 用户名/密码:admin/admin123

后台配置:

  1. data目录修改
    1
    2
    3
    4
    5
    $install-dir/bin/nexus.vmoptions

    -Dkaraf.data=../sonatype-work/nexus3
    -Djava.io.tmpdir=../sonatype-work/nexus3/tmp
    -XX:LogFile=../sonatype-work/nexus3/log/jvm.log
  2. 服务端口号修改:
    1
    2
    3
    4
    $data-dir/etc/nexus.properties

    # Jetty section
    application-port=8081
  3. jvm性能调优:
    1
    2
    3
    4
    5
    $install-dir/bin/nexus.vmoptions

    -Xms4G
    -Xmx4G
    -XX:MaxDirectMemorySize=4014M
    以上修改都需要重启服务生效。

前台配置:

使用管理员admin账号登陆

配置邮箱

logo

配置LDAP

logo
logo
logo

配置权限

logo
logo
logo

配置repositories

repositories分为三个种类:

  1. proxy 代理远端仓库
  2. hosted 本地内部仓库
  3. group 组合仓库
    logo

Maven依赖私服配置

修改~/.m2/settings.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<settings>
<servers>
<server>
<id>nexus</id>
<username>用户名</username>
<password>密码</password>
</server>
</servers>
<mirrors>
<mirror>
<!--This sends everything else to /public -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://$ip:8081/repository/maven-public/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>nexus</id>
<!--Enable snapshots for the built in central repo to direct -->
<!--all requests to nexus via the mirror -->
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<!--make the profile active all the time -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>

内部项目上传jar包:

修改项目pom.xml文件增加

1
2
3
4
5
6
7
8
9
10
11
12
<distributionManagement>
<repository>
<id>nexus</id>
<name>Releases</name>
<url>http://$ip:8081/repository/maven-releases</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>Snapshot</name>
<url>http://$ip:8081/repository/maven-snapshots</url>
</snapshotRepository>
</distributionManagement>

然后执行:

1
mvn clean deploy

上传第三方jar包:

nexus3不能使用web端来上传第三方jar包,只能使用命令行:

1
2
mvn deploy:deploy-file -DgroupId=$groupId -DartifactId=$artifactId -Dversion=$version -Dpackaging=jar -Dfile=$path/XX.jar -Durl=http://$ip:8081/repository/$hosted_3rd/ -DrepositoryId=nexus

Comment and share

背景:

Dev已经习惯使用Sonarqube进行静态代码扫描,现准备进行阶段审计看下使用效果怎么样。

PS:
1. Sonarqube根据Key来唯一标示项目。
2. Resolution 里面的False Positive(误报)和 Won’t fix(暂不处理)会自动继承:
- 如果一个问题本次标记为False Positive 或者 Won’t fix
- 以后此项目进行分析时此问题自动标记。
- 其他项目(Key不同)还是会报此问题。
logo
logo

思路:

Dev正常进行开发过程的静态代码扫描,SCM对项目主干(master)代码进行轮询静态代码扫描。
1. 主干代码静态代码扫描时Project Key增加统一标志来区分Dev开发过程扫描:
- 例如:修改maven pom文件 artifactId增加 master/admin/scm 后缀
2. 更新Dev开发过程项目标记规则到主干。

同步不同项目标记规则:

  1. 安装Issue resolver插件:
    • Export and import resolved issues (false-positive and won’t fix) from SonarQube projects.
  2. 更新dev项目标记规则到主干项目:
    - web端操作方法:
    logo
    logo

Comment and share

参考链接:

系统环境:

  • Gradle: 2.10
  • Sonarqube: 6.3.1

背景:

1
2
3
公司使用java语言开发Android项目,使用Gradle作为构建工具。
默认的Sonarway java规则也可以进行静态代码扫描。
希望增加业界常用的Android lint规则进行扫描,本文记录配置使用方法。

Sonarqube 安装 Android lint插件

logo
点击Quality Profiles查看Android Lint规则
logo


Sonarqube 配置Android项目扫描规则

我们配置一个新的Quality Profiles/java用于Android项目扫描。

新规则 包含Java Sonar way的Bugs、Vulnerabilities 和 Android Lint的Code Smells
logo
logo
logo
logo
logo
logo
logo


本地配置使用

  • 配置系统gradle.properties增加下面内容 (~/.gradle/gradle.properties)
1
2
3
systemProp.sonar.host.url=http://ip:9000
#----- Security (when 'sonar.forceAuthentication' is set to 'true')
systemProp.sonar.login=个人token
  • 修改项目build.gradle 相应位置增加下面配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apply plugin: "org.sonarqube"
buildscript {
repositories {
maven{url "https://plugins.gradle.org/m2/"}
}
dependencies {
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.5"
}
}
sonarqube {
androidVariant 'fullDebug'
properties {
property "sonar.projectName", "项目名称"
property "sonar.projectKey", "项目Key"
property "sonar.projectDescription", "项目描述"
property "sonar.projectVersion", "项目版本"
property "sonar.profile", "Android(上面新建的profile名称)"
property "sonar.android.lint.report", "./build/outputs/lint-results-debug.xml"
}
}
  • 执行gradle lintDebug 生成lint-results-debug.xml

  • 执行gradle Sonarqube 构建、分析、上传

Comment and share

Analyzing Source Code

参考链接:官方文档

本文只涉及maven和sonar-scanner方式,其它请参考上面链接。

Maven

适合Maven项目

  1. 在sonarqube平台上面个人账户生成token。
  2. 在本机的mvn配置settings.xml 增加下面配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <profile>
    <id>sonar</id>
    <activation>
    <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
    <sonar.host.url>http://ip:9000</sonar.host.url>
    <sonar.login>第一步生成的token值</sonar.login>
    </properties>
    </profile>
  3. 代码库执行打包:mvn clean install
  4. 代码库进行分析并上传sonarqube平台:mvn sonar:sonar

PS:

1
2
3
4
5
6
7
8
9
10
11
12
如果代码库pom文件配置如下
<groupId>ggg</groupId>
<artifactId>aaa</artifactId>
<version>1.0.0</version>
<name>nnn</name>
那么分析上传到sonarqube平台:
对应的项目key为ggg:aaa
对应的项目名称为nnn
对应的版本为:1.0.0
注意
   不要找错项目了。
   同一个key指向的项目永远显示的是最新的一次代码分析结果。

Sonar-scanner

适合所有项目

  1. 下载Sonar-scanner,设置环境变量,配置/conf/sonar-scanner.properties
    1
    2
    3
    4
    5
    6
    7
    #Configure here general information about the environment, such as SonarQube DB details for example
    #No information about specific project should appear here
    #----- Default SonarQube server
    sonar.host.url=http://ip:9000
    #----- Default source code encoding
    sonar.sourceEncoding=UTF-8
    sonar.login=个人账户生成的token
  2. 在项目根目录增加sonar-project.properties,内容如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # must be unique in a given SonarQube instance
    sonar.projectKey=ggg:aaa #对应的项目key为ggg:aaa
    # this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
    sonar.projectName=nnn #对应的项目名称为nnn
    sonar.projectVersion=1.0.0 #对应的版本为:1.0.0
    # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
    # This property is optional if sonar.modules is set.
    sonar.sources=.
    sonar.java.binaries=target/classes #配置为项目具体的class目录,如果不配置的话只进行源代码分析
    # Encoding of the source code. Default is default system encoding
    #sonar.sourceEncoding=UTF-8
  3. 执行扫描分析:
    Build(可以不执行构建)
    sonar-scanner

API

点击:http://ip:9000/web_api/ ,查看Sonarqube支持的web_api。

以Python2.7 为例简单介绍api使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import requests

s = requests.session()
user_info = {'login': 'username', 'password': 'pass'}
api_url = 'http://ip:9000/api'
# 登录
res_login = s.post(
'%s/authentication/login' % api_url, data=user_info)
# 获取指定项目未解决Bugs详情
res_bugs = s.get(
'%s/issues/search' % api_url, params={'componentKeys': 'ggg:aaa', 'types': 'BUG', 'resolved': 'false', 'ps': 500})
# 解析结果获取未解决bugs总数
total_bugs = res_bugs.json()[u'paging'][u'total']
# 获取指定项目新增未解决Bugs详情
res_new_bugs = s.get(
'%s/issues/search' % api_url, params={'componentKeys': 'ggg:aaa', 'types': 'BUG', 'resolved': 'false', 'ps': 500, 'sinceLeakPeriod': 'true'})
# 解析结果获取新增bugs总数
new_bugs = res_new_bugs.json()[u'paging'][u'total']
# 登出
res_logout = s.post(
'%s/authentication/logout' % api_url)

Comment and share

关联LDAP:

登录Sonarqube服务器,修改安装目录下的conf\sonar.properties文件。

1
2
3
4
5
6
7
8
9
10
11
12
# LDAP configuration
# General Configuration
sonar.security.realm=LDAP
ldap.url=ldap://ip:389
ldap.bindDn=cn=Manager,dc=xxx,dc=xxx,dc=xxx
ldap.bindPassword=xxx

# User Configuration
ldap.user.baseDn=ou=People,dc=xxx,dc=xxx,dc=xxx
ldap.user.request=(&(objectClass=inetOrgPerson)(uid={0}))
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=mail

然后重启Sonarqube服务,即可使用LDAP账户进行登录。


下面配置涉及下图:
logo

插件:

  • 参考链接:官方文档
  • 插件安装、更新有两种方法:
    1. 手动下载后,上传到Sonarqube服务器安装目录下的\extensions\plugins,然后重启Sonarqube服务。
    2. 管理员账户登录Sonarqube,点击Administration - System - Update Center,进行安装or更新插件。(推荐!)

配置邮件发送:

  1. 使用管理员账户登录Sonarqube,
  2. 点击:Administration - General Settings
  3. 找到Email配置区域,涉及以下几个SMTP配置:
    1
    2
    3
    4
    5
    6
    7
    8
    # 下面以QQ邮箱为例
    SMTP port 465
    SMTP host smtp.exmail.qq.com
    From address xxx@qq.com
    Email prefix [SONARQUBE]
    Secure connection ssl
    SMTP password 对应上面账户的密码
    SMTP username xxx@qq.com

权限相关:

因为Sonarqube是为了发现代码问题,所以会在结果中展示源代码。为了代码安全,需要对权限进行配置。

Force user authentication

1
2
3
使用管理员账户登录Sonarqube,点击Administration - General Settings - security
Force user authentication ☑️ 强制必须登录后才能使用
Default user group sonar-users 默认新用户所在组

Users

1
2
3
4
使用管理员账户登录Sonarqube,点击Administration - Security - Users
此页面可以创建、修改、删除用户。
此页面还可以调整用户所在组信息。
如果是关联了LDAP,那么用户只有先使用LDAP账户登录后,才能在此查看到。

Groups

1
2
3
4
5
6
使用管理员账户登录Sonarqube,点击Administration - Security - Groups
此页面可以创建、删除组。
此页面还可以调整组用户。
默认存在下面2个组:
sonar-administrators
sonar-users

Global Permissions

1
2
3
4
5
6
7
使用管理员账户登录Sonarqube,点击Administration - Security - Global Permissions
此页面配置组用户的全局权限:
Administer System 系统管理员 sonar-administrators
Administer Quality Profiles 可以配置Quality Profiles sonar-administrators
Administer Quality Gates 可以配置Quality Gates sonar-administrators
Execute Analysis 可以执行代码库分析 sonar-users 或者 创建的组
Create Projects 可以上传新代码库分析 sonar-users 或者 创建的组

Permission Templates

1
2
3
4
5
6
7
8
使用管理员账户登录Sonarqube,点击Administration - Security - Permission Templates
此页面配置项目模版权限。
此页面还可以设置默认模版(新项目自动设置为默认模版权限)。
Browse 查看项目状态
See Source Code 查看项目源代码
Administer Issues 对此项目的问题进行判断、评论、更改状态
Administer 项目管理员
Execute Analysis 执行代码库分析

Project PermissionsGrant

配置项目权限,有下面两种方法:

  1. 只需要项目管理员权限即可
    1
    2
    3
    点击项目界面 - Administration - Permissions
    可以增加、删除、更新组or个人对此项目权限
    可以使用权限模版对此项目进行赋权
  2. 需要系统管理员权限
    1
    2
    3
    使用管理员账户登录Sonarqube,点击Administration - Projects - Management
    此界面展示所有项目,找到需要修改项目后。
    点击最右边的Actions,进行权限修改or使用权限模版进行权限更新。

规则配置:

配置扫描使用的规则
logo

Comment and share

Author's picture

Weilong

    Write something about work-life:

PM


Shenzhen