Gradle 设置 Nexus 用户名密码

直接在 Gradle 中明文写上用户名、密码不仅会涉及安全性问题,更为 Git 的管理带来诸多不便。

有一个变通的方法如下:

新建一个 Gradle 属性文件~/.gradle/gradle.properties,可以把用户名、密码以变量的形式存入文本:

NEXUS_USER=yourname
NEXUS_PASSWORD=yourpassword

接着在 Gradle 文件中即可引用上述变量了:

allprojects {
    repositories {
        //jcenter()
        maven {
            url "http://ip:port/repository/some-central/"
            credentials {
                username = "${NEXUS_USER}"
                password = "${NEXUS_PASSWORD}"
            }
        }
    }
uploadArchives {
    configuration = configurations.archives
    repositories {
        mavenDeployer {
            repository(url: "http://ip:port/repository/some-central/") {
                authentication(userName: NEXUS_USER, password: NEXUS_PASSWORD)
            }
            pom.project {
                version '2.3.0'
                artifactId 'ad'
                groupId 'com.something'
                packaging 'jar'
                description 'A Common Java Library'
            }
        }
    }

Jenkins 与 Gerrit REST API认证

Alt none

这里的 Password 是需要再 Gerrit UI 上生成的:

Alt none

Gerrit 插件编译

下述方法适合 Gerrit stable-2.13

  • 下载 Gerrit 源码

  • 安装 Gerrit 编译工具

    • Bazel
    • Maven
  • 下载插件

    将插件的源码放入 Gerrit 源码的 plugins 目录下

    需要注意的是,插件的版本要和 Gerrit 源码的版本匹配,建议 check 相应的 tag

  • 编译插件

    cd gerrit
    bazel build plugins/<plugin-name>
    
  • 提取编译后的插件

    通常编译后的插件被放在buck-out/gen/plugins/<plugin-name>/<plugin-name>.jar

    当然你也可以直接使用find命令搜索出来

  • Gerrit 服务器部署

    将编译后的插件拷贝到 Gerrit 服务器的 plugins 目录,最后重启 Gerrit 服务

开始使用 Repo 工作

开始使用 repo 工作

  • 建立顶层工作目录

    mkdir myproject
    cd myproject
    
  • 签出所有库代码

    repo init -u    ssh://[email protected]:port/myProjectManifest  -b develop --repo-url  https://github.com/xlncz/mirror-git-repo.git
    
    repo sync
    

    其中 -b develop为签出代码仓库中的develop 分支。需要重点注意的是,虽然这里是签出develop分支,但是并不意味着从所有远程仓库中签出的都是develop分支,需要通过查看 repo manifests 库中的配置文件才能确认具体对应远程仓库的分支。比如,你可以通过下述命令打开 repo manifests.xml 文件

    vi .repo/manifest.xml
    

    可能的输出如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <manifest>
        <remote name="origin"
            fetch=".."
            review="http://ip:port/" />
          
        <default revision="develop" remote="origin" sync-s="true" sync-j="4" sync-c="false" />
    
        <project path="Project/extra/myproject" name="myproject"  />
        <project path="Project/extra/android-ndk-profiler" name="android-ndk-profiler.git" revision="master"/>
    </manifest>
    

    关注project节,如果不带有revision字段,那么会使用default节中的配置,上述输出的含义为:

    1. 对 myproject 项目,签出的是远程仓库中的 develop 分支
    2. 对 andorid-ndk-profiler 项目,签出的是远程仓库中的 master 分支

    之所以会出现上述现象,是因为,myproject 是我们的开发项目,会涉及频繁的功能开发和提交,采用多分支管理;而 android-ndk-profiler 是一个被我们项目应用的第三方项目,很少会有变动,并不需要多分支。

  • 开始工作
    repo start develop --all
    

    其中 develop为你的本地工作分支,建议和上述-b develop中的分支名相同,这样可以方便了解自己目前的工作分支

    —all选项的意思是将所有的库切换到develop分支,但是这个仅仅是切换了你本地工作分支。并不意味着对应相应的远程分支,这点需要特别注意。

    那么如何确定你本地分支与远程分支的对应关系呢?很简单,跟普通 git 库的操作一样,查看库配置中的 config 文件即可

  • 在 repo 中切换分支

    如果你执行了repo start master --all那么你当前工作在 master 分支上。你可以像使用普通 git 库一样对单一库进行git checkout branch操作,但一定注意当你打算提交代码时需要认真查看是否会上传到正确的远程仓库,参阅下面 一些注意事项 章节。

    通过 repo 切换分支:

    repo init -b develop
    repo start develop --all
    repo branch
    

    此后你将工作在 develop 分支上,可以通过查看.repo/manifest.xml来确认。同时你也可以如普通 git 库一样查看 config 文件中的 brnach 配置来确认。

  • 代码提交

    进入你需要修改的代码目录中,同普通 git 一样执行git add git commit,但是你不再需要执行git push ,你需要使用 repo upload来提交代码,需要参阅 一些注意事项 章节。

一些注意事项

  • 在使用repo upload提交代码时,需要认真检查输出,比如下面:

    branch master ( 1 commit, Wed Oct 11 18:13:21 2017 +0800) to remote branch master:
    

    提示将把你本地 master 分支上的变动提交到远程的 master 分支;有时候可能会出现下面的提示

    branch master ( 1 commit, Wed Oct 11 18:13:21 2017 +0800) to remote branch develop:
    

    提示将把你本地 master 分支上的变动提交到远程的 develop 分支,这里可能已经出错了,你需要认真检查你的库配置。

    当把代码提交后,repo 会自动 push 到 gerrit 平台,此时你应该进入 gerrit 界面,认真检查ProjectBranch两列的内容,是否符合你的预期。

使用Repo管理代码库依赖

至于为什么不用git submodule 来管理代码库依赖,主要还是因为git submodule的坑太多了,需要对 git 有足够的经验还能驾驭好。各位可以参考如下文章:

创建 Repo 项目

git submodule 使用指南

理解 Git 子模块

git submodule 的坑

Why your company shouldn’t use Git submodules

所以我们决定使用 Repo 来管理代码库依赖

  • 安装 Repo

    brew install repo
    
  • 创建 Repo 项目

    Repo 项目是基于 Manifest 文件的,一般会为 Manifest 建立一个独立的 Git 仓库,在这个仓库中保持一个命名为default.xml 的项目描述文件,这个文件名是固定的。

  • 编写项目描述文件

    一个简单的default.xml文件内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <manifest>
        <remote name="origin"
            fetch=".."
            review="http://ip:port/" />
        <default revision="master" remote="origin" sync-j="4" />
        <project path="proj1" name="proj1.git" />
        <project path="proj2" name="proj2.git" />
    </manifest>
    
  • 对 Manifest 的管理

    对 Manifest 的管理与 gitosis 很类似,repo 库中出了包含项目 git 库外,同时包含了项目管理 git 库(名称固定为 manifests,位于 .repo 目录中),就是前面我们存放default.xml的那个独立库。当需要修改 Repo 项目配置的时候,可以进入到这个 git 库中,接着如操作一个普通的 git 库一样修改、提交。

    .repo 目录结构大概是这样子的:

    .repo_fetchtimes.json
    manifest.xml -> manifests/default.xml
    manifests
    manifests.git
    project-objects
    project.list
    projects
    repo
    

    如果你能具体看一下各文件夹内容的,就会发现,里面包含了所有项目的裸库和项目列表。

  • 关于repo init -b

可以使用 repo init -b [branch]来拉取不同的分支,这是如何做到的呢?

只需在manifests管理仓库中建立相应的branch`即可,比如,我们在manifests仓库中建立一个develop分支,并且配置了不同的default.xml文件。接着就可以使用repo init -b develop``来签出相应的 repo 分支了。

与Gerrit 集成

Gerrit Code Review

使用Repo工作

  • 拉取项目

    mkdir folder
    cd folder
    repo init -u  ssh://[email protected]:port/ProjectManifest.git  --repo-url https://github.com/xlncz/mirror-git-repo.git
    

    注意上述命令中的 —repo-url 是一个我搭建在 github 上的的 google 镜像库,否则会直接向 GOOGLE 请求更新 Repo 工具。

    其他备用的镜像库:https://code.csdn.net/kangear/git-repo.git

  • 建立分支

    repo start master —all
    

    master 为分支名,根据需要可建立不同的分支名

  • 查看当前分支

    repo branch
    

    可能的输出:

    *  master                    | in all projects
    
  • 帮助文档

    在使用过程中可随时调出某个命令的帮助文档:

    repo help upload
    

    更多关于 Repo 命令的使用可以查阅 这里