目錄
1.環境準備
前言:
1)一臺Linux系統,我在這次案例中使用Centos7.5,讀者可根據自己的系統調整命令。
2)本實驗步驟非常多,第一次部署大概需要1-2個小時,請按照我描述的操作進行實驗,不要玩騷操作。
3)本實驗全程使用docker容器實驗,將會涉及大量的端口更改,所以需要保證宿主機(真機)環境乾淨,最好關閉一切不必要服務(如http,nginx等)。
要求:
1)Linux系統
2)聯網
3)配置好yum源
4)安裝好docker容器
2.整體思路
這裏一共5個部分,我們從程序員說起。
1)程序員寫好代碼,發佈到gitlab,每一次提交項目算一個版本
2)gitlab服務器存儲程序員寫好的項目,並且實現對版本的控制
3)Jenkins拉取gitlab的項目到本地,拉取到本地後將項目構建到應用服務器,Jenkins服務器是整個持續交付的核心,當運維人員做好了部署後,他將自動化的向gitlab拉取項目並構建到應用服務器上,對於使用者來說,只需要點一點鼠標就可以完成版本的上線或更新。
4)應用服務器是對外提供的下載網址
5)客戶端在應用服務器上下載最新版本的項目
3.部署Gitlab服務器
1)使用docker安裝Gitlab
使用docker搜索gitlab獲取鏡像,這裏推薦使用docker.io/gitlab/gitlab-ce
如果喜歡使用漢字的可以安裝docker.io/twang2218/gitlab-ce-zh
docker search gitlab
docker pull docker.io/gitlab/gitlab-ce
2)修改真機端口
爲了防止真機端口衝突,我們需要將真機上的ssh端口,httpd端口,https端口做修改
修改ssh端口:
重啓sshd服務後建議重連,如果使用xshell一定要記得加上端口,ssh root@ip:端口
vim /etc/ssh/sshd_config
Port 2022 #找到配置文件中的Port一行修改成2022
systemctl start sshd
刪除httpd服務:
yum remove httpd
3)創建宿主機目錄
mkdir -p /srv/gitlab/config /srv/gitlab/logs /srv/gitlab/data
4) 運行Gitlab容器
docker run
-d \ ①
--name gitlab \ ②
-p 8443:443 -p 8099:80 -p 2202:22 \ ③
-v /srv/gitlab/config:/etc/gitlab \ ④
-v /srv/gitlab/logs:/var/log/gitlab \
-v /srv/gitlab/data:/var/opt/gilab \
docker.io/gitlab/gitlab-ce ⑤
① | (可選)gitlab/gitlab-ce 在後臺運行容器(即“分離”模式)並輸出容器ID。如果您不指定此選項, 則在終端窗口中輸出正在運行的此容器的Docker日誌。 |
③ | 映射(例如“發佈”)gitlab/gitlab-ce 容器的端口80到主機上的端口8099。 第一個數字代表主機上的端口,而最後一個代表容器的端口。因此,如果您爲此選項指定 -p 49000:8080 ,您將通過端口49000訪問主機上的gitlab。 |
④ | (可選,但強烈建議)映射在容器中的`/etc/gitlab` 目錄到具有名字 gitlab 的volume。 如果這個卷不存在,那麼這個 docker run 命令會自動爲你創建卷。 如果您希望每次重新啓動gitlab(通過此 docker run ... 命令)時保持gitlab狀態,則此選項是必需的 。 如果你沒有指定這個選項,那麼在每次重新啓動後,Jenkins將有效地重置爲新的實例。 這裏將所有的容器文件關聯到宿主機的路徑下,保證容器關閉不造成數據丟失。 |
⑤ | 你下載的gitlab鏡像名 |
注意:
1)如果複製並粘貼上面的命令片段不起作用,請嘗試在此處複製並粘貼此無註釋版本
2)本地端口80、22、443可能被佔用,請使用ss -autnpl 命令查看當前端口,並做相應調整,以防止端口衝突
3)/etc/gitlab,/var/log/gitlab ,/var/opt/gilab是容器路徑,在宿主機上創建文件並進行關聯映射
4) docker.io/gitlab/gitlab-ce以自己的鏡像名爲基準
docker run -d --name gitlab -p 443:443 -p 80:80 -p 22:22 \
-v /srv/gitlab/config:/etc/gitlab \
-v /srv/gitlab/logs:/var/log/gitlab \
-v /srv/gitlab/data:/var/opt/gilab \
docker.io/gitlab/gitlab-ce
5)訪問Gitlab
在瀏覽器上輸入: http://本機ip
第一次修改密碼
使用root登錄
6)創建羣組
組名隨意,項目選public公開發布
7)創建用戶
填這三項即可
創建完後修改密碼
8)創建項目
組名選剛纔創建的,項目公開
創建之後把剛纔創建的用戶添加進來,並設置Maintainer權限(中文意思爲管理者)
9)使用創建用戶登錄
之前修改過密碼了,但是第一次登錄仍然會要求你再次修改密碼,修改密碼後登入進去,可以看到自己的如下界面,點擊進入自己的項目。
10)配置SSH免密登錄
創建祕鑰,-C後填你剛纔創建用戶填的郵箱
ssh-keygen -o -t rsa -b 4096 -C "[email protected]"
cat /root/.ssh/id_rsa.pub
將剛纔複製的公鑰填進去
11)Linux系統上傳文件
現在我們需要創建一個項目,接下來的操作在Linux系統上進行
步驟依次爲:
①創建文件夾
②git倉庫初始化
③創建文件並提交到倉庫
④配置遠程倉庫地址
⑤上傳文件以及版本
$ mkdir myapp
$ cd myapp
$ git init
$ echo 'first test : hello!' > index.html
$ git add .
$ git commit -m 'new'
$ git remote add origin [email protected]:devops/myapp.git
$ git push -u origin --all
$ git tag v1.0
$ git push --tags
做到這裏我們GitLab部署就Ok了,接下來是Jenkins的部署
4.部署Jenkins
更加詳細的Jenkins安裝請看這篇文章【https://blog.csdn.net/ck784101777/article/details/104032392】
1)搜索jenkins
有很多Jenkins版本,推薦下載docker.io/jenkinsci/blueocean
docker seach jenkins
2)安裝Jenkins
docker pull docker.io/jenkinsci/blueocean
3)創建容器
映射端口寫8088,映射目錄寫/var/jenkins_home(這個是Jenkins的工作目錄),/svr/html(這個目錄的作用下面會講,這裏先這麼寫)
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v /var/jenkins_home:/var/jenkins_home \
-v /srv/html:/srv/html
jenkinsci/blueocean
4) 訪問Jenkins
遊覽器上輸入 http://本機ip:8088,返回成功後我們需要安裝一個插件
我已經安裝了,你們要點可選插件,然後篩選,直接安裝
5)Jenkins新建項目
點擊新建
選擇構建一個自由風格的項目,由於我已經創建了一個叫myapp的項目,但是你要填myapp,如果你是按照我上面的實驗來做的話。
勾選參數化構建過程,以Git構建你的Jenkins軟件項目,參數類型(Parameter Type)選擇分支與標籤,這裏是什麼意思呢,就是說你的項目是以你的標籤命名的(git tag)
下面來配置git的來源,填寫你的git項目http地址,分支填你上面構建的參數名,點擊新增(add)添加一個子目錄(check out to a sub-direcotry),填寫項目名+分支參數(myapp-$myapp),完了之後點擊保存。
6)構建項目
回到首頁後構建你的項目
點擊構建項目(Build with Parameters),選擇一個分支,這裏我做了三次修改,所以有三個分支,如果你安裝我上面的步驟一步步到這裏可能只有一個版本,你可以回去多去提交幾次版本。點擊開始構建。
構建完成後 ,可以看得#1 變成灰藍色,點進去可以查看構建過程
7)查看項目
回到Linux系統,進入到/var/jenkins_home/workspace目錄下(取決於你映射的目錄),可以看到項目。
你構建幾次就有幾個,命名取決你之前在Jenkins中指定的git參數,如果按照我的步驟來的話應該是如下命名
5.部署Httpd服務器
1)下載httpd鏡像
建議安裝docker.io/httpd
docker search httpd
docker pull docker.io/httpd
2)啓動容器
之前在配置gitlab的時候已經使用了80端口,所以這裏要使用其他的端口;
/srv/html/目錄我在配置Jenkins的時候提過,目的就是在這裏使他們訪問的是同一個目錄,大概的思路是這樣,Jenkins需要完成自動將項目打包到httpd服務器的目錄下,但是他們都是基於容器的,爲了讓Jenkins能訪問到這個目錄(還需要改變目錄的所有者),我們需要把在宿主機上做一個公共目錄,並且爲兩個容器做映射。
mkdir -p /srv/html/deploy
chown -R jenkins.jenkins /srv/html/deploy
docker run -d -p 8077:80 -v /srv/html/:/var/www/html docker.io/httpd
3)Jenkins配置參數修改
這裏需要寫一個腳本,實現Jenkins構建後自動將項目打包到httpd服務器上,需要做到將項目文件打包並記錄當前版本,下面的內容會比較複雜並且難以理解,讀者可以先自己做一遍實驗看看效果,在體會每一步的含義。
在執行這個腳本之前,默認將在Jenkins的目錄下,也就是/var/jenkins_home/workspace
實現思路如下:
①定義一個路徑變量,爲web服務器的發佈目錄
②將Jenkins目錄下的目錄拷貝到web服務器目錄下
③進入到web目錄
④刪除.git隱藏文件,因爲是將git項目拷貝過來,所以會有.git目錄
⑤將項目打包成壓縮文件
⑥刪除項目,只保留壓縮文件
⑦生成校驗值,寫到一個文件,校驗值用於檢驗這個版本是否有損壞(將與完整的校驗值比對,若不匹配即爲損壞文件)
⑧回退到上一個目錄,寫下當前的版本文件
shell腳本如下
deploy_dir=/srv/html/deploy/pkgs
cp -r myapp-$myapp $deploy_dir
cd $deploy_dir
rm -rf $deploy_dir/.git
tar czf myapp-$myapp.tar.gz myapp-$myapp
rm -fr myapp-$myapp
md5sum myapp-$myapp.tar.gz | awk '{print $1}' > myapp-$myapp.tar.gz.md5
cd ..
[ -f live_ver ] && cat live_ver > last_ver
echo $myapp > live_ver
4)Jenkins發佈測試
進入Jenkins的項目路徑下,刪除之前構建過的項目,重新測試構建一次。
構建之後進入web服務器的目錄(/srv/html/deploy/pkgs)
cd /srv/html/deploy/pkgs
進入到這個文件夾下後,可以看到我們發佈並打包的項目和校驗碼,到這一步如果你沒有出錯就證明你在Jenkins中的配置沒有錯誤,如果沒有看到文件或者沒有按照你的格式輸出文件,你就需要去檢查一下你的Jenkins配置文件的Shell腳本是否寫錯。
查看當前版本
遊覽器上輸入 http://本機ip:8077/deploy/