摘自百度:持續內建是一種軟體開發實踐,即團隊開發成員經常內建他們的工作,通過每個成員每天至少內建一次,也就意味着每天可能會發生多次內建。每次內建都通過自動化的建構(包括編譯,釋出,自動化測試)來驗證,進而盡早地發現內建錯誤。
gitlab是一個基于 git 的倉庫管理程式,也是一個友善軟體開發的強大完整應用。
gitlab結合jenkins
Docker, 是一個開源的應用容器引擎, 可以輕松的部署各個應用。
GitLab,是一個利用 Ruby on Rails 開發的開源應用程式,實作一個自托管的Git項目倉庫,可通過Web界面進行通路公開的或者私人項目安裝,十分友善。
Jenkins, 是一個開源的持續內建的伺服器,Jenkins開源幫助我們自動建構各類項目。Jenkins強大的插件式,使得Jenkins可以內建很多軟體,可能幫助我們持續內建我們的工程項目(可以結合git,svn等建構項目,在伺服器上打包)。
Docker簡介及其安裝,可以參考本人另一篇部落格->
Docker入門及centOS7下安裝gitlab官方推薦的記憶體為2g以上,而且cpu占有高,部落客的伺服器總共隻有2g記憶體(還是1核的QAQ),需通過增加4G的swap空間來提升性能。
配置高土豪可忽略這步
因為gitlab太占資源,本人雲服務為1核2g,gitlab推薦配置為2g以上
第一次啟動鏡像時cpu和記憶體使用占太高,導緻伺服器崩潰,,
這裡通過swap把硬碟記憶體配置設定給記憶體(雖然讀寫慢但總比崩潰好)
#檢視系統存儲空間
df -h
#檢視swap使用情況 機關m
free -m
#在根目錄建立充當臨時記憶體空間的swap檔案 大小為4g 命名為swapfile
cd #
#sudo fallocate -l 4G /swapfile #這種方案在我這邊報fallocate failed: Operation not supported檔案系統不支援,可能因為筆者是雲伺服器 是以采用其他方式建立
#建立空間4g 4096個1m 可自行調整
dd if=/dev/zero of=/swapfile bs=4096 count=1M
#設定檔案權限
chmod 600 /swapfile
#将/swapfile指定為交換檔案
mkswap /swapfile
#啟用
swapon /swapfile
#永久生效,這步如果不設定重新開機伺服器就沒了 可能會導緻當機
vi /etc/fstab #在這個檔案最後一行添加 /swapfile swap swap sw 0 0
#建立完可以 ls -lh /swapfile 檢查檔案大小
ls -lh /swapfile
#檢視使用情況
swapon -s
#停用
swapoff /swapfile
#搜尋docker鏡像
docker search gitlab
#拉取dockerhub上第一個
docker pull gitlab/gitlab-ce
#運作鏡像 配置低啟動後剛開始502 三五分鐘後才能正常進入頁面。。。(hostname這邊填寫自己的ip或者域名)
docker run -d \
--hostname 111.230.47.36 \
--publish 543:443 --publish 81:80 --publish 222:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce
#其中 --name=gitlab 指定容器名稱 -d 背景運作容器并傳回容器id -p:指定映射端口号,本文是将ssh的22端口映射為222端口,web通路的80端口映射為81端口 --volume為挂載容器的資料檔案到本地(用來指定挂載目錄,将config配置目錄、data資料目錄、logs日志目錄挂載到主控端上、資料持久化防止容器停止後資料丢失)
#檢視容器啟用情況 health代表健康啟動 starting代表還在啟動中 如果出現unhealthly 可docker logs xxx檢視日志
首次進入需設定root使用者密碼
配置gitlab伺服器通路資訊
上述方式啟動容器沒有問題并能夠成功通路,但在gitlab上建立項目時,生成項目url的通路位址是按容器的hostname生成,即容器id,這邊配置一個固定的url通路位址
/etc/gitlab/:配置檔案所在的目錄
/var/log/gitlab:日志所在目錄
/var/opt/gitlab:資料所在目錄
# 詳細參考 https://blog.csdn.net/michael_base/article/details/77966647
# 配置http協定所使用的通路位址 這邊可以進入容器修改 docker exec -it gitlab /bin/bash
# 但因為啟動容器的時候已将容器内的配置檔案/etc/gitlab挂在到本地/srv/gitlab/config 直接在本地做配置
# 修改gitlab.rb 預設全為注釋
# 調整unicorn程序數,減少記憶體占用 預設為1調為2
unicorn['worker_processes'] = 2
unicorn['worker_timeout'] = 120
# 調整時區為上海
gitlab_rails['time_zone'] = 'Asia/Shanghai'
#配置http協定時使用通路位址 (内網ip)
external_url 'http://111.230.47.36:81'
# 配置ssh協定所使用的通路位址和端口
gitlab_rails['gitlab_ssh_host'] = '111.230.47.36'
gitlab_rails['gitlab_shell_ssh_port'] = 222
#預設情況下 nginx監聽端口為external_url中定義的,或者預設的80/443 docker run時暴露容器80端口
#修改nginx的監聽端口
# nginx['listen_port'] = nil #預設
nginx['listen_port'] = 80
#最後重新開機容器讓配置生效docker restart gitlab或者在容器内執行 gitlab-ctl reconfigure 讓配置生效 此過程還需幾分鐘
修改配置
#這邊本人删掉容器出現個問題 網絡被占用 /usr/bin/docker-current: Error response from daemon: service endpoint with name gitlab already exists.
#解決方案
#強制删除
docker rm -f xxx
#清理網絡占有
docker network disconnect --force bridge gitlab
#檢視是否有同名容器占用
docker network inspect gitlab
取消注冊功能
由于gitlab一般用于小團隊,本人又是用于公網和團隊共同使用,取消注冊步驟如下
登陸root使用者 -> settings -> Sign-in Restrictions -> Sign-up enbaled是否開啟注冊功能取消
預設root使用者為管理者,可以添加編輯删除使用者等權限操作。
兩種方式送出到gitlab
1.先在gitlab建立一個空項目(可以Add README.md檔案做測試),然後本地拉取後再做送出
1.建立使用者linjw 并建立一個項目,public:都能看 private:私有 自己和小組成員可看
2.用idea拉取到本地(如網絡需代理的話需給git設定代理,可以用http或者ssh免密)
#檢視目前git代理
git config --get --global http.proxy
#設定全局代理
git config --global http.proxy 代理ip:port
#檢視目前資訊
git config --list
#全局修改目前郵箱密碼 idea檢視git曆史記錄的使用者名采用這邊的配置
git config --global user.name 使用者名 (目前項目: git config -- user.name 使用者名 )
git config --global user.email 郵箱
3.拉取後修改README.md檔案然後送出,會提示輸入密碼,輸入一次後即可送出,在gitlab項目可以看到送出記錄
2.本地釋出完整項目到gitlab(用戶端和gitlab需建立ssh通信)
#mac下建立ssh密鑰(已有的話忽略) 想同時存在github和gitlab配置第二個密鑰 參考 https://www.w3ctech.com/topic/2040 https://blog.csdn.net/zengshunyao/article/details/50212987
#查詢指令
cat ~/.ssh/id_rsa.pub
#建立密鑰
ssh-keygen -t rsa -C "[email protected]" #賬号郵件位址
#驗證github 出現使用者名success說明成功
ssh -T [email protected]
#驗證gitlab 後面跟自己gitlab伺服器位址 如果出現Could not read from remote repository.說明ssh互信沒成功
ssh -T git@gitlab #gitlab為别名 預設為HostName
#或者git clone ssh的方式判斷是否能夠拉取下來
git clone ssh://[email protected]:222/linjw/ssh.git
同時配置保留github和gitlab的ssh key
1.在idea建立一個項目(這邊我建立springboot項目,都一樣撒),建立本地git倉庫
2.vcs->import into version control->create git repository,open要送出的檔案後,變色git化,這時項目右鍵可以使用Git,選擇add把準備要送出的檔案加到索引庫。
3.右鍵git commit directory -> commit and push(取消perform code analysis檢查代碼選項可以變快) 第一次送出需指定遠端倉庫位址
pull/commit 可能出現的問題問題及解決方案:
Push failed: Failed with error: fatal: Could not read from remote repository (送出時沒有認到git倉庫)
#檢視目前使用倉庫位址
git remote -v
#删除舊的
git remote remove origin
#添加新的(後面位址填自己的)
git remote add origin http://111.230.47.36:81/linjw/gitlab.git #也可以選擇ssh
you are not allowed to push code to protected branches on this project(分支被保護)
#詳細參考 https://stackoverflow.com/questions/32246503/how-to-fix-you-are-not-allowed-to-push-code-to-protected-branches-on-this-proje
Push rejected: Push master to origin/master was rejected by remote(拒絕送出到master分支)
一:通過master送出
#預設master分支為protected狀态,除了master權限的人員不可push、delete等操作
1.進入gitlab要送出的項目首頁 SettingsRepositoryProtected Branches
2.第一次送出到master,将狀态改為unprotected或者允許送出和合并裡選擇developer+Masters,然後再做送出。
#仍然報這個錯,原因可能是建立倉庫的時候,生成了個readme檔案,導緻不同步,是以無法push,也無法pull 解決方案
#1.先從master分支pull下來 然後再push
git pull origin master --allow-unrelated-histories
#2.在Terminal終端中填寫送出指令
git push -u origin master
#強制推送
git push -u origin master -f
#這邊不知道為什麼剛開始設定為unprotected才可以送出,送出過後再protected又可以。。
二:通過develop送出
設定保護分支的時候 一般模式為:
1.master分支(原始分支) 允許推送和合并 隻有master分支可以
2.建立develop分支 設定developer+Masters(開發人員+主持人(master(default))) 允許推送和合并
#gitlab頁面 項目RepositoryBranches建立develop分支 建立切換為develop分支且developer+Masters
3.idea vcsupdate project顯示剛剛建立的分支 并checkout,在develop上送出會變得容易很多
送出指令
配置分支保護
設定unprotect
使用develop送出
Docker安裝jenkins
jenkins是一個用Java編寫的開源的持續內建工具,可以于GitLab等代碼管理工具關聯,觸發一定條件之後,實作自動進行測試、編譯、部署等一系列動作。
#jenkins的特性
1.易于安裝-隻要把jenkins.war部署到servlet容器,不需要資料庫支援。
2.易于配置-所有配置都是通過其提供的web界面實作。
3.內建RSS/E-mail通過RSS釋出建構結果或當建構完成時通過e-mail通知。
4.生成JUnit/TestNG測試報告。
5.分布式建構支援Jenkins能夠讓多台計算機一起建構/測試。
6.檔案識别:Jenkins能夠跟蹤哪次建構生成哪些jar,哪次建構使用哪個版本的jar等。
7.插件支援:支援擴充插件,您可以開發适合自己團隊使用的工具。
#拉取官方jenkisn鏡像 這個鏡像裡自帶jdk
sudo docker pull jenkins
#初次安裝jenkins 檔案夾歸屬必須是1000 參考 https://blog.csdn.net/mmd0308/article/details/77206563?locationNum=6&fps=1 不然會報權限錯誤
cd /home
mkdir jenkins_home
#更改檔案夾歸屬者
sudo chown -R 1000:1000 jenkins_home
#檢視
ls -nd jenkins_home
#啟動鏡像 -d背景運作 --privileged=true 添加一些權限 -p端口映射 -v挂載/var/jenkins_home到本地
docker run -d \
--name jenkins \
--privileged=true \
-p 9090:8080 \
-p 50000:50000 \
-v /home/jenkins_home:/var/jenkins_home jenkins
#在挂載的目錄檢視初始密碼
cat /home/jenkins_home/secrets/initialAdminPassword
#進入 ip:9090頁面 輸入初始密碼 并安裝需要的插件 安裝的插件會存在挂載目錄中
jenkins結合gitlab持續內建
jenins預設使用者可以做所有事,為了安全應當設定安全矩陣或者登陸使用者可以做任何事
系統管理 -> Configure Global Security ->授權政策-> 登陸使用者可以做任何事
1.確定已安裝有GitLab 插件 如果沒有安裝在 系統管理 -> 插件管理裡安裝
2.系統管理 -> 配置
安裝插件
建構步驟
建立一個新任務 -> 建構一個自由風格的軟體項目 -> 源碼管理選擇git -> 添加ssh或token認證 -> 在jenkins容器内建立ssh,添加到gitlab裡項目建立人的ssh中
Credentials -> Add Credentials 添加證書存放私鑰
進入項目點選立即建構
這邊要注意,因為jenkins是Docker安裝 是以gitlab與jenkins關聯 要用到容器的
# jenkins容器内生成ssh密鑰
# 進入jenkins容器 建立密鑰
docker exec -it jenkins /bin/bash
# 進入容器後建立.ssh目錄,建立密鑰檔案私鑰id_rsa,公鑰id_rsa.pub
mkdir ~/.ssh && cd ~/.ssh
ssh-keygen -t rsa
# 一直回車即可擷取
#檢視jenkins容器内的公鑰
cat ~/.ssh/id_rsa.pub
#之後将ssh公鑰加在gitlab 在容器内git clone測試是否能拉取下來 如果可以說明ssh互信成功
jenkins配置證書
#從主控端進入容器
docker exec -it jenkins /bin/bash
#檢視jenkins容器内私鑰
cat ~/.ssh/id_rsa
#在jenkins裡配置私鑰到證書裡
容器内建立ssh
建構項目
添加私鑰
添加gitlab項目
建構後
修改要建構項目的配置,将其建構為jar包
參考
https://blog.csdn.net/u011904605/article/details/546048511.需確定安裝有gradle plugin插件
2.jenkins項目 -> 配置 -> 建構 -> 增加建構步驟 -> Involk gradle script -> 更多 -> use gradle wrapper
3.之後按下面操作
如果建構的時候出現問題 點選建構任務檢視控制台輸出
選擇gradle建構方式
選擇建構後儲存檔案
成功建構為jar包
自定義命名jar包建構
build.gradle添加以下配置
#archivesBaseName為自定義jar包名 不寫的話預設為項目名
archivesBaseName = "gitlab-jenkins_${releaseTime()}"
#jar包版本
version = '1.0-FINAL'
#擷取目前時間
def releaseTime() {
//return new Date().format("yyyy-MM-dd-hh-mm-ss", TimeZone.getTimeZone("UTC")) //UTC為國際時間
return new Date().format("yyyy-MM-dd-HH-mm-ss")
}
送出到gitlab 建構項目效果
根據時間和自定義版本命名jar
代碼一送出到gitlab就觸發jenkins建構項目(我認為大型項目不推薦。。因為建構很花時間,除非很少有送出事件,比如很少改動的master分支)
這邊主要利用到gitlab的webhook功能
webhock:webhook是個在特定情況下觸發的一種api. 越來越多在web上的操作被描述為事件
gitlab中解釋為: web 鈎子用于在項目發生相關事件時通知外部伺服器。(在這邊的項目事件為項目的更改,外部伺服器為jenkins)
實作步驟
1.jenkins安裝Gitlab Hook Plugin還有Build Authorization Token Root Plugin插件,兩個插件安裝完成後,項目配置 -> 建構觸發器(将多出Build when a change is pushed to GitLab. GitLab webhook URL: xxx選項,勾選并複制這個url),
2.登陸gitlab進入要配置的項目,添加webhock 項目首頁 -> Settings -> Integrations -> 添加上面的url并建立webhock,建立成功後test檢視是否成功(在jenkins檢視是否在建構,test好像預設是測試master分支的?)
gitlab添加webhock,jenkins建構觸發器
gitlab上測試webhock
這邊我在gitlab測試的時候出現403,view detail報了Error 403 anonymous is missing the Job/Build permission的錯
解決方案:
jenkins -> 系統管理 -> Configure Global Security -> 取消防止跨站點請求僞造的勾選
jenkins - 系統管理 -> 系統設定 -> 取消 Enable authentication for '/project' end-point的勾選
之後在idea上送出了代碼把develop,jenkins也正常的進行建構develop分支上的項目。
總結
1.有錢真好QAQ,剛開始部落客因為配置低饒了點彎路,在這提供了一種解決方案,老實說1核2g的配置運作gitlab挺卡的,
2.由于部落客也是一邊學習一邊寫筆記,記錄着一些踩過的坑,寫得不好的地方見諒
3.微服務,docker是這幾年十分火熱的技術,也算是個趨勢,還是得多學學~