Part 2 - Gerrit Code Review with Jenkins CI : Cài đặt , cấu hình Gerrit với apache basic authen

Index

Quay trở lại với phần 2 của chuỗi bài viết Gerrit with Jenkins CI.

Ở phần trước, mình đã có bài giới thiệu qua về hệ thống Gerrit và Jenkins CI. Cách tổ chức và hoạt động của Gerrit , cũng như những lợi ích mà hệ thống tích hợp liên tục CI (continuous integration) mang lại.

Trong phần này mình sẽ hướng dẫn cách cài đặt và cấu hình Gerrit sử dụng cơ chế xác thực bằng basic authen, cái sẽ dựa trên apache web container . Để hiểu rõ hơn chúng ta cũng bắt đầu tích hợp nhé.

Chuẩn bị môi trường

Gerrit sử dụng Jetty làm web server chạy trên nền J2EE nên điều kiện tiên quyết bạn cần phải có một môi trường JRE . Trong bài viết, mình sẽ thực hiện triển khai trên Ubuntu 16.10 và chạy trên các môi trường sau :

  • Java 8
  • Gerrit 2.13.5
  • PostgreSQL 9.5.2 (sử dụng làm database server cho Gerrit)
  • Jenkins: 2.32.1
  • apache2 ( sử dụng làm proxy server để handle login request cho Gerrit và redirect port 80 --> 8081 - Chi tiết mình sẽ trình bày ở phần 3. Install and configure apache)

Download Gerrit tại https://www.gerritcodereview.com/releases/2.13.md

Để tập trung vào việc cấu hình , mình sẽ không đề cập đến việc cài đặt Java và PostgreSQL. Để cài đặt PostgreSQL bạn có thể tham khảo tại https://www.postgresql.org/download/linux/ubuntu/ hoặc có thể sử dụng bộ installer này https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

Gerrit database setup

Hiện tại, Gerrit hỗ trợ 8 loại quản trị cơ sở dữ liệu như sau :

  1. H2
  2. Apache Derby
  3. PostgreSQL
  4. MySQL
  5. Oracle
  6. SAP MaxDB
  7. DB2
  8. SAP HANA

Trong bài viết này mình sử dụng PostgreSQL cái đã được recommended sử dụng với Gerrit, bởi những điểm mạnh mà nó mang lại , lượng dữ liệu lớn, phù hợp trên nhiều môi trường cũng như hỗ trợ tốt unicode để hiển thị trong các message commit ..vv .

Và tất nhiên, bạn cũng có thể lựa chọn loại hệ quản trị tùy ý, phù hợp với mục đích và nhu cầu của mình.

Tạo gerrit database

Bước đầu tiên chúng ta cần tạo 1 empty database, tên do bạn tùy chọn. Bạn có thể sử dụng 1 tool bất kỳ hoặc postgres command để tạo database. Như hình dưới mình sử dụng pgAdmin để thao tác với PostgreSQL và tạo 1 database có tên là gerrit, sử dụng user mặc định là postgres để connect đến database server, user đó cũng sẽ có full permissions CRUD (Create, Read, Update, Delete) để có thể thao tác với database này.

Như vậy, sau bước này mình cần nhớ các thông tin sau :

  • Database name : gerrit
  • Username/password database : postgres / postgres ( có thể khác với bạn)

Cài đặt và cấu hình Apache

(Apache đóng vai trò như một reverse proxy)

Tại sao cần sử dụng apache?

Trong gerrit hỗ trợ một vài phương thức xác thực như : OPENID, HTTP, LDAP, OAUTH Với bài viết này , mình sử dụng HTTP làm ví dụ , cái sẽ bao gồm HTTP basic authentication.

Khi sử dụng HTTP authentication type , Gerrit cần kết hợp với một web server hoặc một servlet container khác(ngoài gerrit) để thực hiện việc authentication. ==> Do đó mình chọn apache webserver . Và để đơn giản hóa, mình mượn cơ chế xác thực của apache với basic authen, thông tin account login sẽ được lưu trữ trong file .htpasswd của apache.

