devops系統自動化部署流程
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Azure DevOps搭建自動化部署CICD流水線dev
- 客戶管理系統如何使流程自動化
- 本地部署GPT全流程自動化檔案GPT
- CRM系統自動化業務流程的好處
- 掌握自動化部署,拿下DevOps半壁江山還遠嗎?dev
- 透過CRM系統實現工作流程自動化
- 前端流程自動化前端
- jenkins 自動化流程Jenkins
- 搭建自動化 Web 頁面效能檢測系統 —— 部署篇Web
- RPA 機器人自動流程化的三種部署形式機器人
- 架構設計:服務自動化部署和管理流程架構
- DevOps專題|基礎Agent部署系統dev
- Azure Terraform(五)利用Azure DevOps 實現自動化部署基礎資源ORMdev
- Maven 自動化部署Maven
- Maven自動化部署Maven
- kubernetes+Azure DevOps實現.Net Core專案的自動化部署&均衡負載dev負載
- Azure Terraform(七)利用Azure DevOps 實現自動化部署基礎資源(補充)ORMdev
- DevOps 自動化實踐 — K8s 自動化執行 Database MigrationdevK8SDatabase
- DevOps 自動化實踐:提升效率的 Botdev
- DevOps 自動化實踐 —— Incident 工作流devIDE
- DevOps,CI,CD,自動化簡單介紹dev
- 什麼是任務自動化與流程自動化? - infoworld
- jenkins的安裝和配置(flask結合jenkins半自動化部署流程)JenkinsFlask
- vue 自動化部署 jenkins 篇VueJenkins
- Python自動化部署工具-FabricPython
- Mysql5.6 自動化部署MySql
- Docker 之 Jenkins自動化部署DockerJenkins
- .NET網站自動化部署網站
- Jenkins 自動化(CI/DI)部署Jenkins
- vue自動化部署指令碼Vue指令碼
- SpringBoot手動部署到Tomcat和自動化熱部署Spring BootTomcat熱部署
- [自動化]基於kolla的自動化部署ceph叢集
- Azure DevOps Pipelines執行RobotFramework自動化程式碼devFramework
- 專案部署點一下按鈕就可以,全流程自動化
- Android系統啟動流程(四)Launcher啟動過程與系統啟動流程Android
- 對賬系統的自動化部署,是構建“雙碳”財稅體系的關鍵
- Android 系統啟動流程Android
- 系統的啟動流程