Gitlab+Docker實現持續集成(CI)與持續部署(CD)


GitLab CI/CD介紹

GitLab CI的工作流程:

GitLab CI是 GitLab 提供的持續集成服務,只要在你的倉庫根目錄 創建一個.gitlab-ci.yml 文件, 並為該項目指派一個Runner,當有合並請求或者 push的時候就會觸發build。

這個.gitlab-ci.yml 文件定義GitLab runner要做哪些操作。默認有3個默認有3個[stages(階段)]: build、test、deploy。

當build完成后(返回非零值),你會看到push的 commit或者合並請求前面出現一個綠色的對號。這個功能很方便的讓你檢查出來合並請求是否會導致build失敗, 免的你去檢查代碼。

大部分項目用GitLab’s CI服務跑build測試, 開發者會很快得到反饋,知道自己是否寫出了BUG。

所以簡單的說,要讓CI工作可總結為以下幾點:

在倉庫根目錄創建一個名為.gitlab-ci.yml 的文件
為該項目配置一個Runner
完成上面的步驟后,每次push代碼到Git倉庫, Runner就會自動開始pipeline。

配置Runner

詳細的使用說明,請閱讀官方文檔:https://docs.gitlab.com/runner/

安裝GitLab-Runner

#在ubuntu server16.04版本下使用命令即可安裝
$ sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

#接着授予可執行權限
$ sudo chmod +x /usr/local/bin/gitlab-runner

#創建一個gitlab-ci用戶
$ sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

#安裝,並作為服務啟動
$ sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner

至此,安裝工作完成,接下來需要注冊Runner,來將Runner和Gitlab綁定到一起。

其他系統安裝參考

https://docs.gitlab.com/runner/install/linux-manually.html

注冊Runner

  • 輸入命令
$ sudo gitlab-runner register

會要求輸入gitlab的url和Token.
查找過程如下:
進入倉庫->settings->CI/CD,找到Runner Settings這一項,點擊Expend,即可在Setup a specific Runner manually這項中找到。如下:

注意,其他版本位置可能會不同

其中的url和Token就是遮起來的內容,只需要在注冊過程中填入即可。

當這些做完之后啟用命令啟動Runner

 
        
$gitlab-runner run

教程上說是使用gitlab-runner start命令,但我試的時候並沒有生效,但是用了gitlab run就可以了,建議先使用gitlab-runner start試一下,不行再用gitlab-runner run
啟動成功后就可以看到,gitlab對應的倉庫下(操作:進入倉庫->settings->CI/CD,找到Runner Settings這一項,點擊Expend,即可在Setup a specific Runner manually)看到注冊的runner已經在運行了。

注:如果狀態顏色是灰色的表示沒有運行成功,也可以選擇“Pause”和“Remove Runner”

自動化測試

創建.gitlab-ci.yml

.gitlab-ci.yml 介紹

  • .gitlab-ci.yml 用來配置 CI 用你的項目中做哪些操作,這個文件位於倉庫的根目錄。

  • 當有新內容push到倉庫后,GitLab會查找是否有.gitlab-ci.yml文件,如果文件存在, Runners 將會根據該文件的內容開始build 本次commit。

.gitlab-ci.yml 使用YAML語法, 你需要格外注意縮進格式,要用空格來縮進,不能用tabs來縮進。

創建.gitlab-ci.yml

因為本人項目基本都是Gradle構建的,Gradle進行單元測試比較簡單,只需要使用gradle test即可運行所有的單元測試

  • 新建一個.gitlab-ci.yml文件,並完成如下內容
stages:
  - build
  - test

before_script:
  - echo "Restoring Packages..."

build_job:
  stage: build
  script:
  - echo "Release build..."
  except:
  - tags

test_job:
  stage: test
  script:
  - echo "Tests run..."
  - cd cds.ci.test
  - gradle test

stage翻譯為階段的意思,在構建的過程中,必須要有一個先后順序。最上面的stages配置意思是,先構建階段為build的job,然后再構建階段為test的job,下面build_job和test_job都是job,如果不配置stages,默認為:

stages:
  - build
  - test
  - deploy

推送配置文件

配置好.gitlab-ci.yml文件之后,只要把它加入git后然后推送到遠程倉庫,CI就會開始自動化集成。這樣我們提交代碼到GitLab是在每次提交的后面都會有自動測試的結果

如果失敗了,也可以進入對應的階段,查找錯誤原因。gitlab提供了可視化的界面,非常方便。

代碼審查

安裝Docker

  • 由於apt官方庫里的docker版本可能比較舊,所以先卸載可能存在的舊版本:
$ sudo apt-get remove docker docker-engine docker-ce docker.io
  • 更新apt包索引:
$ sudo apt-get update
  • 安裝以下包以使apt可以通過HTTPS使用存儲庫:
$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
  • 添加Docker官方的GPG密鑰
 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 使用下面的命令來設置stable存儲庫
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  • 再更新以下apt包索引
$ sudo apt-get update
  • 列出可用的版本
$ apt-cache madison docker-ce
  • 選取要安裝的特定版本
$ sudo apt-get install docker-ce=<VERSION>

SonarQube介紹

安裝SonarQube

  • 獲取postgresql的鏡像
 $ docker pull postgres
  • 啟動postgresql
 $ docker run --name db -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -d postgres
  • 獲取sonarqube的鏡像
 $ docker pull sonarqube
  • 啟動sonarqube
$ docker run --name sq --link db -e SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar -p 9000:9000 -d sonarqube
  • 將sonar-gitlab-plugin-2.1.0.jar添加到docker中的sonarqube容器中