Apache sẽ đóng vai trò như một reverse proxy, nơi toàn bộ request đến Gerrit sẽ thông qua apache( refer hình trên)

Hãy nhớ rằng : Gerrit không quản lý account của bạn, nó chỉ lưu trữ các thông tin cần thiết liên quan đến account đó mà thôi chẳng hạn như : full name, sex, birdthday ..vv . Việc quản lý các account đó và việc authenticate sẽ do provider của phương thức xác thực mà bạn chọn đảm nhiệm(OPENID, HTTP, LDAP, OAUTH) chẳng hạn như OpenID Provider, LDAP Server , file .htpasswd của apache.

Cài đặt apache

Với những khái niệm và mô tả bên trên chắc phần nào bạn cũng hiểu được vai trò của apache trong ví dụ này.

Tiếp theo mình sẽ cài đặt apache và các modules proxy tương ứng.

Mở Terminal và nhập các commands sau :

sudo apt-get install apache2

Install proxy module và dependency

sudo apt-get install libapache2-mod-proxy-html  libxml2-dev

Load modules sau khi installed

sudo a2enmod  proxy  proxy_http  rewrite

Cấu hình apache

Sau khi apache được cài đặt, việc tiếp theo mình cần cấu hình cho apache làm việc như đúng với vai trò của nó - một reverse proxy.

Mình sẽ tạo các file sau để bắt đầu thiết lập :

  • /etc/apache2/gerrit.htpasswd : file lưu trữ thông tin tài khoản đăng nhập( username / password).
  • /etc/apache2/sites-enabled/gerrit.conf : file cấu hình reverse proxy cho Gerrit.

/etc/apache2/gerrit.htpasswd

Đây là file chỉ lưu trữ thông tin user namepassword của các users với password đã được encrypted (defaut là MD5 hoặc có thể tùy chọn bằng encryption khác ). Thông tin các account được mã hóa giống như thế này.

admin:$apr1$wdq5lJRB$X2n6w0khBrLLXYlKy9SAm.
manhnv:$apr1$afZiPIal$9DAFWJeoTB4z2oLmbIoYF/

Để thao tác với file này sẽ sử dụng command htpasswd cho CRUD thông tin. Bạn có thể tìm hiểu chi tiết hơn về htpasswd command tại đây .

Giờ thì tạo account với usere name / password là : admin / 1234

sudo htpasswd -c /etc/apache2/gerrit.htpasswd  admin

Terminal sẽ hiển thị giống như thế này

/etc/apache2/sites-enabled/gerrit.conf

file được save tại folder /etc/apache2/sites-enabled nơi lưu trữ các config của apache, để tách biệt việc cấu hình reverse proxy cho gerrit được clear hơn, mình sẽ tạo file gerrit.conf tương ứng như sau :

cd /etc/apache2/sites-enabled
sudo touch gerrit.conf

Mở file vừa tạo bằng editor bất kỳ và khai báo nội dung như bên dưới

<VirtualHost *:80>

    ProxyRequests Off
    ProxyVia Off
    ProxyPreserveHost On

    <Proxy *>
          Order deny,allow
          Allow from all
    </Proxy>

    <Location /gerrit/login/>
      AuthType Basic
      AuthName "Gerrit Code Review"
      Require valid-user
      AuthUserFile /etc/apache2/gerrit.htpasswd
      Order Deny,Allow
      Allow from all
    </Location>

    AllowEncodedSlashes On
    ProxyPass /gerrit/ http://localhost:8081/gerrit/
</VirtualHost>

Đến đây mình sẽ giải thích về ý nghĩa của đoạn cấu hình trên.

Với nội dung trên, mình vừa khai báo một VirtualHost sẽ handle tất cả các request đến server với port 80 ( Do mình chỉ có 1 server với 1 IP nên không cần chỉ đích danh cho IP cụ thể).

