devops系統自動化部署流程

jaymarco發表於2021-11-10

1 背景介紹

在現有環境使用了gitlab作為程式碼管理工具,並在上面整合了CI/CD自動化部署流程。在自動化流程過程中,全部使用docker容器進行打包、部署等。docker叢集是使用swarm叢集。現階段需要在cicd流程中增加自動化測試。在整個流程中需要增加有:單元測試測試程式碼覆蓋率;sonar程式碼質量掃描;增加介面自動化測試。在這些過程中,如有問題,則終止整個流程執行。 需要滿足Java和python專案的自動化測試。


2 環境部署

2.1 準備工作

預設bridge網路內的容器無法解析對方容器的host,透過新建一個docker網路devops_net,所有的相關的元件使用同一個網路。

# 建立docker network

docker network create devops_net

# 建立各容器所需目錄

mkdir -p /data/docker-volume

cd /data/docker-volume

mkdir postgres

mkdir -p sonarqube/{data,extensions,logs}

mkdir -p gitlab/{config,logs,data}

mkdir -p gitlab-runner/config

#修改sonarqube內部使用者uid/gid許可權,

chown -R 999.999 sonarqube


2.2 部署postgres資料庫

啟動postgres,併為sonarqube建立一個資料庫。sonarqube資料庫需要使用字元編碼為UTF8,postgres預設建立的則為UTF8。

# 啟動postgres容器

docker run -d --name postgres --net=devops_net \

-e POSTGRES_PASSWORD=pgpasswd \

-v /data/docker-volume/postgres:/var/lib/postgresql/data \

postgres:12

# 建立sonarqube資料庫

docker exec -it postgres psql -U postgres

> create database sonarqube;

> \l # 列出所有資料庫

> \q # 退出


2.3 部署sonarqube

建立sonarqube容器,需要指定postgresql資料庫,且指定連線串對應的資料庫postgres的賬號和密碼。

docker run -d --name sonarqube --net=devops_net \

-p 9000:9000 \

-e SONAR_JDBC_URL=jdbc:postgresql://postgres/sonarqube \

-e SONAR_JDBC_USERNAME=postgres \

-e SONAR_JDBC_PASSWORD=pgpasswd \

-v /data/docker-volume/sonarqube/data:/opt/sonarqube/data \

-v /data/docker-volume/sonarqube/extensions:/opt/sonarqube/extensions \

-v /data/docker-volume/sonarqube/logs:/opt/sonarqube/logs \

sonarqube:8-community

說明:sonarqube容器啟動時,若出現無法連線資料庫問題,則很大程度上是連線到資料庫的網路或賬號問題,先確認sonarqube容器所在的網路能否連線到postgres這個名稱的主機,再確認postgres中是否有sonarqube資料庫。


2.4 部署gitlab程式碼倉庫

由於gitlab映象比較大,其中包含了postgres,redis,nginx,gitlab等多個元件,啟動、初始化配置等時間也比較長,啟動時間大約需要5-10分鐘左右,具體根據機器配置,需要耐心等待觀察日誌啟動完成即可訪問。

docker run -d --name gitlab --net=devops_net \

-p 443:443 -p 80:80 -p 2222:22 \

--hostname 192.168.56.115 \

--restart always \

--volume /data/docker-volume/gitlab/config:/etc/gitlab \

--volume /data/docker-volume/gitlab/logs:/var/log/gitlab \

--volume /data/docker-volume/gitlab/data:/var/opt/gitlab \

gitlab/gitlab-ce:latest


2.5 部署gitlab-runner

gitlab-ci是gitlab的持續整合服務,gitlab-runner用於執行gitlab-ci的任務。

gitlab-runner支援很多種執行任務的方式(稱為Executors),目前支援:SSH、Shell、Parallels、VirtualBox、Docker、Docker Machine(auto-scaling)、Kubernetes、Custom。本文選用Docker方式。

docker run -d --name gitlab-runner --net=project1_net \

--restart always \

-v /data/docker-volume/gitlab-runner/config:/etc/gitlab-runner \

-v /var/run/docker.sock:/var/run/docker.sock \

gitlab/gitlab-runner:latest


2.6 註冊Gitlab-runner

訪問gitlab地址檢視gitlab_runner註冊資訊 http://192.168.56.115,預設進去會提示重置密碼。如果密碼不法訪問可以用如下命令來重置gitlab密碼

docker exec -it gitlab bash

gitlab-rails console production

user = User.where(id: 1).first

user.password = '1qaz@WSX'

user.save!

註冊gitlab-runner。

登入gitlab平臺後,找到管理員 -> 概覽 -> Runners

將上圖git地址和token更新到下面的指令碼中

docker exec -it gitlab-runner gitlab-runner register -n \

--url http://192.168.56.115 \

--registration-token sXBPZnfHpb34qzssBFAs \

--executor docker \

--description "Docker Runner" \

--docker-image "sonarsource/sonar-scanner-cli:latest" \

--docker-volumes /var/run/docker.sock:/var/run/docker.sock


3 Gitlab與sonarqube整合

3.1 配置gitlab OAuth

登入Gitlab後,找到管理員 -> 設定-> CI/CD -> 展開-> Default to Auto DevOps pipeline for all projects選項去掉並記得儲存。

