如何使用Gitlab+Jenkins實現多分支自動獨立部署?

開發免不了要測試,同一個項目一兩我的開發的時候,開發、測試、部署一個分支就行,但當項目變大,開發人員變多時,若是仍是這樣操做,你可能就會常常遇到不一樣需求的代碼同時測試時的相互干擾問題。好比,一、合併代碼時常常發生衝突;二、一人代碼寫錯,影響全部人等。php

那麼如何解決這個問題呢?java

這裏我介紹一個多分支同時部署測試的方案。具體就是每個開發者的分支代碼均可以獨立部署到測試服務器(好比,不一樣的根目錄,不一樣的容器),而後,各開發者能夠在各自的測試分支獨立調試。git

下面以PHP項目爲例來具體說明。docker

首先列一下咱們可能用到的工具清單:centos

  1. Linux:這是一切操做的基礎,本文中主要用到的Linux版本爲Centos8
  2. Gitlab:負責管理源代碼
  3. Jenkins:負責持續集成部署,
  4. Docker:負責搭建Gitlab、Jenkins、Web應用。
  5. Nginx:Web應用服務器、反向代理
  6. PHP:解析PHP代碼
  7. GIT:管理源代碼
須要說明的是,咱們安裝這些工具主要使用yum命令,所以在執行後面步驟前,請先確保你的Linux系統已經安裝了yum命令。

具體步驟以下:ruby

一、安裝Docker

yum install docker

二、安裝Gitlab

下載Gitlab鏡像:bash

docker pull gitlab-ce

建立Gitlab容器了:服務器

docker run --name gitlab -p 443:443 -p 80:80 -p 22:22 -v /data/www/gitlab/config:/etc/gitlab -v /data/www/gitlab/logs:/var/log/gitlab -v /data/www/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce /bin/bash

訪問localhost,查看效果:composer

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

三、安裝Jenkins

製做Jenkins鏡像工具

咱們的倉庫代碼是不包含vendor目錄的,須要git checkout 後,使用composer install命令自動生成。因爲官方Jenkins鏡像不包含Composer、PHP、Git等咱們的PHP項目須要用到的命令,所以,在實際使用時,咱們以官方鏡像爲基礎製做了本身的Jenkins鏡像。

下載Centos鏡像,以下:

docker pull centos:latest

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

以Centos鏡像爲基礎鏡像,建立Jenkins容器:

docker run -idt --name jenkins docker.io/centos /bin/bash

進入jenkins容器內部:

docker exec -it jenkins /bin/bash

使用yum命令安裝java、php、composer、git:

yum -y php git java
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'c31c1e292ad7be5f49291169c0ac8f683499edddcfd4e42232982d0fd193004208a58ff6f353fde0012d35fdd72bc394') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/bin/composer
若是提示PHP拓展缺失,請使用yum命令安裝相關拓展。

使用yum命令,安裝官方jenkins:

wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
yum install jenkins

修改Jenkins配置,配置文件默認位置爲:/etc/sysconfig/jenkins

  • JENKINS_HOME
  • JENKINS_USER
  • JENKINS_PORT

JENKINS_HOME是Jenkins的主目錄,Jenkins工做的目錄都放在這裏,Jenkins儲存文件的地址,Jenkins的插件,生成的文件都在這個目錄下。

JENKINS_USER是Jenkins的用戶,擁有$JENKINS_HOME和/var/log/jenkins的權限,通常使用root用戶。

JENKINS_PORT是Jenkins的端口,默認端口是8080。

啓動Jenkins:

service jenkins start

若是出現錯誤,可能要考慮文件/etc/init.d/jenkins是否缺乏配置,Jenkins的啓動須要Java的支持。

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

若是Jenkins安裝沒有問題,下面咱們就須要設置開機自啓了。這是爲了咱們後面建立Jenkins容器的時候,Jenkins能夠自動啓動,而不須要咱們進入容器中手動啓動。jenkins.sh重啓腳本以下:

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

給jenkins.sh設置可執行權限:

chmod +x /usr/local/jenkins/jenkins.sh

將文件添加系統自動啓動程序列表:

echo "/usr/local/jenkins/jenkins.sh">> /etc/rc.d/rc.local

使用exit命令退出容器,而後使用docker commit命令製做新的Jenkins鏡像:

docker commit -m 'Jenkins with docker/composer/git/php' jenkins jenkins:latest

以新鏡像建立Jenkins容器,以下:

docker run -idt --name jenkins -p 8080:8080 -p 50000:50000 -v /var/run/docker.sock:/var/run/docker.sock -v /data/www/jenkins/jenkins_home:/var/lib/jenkins:rw jenkins /bin/bash

至此,Jenkins就安裝好了。

四、在Gitlab建立項目

一、設置access token,記錄生成的祕鑰,後面建立Jenkins任務須要使用。

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

二、建立代碼倉庫

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

三、爲代碼倉庫,設置Webhook

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

五、在Jenkins建立任務

在Jenkins中,Jenkins的主要功能都是由一個個插件提供的。所以,在搭建環境以前咱們也須要先安裝幾個用到的插件。

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

咱們用到的插件主要有如下幾個:

  1. GitLab Plugin
  2. Gitlab Hook Plugin
  3. Gitlab API Plugin
  4. ruby-runtime

從名字咱們也能夠看到,這主要是用於Jenkins與Gitlab的交互。

說明一下,Jenkins與Gitlab的交互包括兩部分,一部分是Gitlab經過Webhook提交Git Push事件,觸發Jenkins開始執行集成任務,另外一部分是Jenkins經過Git從Gitlab拉取源代碼。

一、配置Gitlab連接

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

這個是Gitlab上建立的access token

二、建立集成任務

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

這是gitlab項目的倉庫地址。

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

三、在本地Push代碼到Gitlab,查看Jenkins任務執行狀況

如何使用Gitlab+Jenkins實現多分支自動獨立部署?

至此,多分支同時部署測試的環境就搭建好了。

image

相關文章
相關標籤/搜索