Tương ứng với mỗi HTTP request có location là /gerrit/login/ thì sẽ bắt buộc phải thực hiên authenticate với các thuộc tính đã được config trong cặp thẻ <Location /gerrit/login/> AuthType : chỉ định authenticate type là basic authen. AuthName : message sẽ được hiển thị trong dialog - login form với nội dung "Gerrit Code Review" AuthUserFile : file chứa toàn bộ thông tin user đã được tạo ở bước trên cho việc xác thực /etc/apache2/gerrit.htpasswd

Cuối cùng , apache sẽ redirect toàn bộ HTTP response headers sang Gerrit application đang chạy trên port 8081 với config:

 ProxyPass /gerrit/ http://localhost:8081/gerrit/ 

Như vậy việc foward request từ apache --> gerrit ( từ port 80 --> 8081) là OK.

Hãy ghi nhớ thông tin ProxyPass này, nó là cần thiết để sử dụng khi cài đặt gerrit tại phần dưới http://localhost:8081/gerrit

Cuối cùng restart apache để active cấu hình

sudo service apache2 restart 

Install Gerrit

Git-core

Do Gerrit sử git để quản lý version source, vì vậy trước khi cài đặt Gerrit bạn cần đảm bảo rằng git đã được cài đặt. Cài đặt git từ Terminal :

sudo apt-get install git 

Gerrit configuration wizard

Cú pháp để cài đặt Gerrit như sau : java -jar </path/to/gerrit-2.13.5.war> init -d </path/installed>

For eg :

java -jar  ~/Downloads/gerrit-2.13.5.war init -d  ~/gerrit

Setup wizad sẽ bắt đầu, trong đó cần chú ý các mục sau :

  • SQL Database : thiết lập thông tin tương ứng với mục Gerrit database setup đã tạo ở trên
  • User Authentication : Sử dụng HTTP authentication method , cái sẽ làm việc với basic authen của apache.
  • Email Delivery : Email Delivery sẽ làm nhiệm vụ active register URL khi đăng ký user mới, gửi thông báo với mỗi commit lên gerrit review hay có những thay đổi từ phía CI service ..vv. Thiết đặt config mail server tương ứng với hệ thống của bạn, hoặc có thể sử dụng một vài stmp mail server khác như Gmail, Exchange ( trong ví dụ này mình sẽ sử dụng Gmail stmp).
  • HTTP Daemon : Thông tin reverse proxy và Canonical URL của gerrit , cái sẽ matching với config của apache tại mục Cài đặt và cấu hình Apache.

Với các options ([Y/n]?) hoặc [y/N]? Giá trị default sẽ được hiểu rằng option Yes(Y) hoặc No(N) sẽ được chọn. Để sử dụng gmail làm Email Delivery, bạn phải disable xác thực 2 bước và enable Less secure apps

man[email protected] ~ $ java -jar ~/Downloads/gerrit-2.13.5.war init -d  ~/gerrit
Using secure store: com.google.gerrit.server.securestore.DefaultSecureStore
[2017-02-03 10:24:30,449] [main] INFO  com.google.gerrit.server.config.GerritServerConfigProvider : No /home/manhnv/gerrit/etc/gerrit.config; assuming defaults

*** Gerrit Code Review 2.13.5
*** 
Create '/home/manhnv/gerrit'   [Y/n]? 

*** Git Repositories
*** 
Location of Git repositories   [git]: 

*** SQL Database
*** 
Database server type           [h2]: postgresql
Server hostname                [localhost]: 
Server port                    [(postgresql default)]: 5432
Database name                  [reviewdb]: gerrit
Database username              [manhnv]: postgres
postgres's password            : 
              confirm password : 

*** User Authentication
*** 
Authentication method          [OPENID/?]: HTTP
Get username from custom HTTP header [y/N]? 
SSO logout URL                 : 
Enable signed push support     [y/N]? 