設定Gitlab OAuth:管理-> 應用-> 新建應用

最後記住儲存好Application ID和Secret


3.2 配置sonarqube ALM Integrations

1、配置sonarqube

登入sonarqube,通用設定中配置好Server base URL,此地址必須和Gitlab Redirect URI(回撥地址)的協議+主機域名(或IP)是一致的,或者先在這裡配置好之後再去配置或修改Gitlab Redirect URI。

2、配置ALM Integrations

配置 -> 通用配置 -> ALM Integrations -> Gitlab

Enabled:啟用。

GitLab URL:Gitlab地址。

Application ID:在Gitlab applications中建立的application id。

Secret:在Gitlab applications中建立的application Secret。

其他選項根據需求勾選。

確認無誤後退出賬號,點選登入後則會看到使用gitlab登入。

3、建立sonar project,生成sanner的token

4、建立gitlab project

1)、新建project,然後將程式碼上傳到gitlab 配置CI/CD流水線

2)、如下配置是gitlab-ci.yml配置,配置需要跟sonarqube對接上。

stages:

#pre maven編譯

- pre_build_maven

pre_job_maven:

image: maven:3.6.3-jdk-8

variables:

MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"

MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"

stage: pre_build_maven

script:

- source /etc/profile

- mvn $MAVEN_CLI_OPTS compile sonar:sonar -Dsonar.host.url=http://192.168.56.115:9000 -Dsonar.login=f922ba20e1f4d8659023c4080639dd53049c3ea9 -Dsonar.language=java -Dsonar.exclusions=**/target/** -Dsonar.java.binaries=.

- mvn $MAVEN_CLI_OPTS test

- mvn clean test && cat target/site/jacoco/index.html

- mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install -Dmaven.test.failure.ignore=true sonar:sonar -Dsonar.host.url=http://192.168.56.115:9000 -Dsonar.login=f922ba20e1f4d8659023c4080639dd53049c3ea9

#- mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install sonar:sonar -Dmaven.test.failure.ignore=true -Dsonar.host.url=http://192.168.56.115:9000 -Dsonar.login=f922ba20e1f4d8659023c4080639dd53049c3ea9

# - mvn sonar:sonar -X -Dsonar.projectKey=zentao-prg -Dsonar.host.url=http://192.168.56.115:9000 -Dsonar.login=f922ba20e1f4d8659023c4080639dd53049c3ea9 -Dsonar.login=admin -Dsonar.password=1qaz@WSX -Dsonar.language=java -Dsonar.java.binaries=src/ -Dsonar.projectVersion=1.0 -Dsonar.sources=. -Dsonar.exclusions=**/*test*/**

only:

- merge_requests

- main

3)、java專案採用jacoco外掛來實現程式碼覆蓋率測試。

在java專案pom.xml配置檔案新增如下jacoco拆件配置,配置修改完後會自動構建。

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<groupId>org.jacoco</groupId>

<artifactId>jacoco-maven-plugin</artifactId>

<version>0.8.4</version>

<configuration>

<destFile>target/coverage-reports/jacoco-unit.exec</destFile>

<dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>

<includes>

<include>**</include>

<include>**/service/impl/*.class</include>-->

</includes>

<!-- rules裡面指定覆蓋規則 -->

<rules>

<rule implementation="org.jacoco.maven.RuleConfiguration">

<element>BUNDLE</element>

<limits>

<!-- 方法覆蓋到50% -->

<limit implementation="org.jacoco.report.check.Limit">

<counter>METHOD</counter>

<value>COVEREDRATIO</value>

<minimum>0.50</minimum>

</limit>

<!-- 分支覆蓋到50% -->

<limit implementation="org.jacoco.report.check.Limit">

<counter>BRANCH</counter>

<value>COVEREDRATIO</value>

<minimum>0.50</minimum>

</limit>

<!-- 類覆蓋到100%,不能遺失任何類 -->

<limit implementation="org.jacoco.report.check.Limit">

<counter>CLASS</counter>

<value>MISSEDCOUNT</value>

<maximum>0</maximum>

</limit>

</limits>

</rule>

</rules>

</configuration>

<executions>

<execution>

<id>jacoco-initialize</id>

<goals>

<goal>prepare-agent</goal>

</goals>

</execution>

<execution>

<id>jacoco-site</id>

<phase>test</phase>

<goals>

<goal>report</goal>

</goals>

</execution>

</executions>

</plugin>

</plugins>

</build>


3.3 程式碼質量檢查與覆蓋率驗證

構建完程式碼後,可以觀察GITLAB上面的流水線是否構建成功。

構建成功後登入sonarqube檢視程式碼質檢結果與程式碼覆蓋率


3.4 Gitlab上的readme顯示單元測試覆蓋率

登入gitlab,選擇專案》設定》CI/CI》流水線通用設定,然後展開,在測試覆蓋率解析中輸入

Total.*?([0-9]{1,3})%

然後在專案中readme檔案中新增如下內容

[![coverage report](http://192.168.56.115/root/zentao-prg/badges/main/coverage.svg)](http://192.168.56.115/root/zentao-prg/-/commits/main)

構建完成結果會存呈現覆蓋率結果:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2841531/,如需轉載,請註明出處,否則將追究法律責任。

相關文章