Jenkins持續集成git、gitlab、sonarqube(7.0)、nexus,自動化部署實戰,附安裝包,嚴禁轉載!!!

導讀

  之前用的都是SVN,由於工作需要用到Git,求人不如求己技多不壓身多學一項技能未來就少求別人一次,系統的學一遍,自己搭建一整套環境,自動化部署(自動發版),程式碼品質檢測等等(為啥不用docker搭建環境呢,個人平時比較忙,暫未學習docker,過段時間會學docker相關,也會寫相應博文)。為啥要打水印,Wechar上有人告訴我,之前很多博文,被某些網站白嫖,然後掛到自己網站(未來部落格上都會打水印),~@¥#%¥@%#@%¥再次聲明,創作不易,嚴禁轉載!!!

踩坑

  從10月12、13(周末)天天搞到夜裡2、3點,周一至周五,由於個人原因,剛換份工作,平時也忙,個人精力有限,只能晚上花2、3小時,學習-搭建-踩坑-度娘-搭建-成功,一直到今天,才完整的搭建出來,部落格才發出來。安裝過程中,並不是一帆風順的,在此為了避免學習的小朋友踩相同的坑,最好版本和我一致,下面都會有提供我使用的安裝包。那些坑,我已經巧妙的繞開啦,按照我的步驟來,干就完事兒啦,歐力給~

演示環境

  1. mac系統
  2. 虛擬機:Centos 6.5(我分配了4G,2核,配置低了會卡!裡面用到ES伺服器配置低,服務起不來,ES腦補鏈接:點我直達,磁碟至少分50G,當初我給了20G,最後服務配置太多以後,導致服務跑步起來你了)

Git

Git是什麼

  Git 是一個開源分散式版本控制系統,用於敏捷高效地處理任何或小或大的項目

  Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體。

  Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分散式版本庫的方式,不必伺服器端軟體支援。

Git的安裝

  官網地址://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 //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圖形化客戶端

官網://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

程式碼對比

作用

  1. 解決衝突
  2. 製作修補程式
比較工作區跟暫存區的差異: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. 將暫存區中不必要的文件移除
  2. 版本回滾
  3. 只修改提交的摘要資訊
把暫存區中的文件移除出來_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. 忽略不必要的文件 

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? 

  1. 基礎功能開源,可自行搭建
  2. 可以進行許可權控制,使程式碼對部分人可見

安裝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                用於在後台執行隊列任務(非同步執行)

官網

官網://about.gitlab.com/

中國鏡像://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/

在線下載及安裝

yum install -y curl policycoreutils-python openssh-server        #安裝依賴
wget //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
只想內部使用也可以改成 //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上。

郵件服務

作用

  1. 有合併請求時,郵件通知
  2. 帳號註冊時,郵件驗證
  3. 修改密碼時,通過郵件修改

步驟

  1. 開啟QQ郵箱的smtp服務
  2. 修改gitlab配置
  3. 測試郵件服務是否正常

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]','郵件測試','部落格地址://www.cnblogs.com/chenyanbin/').deliver_now

帳號註冊和分組

用戶註冊(未開啟郵箱檢驗)

  缺點:隨便添加賬戶,亂註冊,不符合企業管理標準

用戶註冊(郵箱校驗)

  開啟校驗並真實郵箱註冊

創建組並邀請成員(配置過郵件服務,會郵件提醒)

訪問許可權

  1. private:只有組成員才能看到
  2. Internal:只要登錄的用戶就能看到
  3. Public:所有人都能看到

組許可權

  1. Guest:可以創建issue、發表評論,不能讀寫版本庫
  2. Reporter:可以克隆程式碼,不能提交
  3. Developer(推薦):可以克隆程式碼、開發、提交、push
  4. Master:可以創建項目、添加tag、保護分支、添加項目成員、編輯項目
  5. Owner:可以設置項目訪問許可權 – Visibility Level、刪除項目、遷移項目、管理組成員

生成隨機密鑰

ssh-keygen -t rsa

分支及標籤保護

為什麼要保護分支?

  保護特定的分支不被隨便合併,以免影響相應的分支

  自己部署好gitlab,然後賦予賬戶許可權,體驗下就好

註:能push就能merge,相應的許可權自我控制(master分支設置只能master可以合併)。 

第二種方式合併請求

敏捷持續集成

簡介

  持續集成是一種軟體開發實踐,即團隊開發成員經常集成他們的工作,通過每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而儘早地發現集成錯誤。

好處

  1. 節省人力成本
  2. 加快軟體開發進度
  3. 實時交付

重要組件

  1. git
  2. gitlab
  3. Jenkins:持續集成引擎
  4. maven:構建
  5. sonarqube:程式碼品質管理
  6. JDK
  7. 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="//maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="//maven.apache.org/SETTINGS/1.0.0 //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>//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>//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的代理地址,並添加到組中

  阿里雲地址://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. 在//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="//maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="//maven.apache.org/SETTINGS/1.0.0 //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>//mirrors.huaweicloud.com/repository/maven/</url>
        </mirror>
        <mirror>
            <id>aliyun</id>
            <name>aliyun Maven</name>
            <mirrorOf>*,!HuaweiCloudSDK</mirrorOf>
            <url>//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&amp;characterEncoding=utf8</sonar.jdbc.url>
                <sonar.jdbc.username>root</sonar.jdbc.username>
                <sonar.jdbc.password>root</sonar.jdbc.password>
                <sonar.host.url>//192.168.199.199:9000/sonar</sonar.host.url>
            </properties>
        </profile>
        <!--sonar配置結束-->
    </profiles>
</settings>
git init
mvn clean install
mvn sonar:sonar

Jenkins

安裝

前置條件

  1. JDK(jdk8);安裝:點我直達
  2. tomcat(tomcat9);安裝:點我直達

jenkins下載:點我直達

 

將jenkins放到tomcat中

 

問題排查(重要)

  1. 查看tomcat是否啟動
  2. 查看埠8080是否開啟:netstat -tlun
  3. 查看防火牆埠是否開啟,記得重啟防火牆
  4. 查看tomcat日誌:/var/soft/apache-tomcat-9.0.38/logs/catalina.out

 

  註:可以看到,地址被佔用了!

修改tomcat的埠號,我這裡修改為:9999,記得防火牆!!!

 

訪問

 

 

安裝推薦組件

 

創建用戶名密碼

 

實例配置

 

登錄

插件安裝及配置

系統配置

  1. jdk
  2. maven
  3. sonarqube
  4. 郵件
  5. gitlab授權
  6. 免密登錄
配置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磁碟滿了,懶得搞了,有點小遺憾,拜~

 

安裝包

 

鏈接: //pan.baidu.com/s/1OixJ3oHvjEjKLtvuvplclA  密碼: fbqs