*** Review Labels
*** 
Install Verified label         [y/N]? y

*** Email Delivery
*** 
SMTP server hostname           [localhost]: smtp.gmail.com
SMTP server port               [(default)]: 465
SMTP encryption                [NONE/?]: SSL
SMTP username                  [manhnv]: [email protected]
[email protected]'s password : 
              confirm password : 

*** Container Process
*** 
Run as                         [manhnv]: 
Java runtime                   [/home/manhnv/data/Setup/Environment/jdk1.8.0_101/jre]: 
Copy gerrit-2.13.5.war to /home/manhnv/gerrit/bin/gerrit.war [Y/n]? 
Copying gerrit-2.13.5.war to /home/manhnv/gerrit/bin/gerrit.war

*** SSH Daemon
*** 
Listen on address              [*]: 
Listen on port                 [29418]: 

Gerrit Code Review is not shipped with Bouncy Castle Crypto SSL v152
  If available, Gerrit can take advantage of features
  in the library, but will also function without it.
Download and install it now [Y/n]? 
Downloading https://repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.52/bcpkix-jdk15on-1.52.jar ... OK
Checksum bcpkix-jdk15on-1.52.jar OK

Gerrit Code Review is not shipped with Bouncy Castle Crypto Provider v152
** This library is required by Bouncy Castle Crypto SSL v152. **
Download and install it now [Y/n]? 
Downloading https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.52/bcprov-jdk15on-1.52.jar ... OK
Checksum bcprov-jdk15on-1.52.jar OK
Generating SSH host key ... rsa... dsa... done

