zoukankan      html  css  js  c++  java
  • gitlab+gerrit+jenkins代码托管、审核、持续集成架构搭建

     

    整体的架构设想图是这样的

    首先声明一下:搭建架构时我的IP分配与端口

    节点1:gitlab  192.168.0.177    

    节点2:gerrit   http:192.168.0.179:9999         

         jenkins  http://192.168.0.179:8180

    如果搭建在一台服务器上面,请注意 gitlab默认会占用80端口和8080端口(这个我也想不明白为什么8080端口也会被占用),所以jenkins需要修改成其他端口

    当时搭建的时候,也是参考别人的一个帖子http://www.codesec.net/view/215871.html,但是没有注明IP,很让我头疼,也走好多弯路。

    1-1 gitlab搭建

    GitLab 是一个使用使用 Ruby on Rails 搭建的,用于仓库管理系统的开源项目。使用 Git 作为代码管理工具,并在此基础上搭建起来的web服务
    1.1.2. 环境搭建

    a) 第一步:安装相应的在依赖包(postfix或者sendmail),其中选择internet site这种网络smtp邮件服务器这种方式来发送邮件,其他一些依赖包:curl openssh-server ca-certificates postfix

    If you install Postfix to send email please select 'Internet Site' during setup. Instead of using Postfix you can also use Sendmail or configure a custom SMTP server . If you wish to use Exim, please configure it as an SMTP server.
    On Centos 6 and 7, the commands below will also open HTTP and SSH access in the system firewall.

    操作命令:
    sudo apt-get install curl openssh-server ca-certificates postfix


    b) 第二步:Add the GitLab package server and install the package. 下载gitlab安装包,并且安装
    方法1、增加yum源链接,使用sduo apt-get install gitlab-ee
    Apt-get安装Curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh|sudo bash
    操作命令:
    sudo apt-get install gitlab-ee


    If you are not comfortable installing the repository through a piped script, you can find the entire script here .
    Alternatively you can select and download the package manually and install using


    方法2、deb包安装下载deb包,然后安装

    下载: sudo wget https://packages.gitlab.com/gitlab/gitlab-ee
    安装: sudo dpkg -i gitlab-ee_8.1.2-ee.0_amd64.deb

    建议一般下载后再装

    c)第三步,启用配置,并且启动 GitLab
    操作命令:
    sudo gitlab-ctl reconfigure


    d) 第四步:打开网页,进行注册,使用默认密码
    http://192.168.0.177:80
    Username: rootPassword: 5iveL!fe

    e) 第五步:2.1.6. Upload your license(EE版本需要认证,CE) 这步我操作的时候是没有的(后面发现公司用的CE社区版本,大家请认清想要下载的版本
    Go toAdmin > Licenseand upload your.gitlab-licensefile.
    Don't have a license yet? Get a subscription.

    1-2 gitlab配置用户的SSH-KEY并创建test项目


    第一步:打开gitlab网页:http://192.168.0.177,输入admin用户跟密码,并创建TEST项目

    需要做以下动作:
    1、在gerrit主机(192.168.0.179),创建用户gerrit,生成ssh-key,并把公钥上传到,gitlab的admin的ssh-key里面去
    2、填入admin用户的邮箱,如denghuayi@szprize.com
    操作如下:
    在gerrit主机(192.168.0.179)上: sudo useradd gerrit 并设置密码 ,然后 su - gerrit后, 创建sshkey(生成私钥和公钥)
    $ sudo -u gerrit -H ls /home/gerrit/.ssh
    $ sudo -u gerrit -H ssh-keygen -C denghuayi@szprize.com 邮箱为gitlab的admin注册邮箱,两者共用
    $ sudo -u gerrit -H cat /home/gerrit/.ssh/id_rsa.pub


    以上为生成sshkey的图片


    以上为把/home/gerrit/.ssh/id_rsa.pub里面的内容填入到gitlab用户的ssh-key。
    起到的作用是,以后gerrit主机的gerrit用户可以直接凭私钥push代码,不需要验证,同时gerrit用户就相当于gitlab的管理员账户了(意思是可以下载代码)


    第二步:在gerrit主机:192.168.0.179中,安装git-review,readline,准备对远程gitlab 仓库的的空项目project增加.review文件,注意要安装依赖包pip git-review eadline
    1.1.4. Gerrit Review支持前面我们在Gitlab上搭建了一个 test 的工程,普通用户是没有办法去 push 的,只能使用 git review 命令提交. 而 git review 命令需要 .gitreview 文件存在于项目目录里。
    1.1.4.1安装支持库需要安装git-review, readline
    Apt-get install git-review
    linux :pip install readline
    windows:pip install pyreadline


    第三步:在gerrit主机上创建gitlab同名的管理员用户(root可以理解为gerrit)
    1.1.4.2 用 gerrit(gitlab中的admin)用户给test项目添加 .gitreview 文件a) 拷贝gitlab的test项目,创建.gitreview文件,再push到gitlab仓库(简单来讲,就是用gerrit的主机,给gitlab的空project里面增加一个.gitreview文件
    gerrit@gerrit:~/cfg$ git init cfg
    gerrit@gerrit:~/cfg$ git init cfg
    gerrit@gerrit:~/cfg/cfg$ git config --global user.name 'root'
    gerrit@gerrit:~/cfg/cfg$ git config --global user.email denghuayi@xxx.com
    gerrit@gerrit:~/cfg/cfg$ git clone http://192.168.0.177/root/test.git
    gerrit@gerrit:~/cfg/cfg$ cd test/

    这里强调一下,为什么克隆代码呢,主要是在原来的项目中为了增加.gitreview,这里下载代码与后面的gerrit的git clone --bare完全没关系)


    b) 添加gitreview文件 (注意,里面增加的是gerrit服务器的ip,因为reivew的工作是在192.168.0.179上)
    gerrit@gerrit:~/cfg/cfg/test$ vim .gitreview
    文件内容为:
    [gerrit]
    host=192.168.0.179                      
    port=29418
    project=你在gitlab上面新建的project名,比如说test.git      (其实这里不太准确,真正意义上来讲,这里写的应该是gerrit的项目名,只不过gerrit的项目名与gitlab项目名一样而已)

    c) 上传gitreview文件
    gerrit@gerrit:~/cfg/cfg/test$ git add .gitreview
    gerrit@gerrit:~/cfg/cfg/test$ git commit .gitreview -m 'add .gitreview file by admin.'
    gerrit@gerrit:~/cfg/cfg/test$ git push origin master


    经过以上步骤,gitlab服务器上面的project就有review功能了,这样普通用户就不能直接push代码了。

    第四步:验证普通用户无法直接push代码

    1、同理,在gerrit主机(192.168.0.179)创建普通用户 tanchun , 生成sshkey
    2、同理,在gitlab页面(http://192.168.0.177)创建普通用户 tanchun , 并把上一步生成的sshkey填入,增加邮箱 tanchun@xxxx.com邮箱。
    3、在gitlab页面(http://192.168.0.177)里面选择新建一个测试项目test_project1,选择项目时为private,增加tanchun用户 ,并设置他为reporter角色。(此时,测试用户tanchun是无法push的)

    在linux系统上登录tanchun账号下,克隆工程test-project1.git,测试权限
    [root@115]# su - tanchun
    [tanchun@115 ~]$ git clone git@192.168.1.177:dev-group/test-project1.git
    Initialized empty Git repository in /home/wangshibo/test-project1/.git/
    remote: Counting objects: 15, done.
    remote: Compressing objects: 100% (9/9), done.
    remote: Total 15 (delta 0), reused 0 (delta 0)
    Receiving objects: 100% (15/15), done.
    [tanchun@115 ~]$ cd ~/test-project1/
    [tanchun@115 ~]$ git config --global user.name 'wangshibo'
    [tanchun@115 ~]$ git config --global user.email 'wangshibo@xqshijie.cn'
    [tanchun@115 ~]$ touch testfile
    [tanchun@115 ~]$ git add testfile
    [tanchun@115 ~]$ git commit -m 'wangshibo add testfile'
    [tanchun@115 ~]$git push 
    GitLab: You are not allowed to push code to this project.
    fatal: The remote end hung up unexpectedly
    上面有报错,因为普通用户没有直接push的权限。需要先review到gerrit上进行审核并commit后,才能更新到代码中心仓库里

     


     

    2-1 gerrit安装 

    1.2. Gerrit 1.2.1 简介gerrit的工作模式是所有真正的merge由gerrit负责,
    我们的提交只是提交给了gerrit,gerrit会通知项目的负责人来审核代码,
    同时也会调用一些自动化测试构建工具来检查代码是否符合要求,只有都通过后才会的合并进主干代码。所以可以把gerrit看成是代码和提交者之间的一道门。


    1.2.2. 环境搭建a) Jdk安装
    安装最新版本Oracle JRE/JDK,使用PPA(personal package archieve)WEBUPD8的方式安装。
    sudo apt-get install python-software-properties
    sudo add-apt-repository ppa:webupd8team/java
    sudo apt-get update


    如果你正在使用OPenJDK,那么先将它移除以免产生任何的冲突
    sudo apt-get remove --purge openjdk*


    然后使用下面的命令安装Oracle Java 7
    sudo apt-get install oracle-java7-installer

    b) 添加gerrit用户(已经有了)
    adduser gerrit

    c) 建立存放代码的目录
    mkdir /home/gerrit/gerrit_dir/

    d) 安装git
    sudo apt-get install git

    e) 安装
    sudo java -jar gerrit-2.11.4.war init -d /home/gerrit/gerrit_dir/
    一路按回车,先以默认方式安装,之后再手动修改配置文件。

    f) 配置gerrit
    vim review_site/etc/gerrit.config

    如下:
    [gerrit]
    basePath = /home/gerrit/gerrit_dir -----------存放代码的路径
    canonicalWebUrl = http://192.168.0.179:8081/ -----------gerrit网页最终要跳转到页面
    [database] ---------- 选择默认数据库
    type = h2
    database = db/ReviewDB
    [index] ---------- 默认
    type = LUCENE
    [auth] -----------必选HTTP
    type = HTTP
    [sendemail]
    enable
    smtpServer = smtp.szprize.com
    smtpUser = *******@szprize.com
    smtpPass = ******
    from = gerrit_review<denghuayi@szprize.com>
    [container] ----------默认
    user = gerrit
    javaHome = /usr/lib/jvm/java-7-oracle/jre
    [sshd] -----------默认,sshd29418是gerrit代码库的clone端口
    listenAddress = *:29418
    [httpd] -----------默认
    listenUrl = proxy-http://*:8081/
    [cache] -----------默认
    directory = cache

     

    2-2 配置gerrit的web访问页面

      g) NGINX 安装
    sudo apt-get install nginx


    h) NGINX 配置
    查看/etc/nginx/nginx.conf配置文件读取那些sites配置文件

    发现这里只include /etc/nginx/sites-enabled里面的文件
    在/etc/nginx/sites-enabled新增一个端口映射虚拟服务器文件gerrit
    配置nginx端口映射,9999映射到gerrit的8081端口

    配置gerrit的gerrit文件内容:

    server {
    server_name 192.168.0.179;
    listen 9999;
    root /home/gerrit/gerrit_dir/ ;
    allow all;
    deny all;
    auth_basic "Welcomme to Gerrit Code Review Site!" ;
    auth_basic_user_file /home/gerrit/htpasswd.conf ;

    location / {
    proxy_pass http://192.168.0.179:8081;
    }
    }



    i) 服务重启  service nginx restart

    起到的作用时:当访问http://192.168.0.179:9999端口时,需要输入账号跟密码才能登录,并且跳转到gerrit真正的页面:http://192.168.0.179

     

    2-3 gerrit配置

      1.2.3 账户创建以下模拟admin账户创建
    a) NGINX 账户访问:创建 htpasswd.conf 文件,并添加 gerrit 用户、密码到文件中(注意:htpasswd.conf的权限是644)

    # touch /etc/gerrit_account/htpasswd.conf
    # htpasswd /etc/gerrit_account/htpasswd.conf admin
    默认第一个登录 Gerrit 的用户(gerrit)是 管理员用户。

     
    打开http:192.168.0.179:9999,输入账号、密码后,然后加入ssh-key(注意,在gitlab时就已经生成有ssh-key了,直接cat ~/.ssh/id.rsa.pub就可以看到sshkey了),进入邮箱验证环节(邮箱验证会有个坑,后面我会讲一下)



    b) 邮箱验证
    注册邮箱,并添加对应密钥


    c) 账户登陆
    默认第一个登录 Gerrit 的用户是 (默认为管理员账户)。验证通过后,右上角会由原来的anonmous变成admin



    同理:创建普通用户tanchun(项目测试用户),普通用户jenkins(jenkins用户是用来连接jenkins的),写入htpasswd.conf,登录相应的界面设置ssh-key和邮箱。 (注意。gerrit页面是不允许logout的,所以需要关闭web页面清理缓存,才能登录其他用户)



    注意,这里有个坑,就是在你填写邮箱,进行验证的时候,邮件发到你的邮箱时,记得把链接复制到你验证的浏览器里面打开,不要一直点击打开(直接点击打开会造成什么结果呢?比如说我用的google浏览器打,点击的时候,它会默认在IE里面打开,这两个是不同的浏览器,所以会验证失败,右上角一直会是anomous!)验证成功的标准与否是,会不会出现create new project按键!

    2-3  同步代码到gerrit的根目录(/home/gerrit/gerrit_dir)  

    cd  /home/gerrit/gerrit_dir 

    git clone --bare git@192.168.1.177:dev-group/test-project1.git    (这里要解释一下,首先为什么能克隆?是因为前面把gerrit用户的公钥上传到gitlab上面去了,第二个,克隆方法,必须是git clone --bare这样的方式)

    克隆完了之后,你会发现当前目录有一个test-project.git的文件夹 ,这个文件夹就是对应gitlab的一个项目

    接下来,设置对应关系,把这个项目与gitlab的项目联系起来

    cd /home/gerrit/gerrit_dir/etc

    vim  replication.config   (这个配置文件起到的作用就是,当gerrit审核完之后,根据这个文件里面的url,把内容同步到gitlab项目去)

     [remote "test"] -----------远程
    projects = test
    url = git@192.168.0.177:root/test.git 就是克隆下来时的路径
    push = +refs/heads/*:refs/heads/*
    push = +refs/tags/*:refs/tags/*
    push = +refs/changes/*:refs/changes/*
    threads = 3

    保存退出

    重启gerrit,service gerrit restart,这样gitlab与gerrit的整合就OK了,可以达到代码审核的功能了


    2-4 这一步其实是后面jenkins的东西,给jenkins创建一个用户,达到的目的是,jenkins可以从gerrit下载代码到jenkins的目录进行编译或者其他操作

    以gerrit用户登录192.168.0.179这台服务器,执行命令,新建jenkins用户(这个是gerrit网页登录的jenkins用户)

    htpasswd  /home/gerrit/htpasswd.conf  jenkins    这里比如说密码是123456


    b) su - root ,用root权限创建服务器的用户,jenkins, 并切换到jenkins的家目录 , cd /home/jenkins 

    c) 创建jenkins密钥
     ssh-keygen -C jenkins@xxxx.com

    d) 用jenkins用户登录Gerrit服务器,更新SSH公钥
     cat  /home/jenkins/.ssh/id_rsa.pub

    登录192.168.1.49:9999 gerrit网页,这里如果右上角默认登录为gerrit,请另外开一个IE进行注册,验证邮箱,并且增加sshkey

    e) 接下来,就是设置jenkins为 Non-interactive角色(这里不得不说gerrit的权限设置太麻烦了,如果要搞的话,各位请耐心看一下gerrit的权限设置)


    接下来-就是整合jenkins了

    3-1 jenkins安装

      a) Install Jenkins
    wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
    sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
    sudo apt-get update
    sudo apt-get install jenkins

    b) Starting Jenkins

    nohup java -Dorg.jenkinsci.plugins.gitclient.Git.timeOut=60 -Dfile.encoding=UTF-8 -Dhudson.DNSMultiCast.disabled=true -jar /usr/share/jenkins/jenkins.war --httpPort=8180 > /var/log/jenkins_log 2>&1 &

    (注意--httpPort=8180放在后面)

    c) 开启 jenkins页面为:192.168.0.179:8180
    http://xxxxx:8180/

    d) 插件安装
    Git Plugin
    SSH Plugin
    URL Trigger Plugin
    Gerrit Trigger Plugin


    e) 注册用户
    先开启用户注册按钮,用户注册完毕以后,关闭用户注册

     3-2   构建gerrit的项目

     

    a) 安装gerrit triggle插件
    Gerrit Triggle 配置文档 https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger


    b) 设置Gerrit Trigger (设置gerrit的服务器)
    主页面->Manage Jenkins->Gerrit Trigger->Add New Server
    Add New Server:Check4Gerrit
    勾选Gerrit Server With Default Configurations





    c) 填写gerrit的jenkins账户信息,并测试 (账户信息要跟gerrit里面注册的jenkins的信息一样)
    如果点击Test Connection后出现如图所示的错误User jenkins has no capability to connect to Gerrit event stream.,这是因为因Jenkins 没有权限监听,参考Gerrit 的 ‘Stream Events’配置


    d) Gerrit Triggle设置成功


    e) Gerrit Triggle重启保证状态正常





    第二步:(创建对应的项目,与触发事件,verify)


    1.3.2.1. Verified项目配置只要gerrit有提交代码,jenkins都能检测到,并verified代码正确性,然后把结果告诉gerrit
    a) Jenkins上创建test项目
    用jenkins登录http://192.168.0.179:8180/


    1、选择自由风格的项目


    2、选择git源码管理,填入gerrit的代码仓库项目(在gerrit-http:192.168.0.9999的project的list)的url: http://192.168.1.49:8081/test.git
    添加分支:origin/$GERRIT_BRANCH


    3、构建动作 (选择execute shell)



    c) Build页面设置    (这里其实是shell操作了,以下的这些根据自己自定义来操作吧)
    Add build step->Execute shell
    cd $WORKSPACE
    [ ! -e .testrepository ] && testr init
    testr run


    此处测试代码可依据项目情况而定,可为空

    保存!



    第三步:邮件提醒功能


    首页=>系统管理=>系统设置



    设置jenkins URL为 http://192.168.0.179:8080/ 就是本身jenkins的网址
    系统管理员的邮件地址: jenkins@xxx.com

    设置smtp服务器信息,jenkins@szprize.com的登录信息

    待续....

  • 相关阅读:
    addChildViewController ipad 中Controller的嵌套和叠加
    Oracle中sign函数和decode函数的使用
    MapReduce调度与执行原理之任务调度
    [置顶] SOLR 4.4 部署
    [笔试] 怪物安全问题
    优先队列的使用——Expedition
    棋盘分割——维数较大的动态规划
    由DAG到背包问题——记忆化搜索和递推两种解法
    硬币问题——记忆化搜索与递推的转换
    DAG上的动态规划---嵌套矩形(模板题)
  • 原文地址:https://www.cnblogs.com/to-be-rich/p/6559985.html
Copyright © 2011-2022 走看看