Jenkins持續整合git、gitlab、sonarqube(7.0)、nexus,自動化部署實戰,附安裝包,嚴禁轉載!!!
導讀
之前用的都是SVN,由於工作需要用到Git,求人不如求己,技多不壓身,多學一項技能,未來就少求別人一次,系統的學一遍,自己搭建一整套環境,自動化部署(自動發版),程式碼質量檢測等等(為啥不用docker搭建環境呢,個人平時比較忙,暫未學習docker,過段時間會學docker相關,也會寫相應博文)。為啥要打水印,Wechar上有人告訴我,之前很多博文,被某些網站白嫖,然後掛到自己網站(未來部落格上都會打水印),~@¥#%¥@%#@%¥再次宣告,創作不易,嚴禁轉載!!!
踩坑
從10月12、13(週末)天天搞到夜裡2、3點,週一至週五,由於個人原因,剛換份工作,平時也忙,個人精力有限,只能晚上花2、3小時,學習-搭建-踩坑-度娘-搭建-成功,一直到今天,才完整的搭建出來,部落格才發出來。安裝過程中,並不是一帆風順的,在此為了避免學習的小朋友踩相同的坑,最好版本和我一致,下面都會有提供我使用的安裝包。那些坑,我已經巧妙的繞開啦,按照我的步驟來,幹就完事兒啦,歐力給~
演示環境
- mac系統
- 虛擬機器:Centos 6.5(我分配了4G,2核,配置低了會卡!裡面用到ES伺服器配置低,服務起不來,ES腦補連結:點我直達,磁碟至少分50G,當初我給了20G,最後服務配置太多以後,導致服務跑步起來你了)
Git
Git是什麼
Git 是一個開源的分散式版本控制系統,用於敏捷高效地處理任何或小或大的專案。
Git 是 Linus Torvalds 為了幫助管理 Linux 核心開發而開發的一個開放原始碼的版本控制軟體。
Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的方式,不必伺服器端軟體支援。
Git的安裝
官網地址:https://git-scm.com/downloads
不要慌,最下面我會提供我使用的所有安裝包
linux:yum install -y git mac:自帶的有git windows:需要自動手動下載,一直下一步即可
安裝git完成
yum自動下載的git不是最新的,如果想安裝最新的git版本,自行百度查,方法很多滴~由於時間關係,就不帶領小夥伴實操啦,功能都大差不差的。
常用命令
幫助
1、git 檢視git的幫助文件 2、git --help 檢視git的幫助文件 3、git add --help 檢視某個命令的幫助文件
版本號
生產空的本地倉庫
將檔案新增暫存區
提交
初次commit之前,需要配置使用者郵箱及使用者名稱
git config --global user.email "[email protected]" git config --global user.name "Your Name"
git commit:將暫存區的檔案提交到本地倉庫
遠端倉庫
echo "# git-test" >> README.md git init git add README.md git commit -m "first commit" git branch -M master git remote add origin https://github.com/543210188/git-test.git git push -u origin master
推送
git push -u origin master:往名字為origin的倉庫的master分支上提交變更
拉取
1、git fetch 拉取遠端倉庫的變更到本地倉庫 2、git merge origin/master 將遠端的變更,合併到本地倉庫的master分支 3、上面2個命令等價於 git pull
取消新增
git rm --cache 1.txt 注意:如果只是:git rm --cache,僅刪除暫存區裡的檔案 如果不加--cache,會刪除工作區裡的檔案,並提交到暫存區
恢復檔案
1、git checkout master 檔名
注:直接加檔名,從暫存區將檔案恢復到工作區,如果工作區已經有該檔案,則會覆蓋
加了[分支名]+檔名,表示從分支名為所寫的分支名中拉取檔案,並覆蓋工作區裡的檔案
git檔案狀態
git status 檢視git的狀態
git圖形化客戶端
官網:https://www.sourcetreeapp.com/
拉取程式碼
分支
軟體專案中啟動一套單獨的開發路線的方法,可以避免版本相容開發問題,避免不同版本之間的影響,封裝一個開發階段,解決bug的時候新建分支,用於對該bug的研究。
建立分支&檢視分支
建立分支:git branch 分支名 檢視分支:git branch 注:列出所有的分支,分支前面有*號,代表當前所在那個分支
刪除分支
刪除:git branch -d 分支名 注:不能刪除當前所在的分支
修改分支名
修改分支名:git branch -m 舊分支名 新分支名
開發v2.0版本分支(切換分支並推送到github)
切換分支:git checkout 分支名 注:如果在分支上面對檔案進行修改之後,沒有commit就切換到另外一個分支,是不允許的,必須commit之後,才能切換分支 強制切換分支:git checkout -f 分支名 注:強制切換分支,如果有未提交的變更,直接丟棄
檢視歷史
檢視提交歷史:git log
檢視最近2次的提交:git log -2
檢視最近2次提交差異:git log -p -2
檢視某個人提交的程式碼:git log --author 作者
顯示簡要的資訊:git log --oneline
整個提交歷史:git log --graph
程式碼對比
作用
- 解決衝突
- 製作補丁
比較工作區跟暫存區的差異:git diff 比較暫存區與分支差異:git diff --cached 或者 --staged 跟當前分支比較:git diff HEAD
比較當前分支與另外一個分支差異:git diff 分支名
檢視兩個分支的差異(針對已提交):git diff 分支名1 分支名2
檢視單純的一個檔案差異:git diff 檔名
檢視兩次不同提交差異:git diff commitid_1 commitid_2
檢視有變更的檔案:git diff --stat
git更改提交
用途
- 將暫存區中不必要的檔案移除
- 版本回滾
- 只修改提交的摘要資訊
把暫存區中的檔案移除出來_1:git reset HEAD 檔名 把暫存區中的檔案移除出來_2:git reset HEAD^ 修改暫存區中的摘要資訊(需要重新提交git commit -m "test"):git reset --soft HEAD^ 丟失修改過的程式碼(重置程式碼):git reset --hard HEAD^
分支合併衝突
分支合併(拿指定的分支名與當前分支進行合併):git merge 分支名
衝突解決
合併分支:git merge 分支名 檢視衝突檔案(重要):git diff --name-only --diff-filter=U
注:視情況,是隻要master的程式碼還是v2.0(分支)程式碼,我這裡處理是要2邊的程式碼。
標籤
打上標籤(給最近的打上標籤):git tag 標籤名 給指定的提交打上標籤(git log獲取commitid值,也就是獲取提交的版本):git tag 標籤名 commitid 顯示標籤(以字母序,非時間):git tag 顯示該標籤提交的那次相關資訊:git show 標籤名 刪除標籤(不會刪除那次提交):git tag -d 標籤名 將標籤推送到遠端伺服器上(標籤必須存在):git push origin 分支名 標籤名 刪除遠端伺服器上的標籤: 1、刪除本地的標籤:git tag -d 標籤名 2、刪除遠端的:git push origin :refs/tags/標籤名
gitignore檔案
用途
-
忽略不必要的檔案
1、建立gitignore檔案:touch .gitignore 2、在.gitignore新增忽略的目錄: target .idea .log:表示忽略專案中所有以.log結尾的檔案 123?.log:表示忽略專案中所有以123加任意字元的檔案 /error.log:表示忽略專案中根目錄中的error.log 這個檔案 src/main/test/:表示忽略/src/main/test/目錄下的所有檔案 *.class **/java/:匹配所有java目錄下的所有檔案 !/error.log:表示在之前的匹配規則下,被命中的檔案,可以使用!對前面的規則進行否定
如果專案已經推送到遠端伺服器中,可通過這種方式刪除 1、先刪除本地暫存區檔案(git rm -rf --cache target/):git rm -rf --cache 目錄名 2、提交:git commit -m "刪除本地暫存區" 3、推送:git push
Gitlab
簡介
GitLab 是一個用於倉庫管理系統的開源專案,使用Git作為程式碼管理工具,並在此基礎上搭建起來的web服務。安裝方法是參考GitLab在GitHub上的Wiki頁面。
為什麼要使用gitlab?
- 基礎功能開源,可自行搭建
- 可以進行許可權控制,使程式碼對部分人可見
安裝gitlab(Centos6.5)
目錄結構及說明
/etc/gitlab/gitlab.rb #gitlab配置檔案 /opt/gitlab #gitlab的程式安裝目錄 /var/opt/gitlab #gitlab目錄資料目錄 /var/opt/gitlab/git-data #存放倉庫資料 gitlab-ctl reconfigure #重新載入配置 gitlab-ctl status #檢視當前gitlab所有服務執行狀態 gitlab-ctl stop #停止gitlab服務 gitlab-ctl stop nginx #單獨停止某個服務 gitlab-ctl tail #檢視所有服務的日誌 Gitlab的服務構成: nginx: 靜態web伺服器 gitlab-workhorse 輕量級反向代理伺服器 logrotate 日誌檔案管理工具 postgresql 資料庫 redis 快取資料庫 sidekiq 用於在後臺執行佇列任務(非同步執行)
官網
官網:https://about.gitlab.com/
國內映象:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/
線上下載及安裝
yum install -y curl policycoreutils-python openssh-server #安裝依賴 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/gitlab-ce-13.1.11-ce.0.el6.x86_64.rpm --no-check-certificate #centos6.5 rpm -ivh gitlab-ce-13.1.11-ce.0.el6.x86_64.rpm # 安裝包gitlab sudo service postfix start sudo chkconfig postfix on
linux其他版本安裝方式
centos其他版本下載包方式,當然啦,也可以先把包下載到本地,然後在丟到linux,執行安裝效果是一樣的。
修改對外開放域名或ip
vim /etc/gitlab/gitlab.rb
開啟後有一行 external_url 的設定改成要對外開放 web 的 url ,
例如我可以指定 git.chenyanbin.com
只想內部使用也可以改成 http://192.168.199.199:8888 這樣的內部IP地址.
配置生效:gitlab-ctl reconfigure
重啟:gitlab-ctl restart
設定防火牆埠(防火牆已全部關閉的話,可忽略):vim /etc/sysconfig/iptables
啟動gitlab
sudo gitlab-ctl reconfigure sudo lokkit -s http -s ssh
停止gitlab:gitlab-ctl stop 重啟gitlab:gitlab-ctl start
登入
注:第一次登入時,需要設定初始密碼,然後用root+密碼登入即可
建立專案並推送到gitlab
本地新建一個專案並用git,將資料夾推送到gitlab上。
郵件服務
作用
- 有合併請求時,郵件通知
- 賬號註冊時,郵件驗證
- 修改密碼時,通過郵件修改
步驟
- 開啟QQ郵箱的smtp服務
- 修改gitlab配置
- 測試郵件服務是否正常
gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.qq.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "[email protected]" gitlab_rails['smtp_password'] = "郵箱隨機字串" gitlab_rails['smtp_domain'] = "qq.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true user['git_user_email'] = "[email protected]" gitlab_rails['gitlab_email_from'] = '[email protected]'
重啟配置檔案:gitlab-ctl reconfigure 重啟服務:gitlab-ctl restart
測試郵件
gitlab-rails console Notify.test_email('[email protected]','郵件測試','部落格地址:https://www.cnblogs.com/chenyanbin/').deliver_now
賬號註冊和分組
使用者註冊(未開啟郵箱檢驗)
缺點:隨便新增賬戶,亂註冊,不符合企業管理標準
使用者註冊(郵箱校驗)
開啟校驗並真實郵箱註冊
建立組並邀請成員(配置過郵件服務,會郵件提醒)
訪問許可權
- private:只有組成員才能看到
- Internal:只要登入的使用者就能看到
- Public:所有人都能看到
組許可權
- Guest:可以建立issue、發表評論,不能讀寫版本庫
- Reporter:可以克隆程式碼,不能提交
- Developer(推薦):可以克隆程式碼、開發、提交、push
- Master:可以建立專案、新增tag、保護分支、新增專案成員、編輯專案
- Owner:可以設定專案訪問許可權 - Visibility Level、刪除專案、遷移專案、管理組成員
生成隨機金鑰
ssh-keygen -t rsa
分支及標籤保護
為什麼要保護分支?
保護特定的分支不被隨便合併,以免影響相應的分支
自己部署好gitlab,然後賦予賬戶許可權,體驗下就好
注:能push就能merge,相應的許可權自我控制(master分支設定只能master可以合併)。
第二種方式合併請求
敏捷持續整合
簡介
持續整合是一種軟體開發實踐,即團隊開發成員經常整合他們的工作,通過每個成員每天至少整合一次,也就意味著每天可能會發生多次整合。每次整合都通過自動化的構建(包括編譯,釋出,自動化測試)來驗證,從而儘早地發現整合錯誤。好處
- 節省人力成本
- 加快軟體開發進度
- 實時交付
重要元件
- git
- gitlab
- Jenkins:持續整合引擎
- maven:構建
- sonarqube:程式碼質量管理
- JDK
- Tomcat
jdk和maven安裝
jdk安裝:點我直達
maven安裝:點我直達
nexus私服安裝
官網:點我直達
下面百度雲盤也會提供喲~
解壓
tar -zxvf nexus-3.27.0-03-unix.tar.gz -C /usr/local
修改啟動埠號
vim /usr/local/nexus-3.27.0-03/etc/nexus-default.properties
開啟防火牆埠
注:因為我本地沒有使用8081埠,所以預設埠可以使用。但是防火牆埠記得開放喲~
vim /etc/sysconfig/iptables
重啟防火牆
service iptables restart
啟動nexus
注意:jdk版本必須得1.8!!!nexus版本不同,可能需要的jdk版本不同
nexus不推薦使用root使用者啟動(可忽略) 也可以自己手動建立個使用者,然後加入到組,賦予許可權,步驟如下 1、useradd nexus 2、chown -R nexus:nexus xxxx/xxxx/nexus-3.27xxx/
3、chown -R nexus:nexus xxxx/xxxx/sonatype-work/ 4、su nexus 5、./nexus start
踩了個坑
小技巧
注:./nexus start,啟動完成之後,檢視nexus是否啟動:ps aux|grep nexus,若沒有啟動的話,可以使用:./nexus run;此時啟動專案就會提示哪裡出錯啦~
訪問
注:點選右上角登入,預設賬號密碼:admin/admin123;從nexus3.17以後,預設密碼改為隨機的了,檔案路徑在:/usr/local/sonatype-work/nexus3/admin.password裡!!!
修改最大檔案數(預設1024)
注:記得重啟!!!
設定nexus開機自啟動
vim /etc/rc.d/rc.local
nexus安裝及使用
專案maven大概過程分析
設定maven的setting.xml
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <pluginGroups/> <proxies/> <servers> <server> <id>ybchen-releases</id> <username>admin</username> <password>admin</password> </server> <server> <id>ybchen-snapshots</id> <username>admin</username> <password>admin</password> </server> </servers> <mirrors/> <profiles> <profile> <id>ybchen</id> <activation> <activeByDefault>false</activeByDefault> </activation> <!-- 私有庫地址--> <repositories> <repository> <id>ybchen</id> <url>http://192.168.199.199:8088/repository/maven-public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <!--外掛庫地址--> <pluginRepositories> <pluginRepository> <id>ybchen</id> <url>http://192.168.199.199:8088/repository/maven-public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>ybchen</activeProfile> </activeProfiles> </settings>
設定nexus的代理地址,並新增到組中
阿里雲地址:http://maven.aliyun.com/nexus/content/groups/public/
測試
本地庫,我已經清空,所有下載的都會先去nexus看看,沒有的話,才會走阿里雲代理上下載,然後還會下載到nexus。
將本地jar上傳至nexus
<distributionManagement> <repository> <id>ybchen-releases</id> <name>Nexus Release Repository</name> <url>http://xxx.xxx.xxx.xxx:port/repository/maven-releases/</url> </repository> <snapshotRepository> <id>ybchen-releases</id> <name>Nexus Release Repository</name> <url>http://xxxx.xxxx.xxx.xxx:port/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>
安裝mysql
點我直達
程式碼質量管理平臺sonarQube安裝及使用
前置條件
- mysql 5.6 | 5.7
- jdk1.8
我使用的是7.0,版本要求:點我直達
下載地址:點我直達
官網
點我直達
安裝
1、依賴:yum install unzip -y 2、解壓:unzip sonarqube-7.0.zip 3、移動:mv sonarqube-7.0 /usr/local/ 4、切換: cd /usr/local/ 5、登入mysql:mysql -u root -p 6、建立庫:CREATE DATABASE sonar DEFAULT CHARACTER SET utf8; 7、退出mysql:exit 8、進入sonarqube:cd sonarqube-7.0/conf/
修改配置
vim sonar.properties
主要配置以下內容 sonar.jdbc.username=root sonar.jdbc.password=root sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false sonar.web.host=0.0.0.0 sonar.web.context=/sonar sonar.web.port=9000
啟動
useradd sonar chown -R sonar:sonar /usr/local/sonarqube-7.0 su sonar cd /usr/local/sonarqube-7.0/bin/linux-x86-64/ ./sonar.sh start
訪問
記得開放防火牆埠:9000,賬號/密碼:admin/admin
漢化
安裝完,重啟服務再次開啟網頁即可
sonar7.0的中文包,網頁線上安裝不上,我是去github上下載,手動安裝的,按照以下幾步即可,下面我也會提供,我直接下載的是jar包,原始碼包還得編碼(因為我懶) 1. 在https://github.com/SonarCommunity/sonar-l10n-zh,下載漢化包原始碼; 2. 本地打包,cmd裡面,在解壓包裡面執行: mvn install 3. 將打好的jar包,放到: sonarqube/extensions/plugins 目錄先; 4. 重啟sonar,即可
具體操作如下,github地址:點我直達
使用
settings.xml ============================ <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <pluginGroups></pluginGroups> <proxies></proxies> <servers></servers> <mirrors> <!--maven代理開始--> <mirror> <id>huaweicloud</id> <mirrorOf>*,!HuaweiCloudSDK</mirrorOf> <url>https://mirrors.huaweicloud.com/repository/maven/</url> </mirror> <mirror> <id>aliyun</id> <name>aliyun Maven</name> <mirrorOf>*,!HuaweiCloudSDK</mirrorOf> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> <!--maven代理結束--> </mirrors> <profiles> <!--sonar配置開始--> <profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <sonar.jdbc.url>jdbc:mysql://192.168.199.199:3306/sonar?useUnicode=true&characterEncoding=utf8</sonar.jdbc.url> <sonar.jdbc.username>root</sonar.jdbc.username> <sonar.jdbc.password>root</sonar.jdbc.password> <sonar.host.url>http://192.168.199.199:9000/sonar</sonar.host.url> </properties> </profile> <!--sonar配置結束--> </profiles> </settings>
git init mvn clean install mvn sonar:sonar
Jenkins
安裝
前置條件
- JDK(jdk8);安裝:點我直達
- tomcat(tomcat9);安裝:點我直達
jenkins下載:點我直達
將jenkins放到tomcat中
問題排查(重要)
- 檢視tomcat是否啟動
- 檢視埠8080是否開啟:netstat -tlun
- 檢視防火牆埠是否開啟,記得重啟防火牆
- 檢視tomcat日誌:/var/soft/apache-tomcat-9.0.38/logs/catalina.out
注:可以看到,地址被佔用了!
修改tomcat的埠號,我這裡修改為:9999,記得防火牆!!!
訪問
安裝推薦元件
建立使用者名稱密碼
例項配置
登入
外掛安裝及配置
系統配置
- jdk
- maven
- sonarqube
- 郵件
- gitlab授權
- 免密登入
配置jdk和maven
配置郵件
配置sonarqube
繼續到全域性配置裡設定sonarqube
授權登入
生成金鑰
yum -y install openssh-clients ssh-keygen -t rsa
生成的key放到gitlab
more ~/.ssh/id_rsa.pub
建立專案
注:git方式拉程式碼,直接不報紅,代表搭建成功
jenkins手動發版測試
linux建立目錄 1、cd / 2、mkdir springboot_demo
jenkins配置
clean install mv target/*.jar /springboot_demo/ cd /springboot_demo BUILD_ID= java -jar spring-boot-demo-0.0.1-SNAPSHOT.jar >log 2>&1 &
clean install mv target/*.jar /springboot_demo/ cd /springboot_demo BUILD_ID= java -jar spring-boot-demo-0.0.1-SNAPSHOT.jar >log 2>&1 &
整合sonar然後釋出
剛開始的時候sonarqube裡面沒有專案隨著程式碼的重新發布,會將專案也提交到sonarqube中
#projectKey專案的唯一標識,不能重複 sonar.projectKey=yb sonar.projectName=springboot-test sonar.projectVersion=1.0 sonar.sourceEncoding=UTF-8 sonar.modules=java-module # Java module java-module.sonar.projectName=test java-module.sonar.language=java # .表示projectBaseDir指定的目錄 java-module.sonar.sources=src java-module.sonar.projectBaseDir=. java-module.sonar.java.binaries=target/
提交後自動釋出
功能描述
原生代碼修改完成之後,往gitlab上推程式碼,然後Jenkins自動打包發版程式,不用人工手動發版。
安裝外掛(gitlab)
裝完外掛後,虛擬機器上的磁碟滿了,導致服務起不來,今天先到這吧,不搞這玩意了(明天要搞其他東西,搭建這一整套東西,噁心我幾百回了,處處坑~),自行去找度娘吧,只需要簡單配置2步就好,前面服務都全部搭建出來了,這個因為linux磁碟滿了,懶得搞了,有點小遺憾,拜~
安裝包
連結: https://pan.baidu.com/s/1OixJ3oHvjEjKLtvuvplclA 密碼: fbqs