*** HTTP Daemon
*** 
Behind reverse proxy           [y/N]? y
Proxy uses SSL (https://)      [y/N]? 
Subdirectory on proxy server   [/]: /gerrit 
Listen on address              [*]: 
Listen on port                 [8081]: 
Canonical URL                  [http://manhnv-pc/gerrit]: http://localhost/gerrit

*** Plugins
*** 
Installing plugins.
Install plugin commit-message-length-validator version v2.13.5 [y/N]? 
Install plugin download-commands version v2.13.5 [y/N]? y
Installed download-commands v2.13.5
Install plugin hooks version v2.13.5 [y/N]? y
Installed hooks v2.13.5
Install plugin replication version v2.13.5 [y/N]? y
Installed replication v2.13.5
Install plugin reviewnotes version v2.13.5 [y/N]? y
Installed reviewnotes v2.13.5
Install plugin singleusergroup version v2.13.5 [y/N]? y
Installed singleusergroup v2.13.5
Initializing plugins.
No plugins found with init steps.

Initialized /home/manhnv/gerrit
Executing /home/manhnv/gerrit/bin/gerrit.sh start
Starting Gerrit Code Review: 
OK

Start | stop service

Sau khi việc cài được hoàn tất, gerrit sẽ tự động start script. Nếu vì một lý do nào đó bạn muốn , vẫn có thể start|stop một cách normally.

Start|stop|restart gerrit: </path/to/install/folder>/bin/gerrit.sh start|stop|restart

For example, để start gerrit thực hiện command sau trong Terminal :

~/gerrit/bin/gerrit.sh  start

Testing

Nào, giờ open browser và đi tới page sau : http://localhost/gerrit (Canoical URL đã config ở bên trên). Nếu bạn nhìn thấy màn hình login form như bên dưới, có nghĩa là mọi thứ config đã OK

Sử dụng account đã tạo ở trên Cài đặt và cấu hình Apache để đăng nhập và chúng ta sẽ tới màn hình Welcome như bên dưới.

Lưu ý :

  • Màn hình welcome chỉ hiển thị cho lần đăng nhập đầu tiên , tại đây bạn có thể register email và public key làm việc cho tài khoản này.
  • Việc thiết lập email mình sẽ hướng dẫn chi tiết hơn ở phần dưới.
  • Với user đầu tiên đăng nhập vào hệ thống sẽ được hiểu là super admin - người sẽ có full permission trên hệ thống.

Cấu hình email, SSH & git author

Để làm việc với gerrit thì sẽ có một vài tiêu chí bắt buộc sau đây :

  1. Tài khoản bắt buộc phải có 1 email đã đăng ký trên gerrit.
  2. Thông tin commit author (email) trước khi push phải trùng khớp với email đã đăng ký trên Gerrit( có thể đăng ký nhiều email)
  3. Public key dưới local cũng phải được đăng ký trên gerrit.

Đăng ký email trên gerrit

  1. Đăng nhập vào gerrit với tài khoản tương ứng.
  2. Bên dưới menu user ( góc phải màn hình) -> chọn Settings
  3. Mục Contact Information -> click Register NEw Email... để đăng ký email mới.

Một email kích hoạt sẽ được gửi vào mail vừa đăng ký, click vào link để hoàn tất.

Cấu hình git config phía local

Để có thể commit lên gerrit, thì email author trong commit phải trùng khớp với email đã đăng ký. Bạn cần config email phía local vào gitconfig file. Có 3 levels của git config như sau :

  • project : <project_workspace>/.git/config - config này chỉ được áp dụng cho project hiện tại này.
  • global : ~/.gitconfig - áp dụng cho tất cả các projects của user hiện tại
  • system : /etc/gitconfig - áp dụng cho tất cả các projects và các users trong hệ thống.

Bạn có thể tạo 1 trong 3 hoặc cả 3 gitconfig tùy vào mục đích sử dụng. Thứ tự ưu tiên sẽ là : project > global > system.

Config user.nameuser.email cho user hiện tại ~/.gitconfig

git config --global user.name "Nguyen Van Manh"
git config --global user.email "[email protected]"

Generate public key

Run command

ssh-keygen  -t rsa -C "your comment here"

Trong đó -C là optional, bạn có thể thiết lập hoặc bỏ. Default public key sẽ được tạo trong thư mục home của user hiện tại ~/.ssh

Quay trở lại với màn hình Settings trên gerrit. Copy nội dung của file~/.ssh/id_rsa.pub và đăng ký public key cho account tại mục SSH Public Keys

Test SSH connection

Execute ssh commadn để test ssh connection ssh -p 29418 [email protected] ( sử dụng IP thay cho localhost) Yes, để trurst server cho lần đầu connect .

[email protected] ~ $ ssh -p 29418 [email protected]
The authenticity of host '[192.168.13.106]:29418 ([192.168.13.106]:29418)' can't be established.
RSA key fingerprint is SHA256:nanxXvTyCnDE6yFxYwDBVebBDqXWGD86U7B8EGkaXlw.
Are you sure you want to continue connecting (yes/no)?  yes

Nếu bạn nhận được message sau , ssh connection là OK

  ****    Welcome to Gerrit Code Review    ****

  Hi admin, you have successfully connected over SSH.

  Unfortunately, interactive shells are disabled.
  To clone a hosted Git repository, use:

  git clone ssh://[email protected]:29418/REPOSITORY_NAME.git

Connection to 192.168.13.106 closed.

Tổng kết

Như vậy, trong phần này mình đã hoàn thành việc cài đặt và cấu hình Gerrit, trong đó sử dụng phương thức đăng nhập là HTTP - cái sẽ sử dụng basic authen là một simple form của apache. Vai trò của apache :

  • Quản lý thông tin đăng nhập
  • Đóng vai trò như một reverse proxy - redirect mọi request đến gerrit ( port 80 --> 8081)

Qua đó hướng dẫn cách một số cấu hình bắt buộc trước khi làm việc với gerrit.

Phần 2 này đến đây là hết, cùng đón chờ bài tiếp theo nhé - Gerrit Code Review with Jenkins CI : Tích hợp CI / CD