$ docker cp sonar-gitlab-plugin-2.1.0.jar sonarqube:/opt/sonarqube/extensions/plugins

打開http://localhost:9000 點擊login
用戶名密碼均默認為admin

Gradle集成SonarQube

代碼審查可以使用Gradle集成Sonarqube。整體來說,共分為三步:

  • 在build.gradle中添加配置,啟動sonarqube插件

  • 配置sonar系統認證權限信息,以便將分析結果上傳到sonar中展示;

  • 運行分析命令:gradle sonarqube,然后就可以在sonarqube頁面上看到分析結果。

但我們需要在gitlab上進行持續集成,所以我們將gradle sonarqube命令寫入到.gitlab-ci.yml腳本中,在提交代碼到gitlab是執行。
首先對build.gradle進行配置:

buildscript {
    repositories {
        # 添加庫路徑,實際項目中原來此處可能還有別的庫,在此位置追加。追加庫的位置可能會導致項目報錯(找不到某些依賴的錯誤)
        maven { url "http://192.168.109.63:8081/nexus/content/groups/public/" }
    }

    dependencies {
        #在此位置追加一下依賴行
        classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6.2"
    }
}


plugins {
    # plugins段放置位置有要示,放在buildscript段前面會報錯,放到文件最末尾也報錯,緊跟buildscript放置OK
    #添加插件信息
    id "org.sonarqube" version "2.6-rc1"
}

apply plugin: "org.sonarqube"

subprojects {
    sonarqube {
       # 如果同時存在src/main/java與src/main/test,則要按以下方式設置,如果沒有單元測試用例目錄test,也可以只填寫src
        properties {
            property "sonar.sources", "src/main/java"
        }
    }
}

#配置sonarqube的權限信息
sonarqube{
 properties {
  property "sonar.host.url", "http://192.168.90.58:9000"
  property "sonar.projectName", "${artifactIdParam}"
  property "sonar.projectKey", "${artifactIdParam}"
  property "sonar.projectVersion", "${versionParam}"
        property "sonar.login","admin"
        property "sonar.password","admin"
 }
}

完成gradle與sonar的集成后,接下來需要編寫.gitlab-ci.yml腳本,增加執行代碼審查的腳本。

code_review
  stage: test
  script:
  - echo "Start reviewing code"
  - gradle sonarqube  

完成之后提交代碼到gitlab,即可顯示執行結果。

 

# plugins段放置位置有要示,放在buildscript段前面會報錯,放到文件最末尾也報錯,緊跟buildscript放置OK
plugins {
    #添加插件信息
    id "org.sonarqube" version "2.6-rc1"
}
#聲明插件
apply plugin: "org.sonarqube"

subprojects {
    sonarqube {
       # 如果同時存在src/main/java與src/main/test,則要按以下方式設置,如果沒有單元測試用例目錄test,也可以只填寫src
        properties {
            property "sonar.sources", "src/main/java"
        }
    }
}

sonarqube{
 properties {
  property "sonar.host.url", "http://192.168.90.58:9000"
  property "sonar.projectName", "${artifactIdParam}"
  property "sonar.projectKey", "${artifactIdParam}"
  property "sonar.projectVersion", "${versionParam}"
        property "sonar.login","admin"
        property "sonar.password","admin"
 }
}

至此gradle集成SonarQube完成,接下來需要編寫腳本並上傳

編寫.gitlab-ci.yml

在剛才的自動化測試腳本里追加如下內容:

code_review:
  stage: test
  script:
  - echo "Start reviewing code"
  - gradle sonarqube

這樣在提交代碼到遠程倉庫時即可實現代碼審查。結果如下:

 進入項目下就可以看到具體的代碼審查結果

 

自動化部署

要實現自動部署,需要在.gitlab-ci.yml中指定執行的腳本,與自動化測試類似。

stages:
  - deploy
deploy:
    stage: deploy
    script:
      - echo "start deploy....."
    only:
      - master
    tags:
      - shell

這里我們只有一個stage是deploy。only指定了只有在master分支push的時候才會被執行。tags是shell,對應了剛才注冊runner的時候的tags。
這是一個最簡單的執行模塊,在實際開發中我們要通過一個shell腳本來將資源自動部署到指定位置。例如修改腳本如下:

stages:
  - deploy
deploy:
    stage: deploy
    script:
      - echo "start deploy....."
      - deploy
    only:
      - master
    tags:
      - shell

其中deploy是編寫的shell腳本,可以實現將要發布的內容自動部署到發布目錄下:

#!/bin/bash
deploy_path="/home/xuda/tomcat8/webapps"
project_path="gitlab_ci_cd_test";
judge_path = "$deploy_path/$project_path"
if [ ! -d "$judge_path" ]
then
   project_url="http://XXXXcom/xuda/gitlab_ci_cd_test.git"
   git clone $project_path $deploy_path
else
   cd $deploy_path
   git pull
fi

這個腳本的大意就是,先判斷tomcat的webapps下有沒有gitlab_ci_cd_test文件夾,如果目錄不存在,那么就在webapps文件夾下git clone一個,如果存在了就git pull一個到指定目錄下。這樣就實現了自動部署,我們同樣可以在gitlab的倉庫下看到結果

 

 

 

 最后,附上一張gitlab倉庫的項目結構圖

 

總結

GitLab的持續集成持續部署的功能還是很強大的。因為剛畢業進入這家公司看到他們的持續集成做的非常棒,所以學習了基本的安裝。如果想要完成比較復雜的功能也是完全可以實現的,這時可以結合Shell腳本來操作。因為水平有限,如果有問題可以提出,學習交流。

參考資源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM