day62-github与gitlab的使用
學習目標
-
能夠使用GitHub創建遠程倉庫并使用
-
能夠安裝部署GitLab服務器
-
能夠使用GitLab創建倉庫并使用
-
掌握CI/CD的概念
-
掌握藍綠部署, 滾動更新,灰度發布的概念
GitHub是目前最火的開源項目代碼托管平臺。它是基于web的Git倉庫,提供公有倉庫和私有倉庫,但私有倉庫是需要付費的。
GitLab可以創建免費的私有倉庫。
GitLab是利用 Ruby開發的一個開源的版本管理系統,實現一個自托管的Git項目倉庫,可通過Web界面進行訪問公開的或者私人項目。它擁有與Github類似的功能,能夠瀏覽源代碼,管理缺陷和注釋。可以管理團隊對倉庫的訪問,它非常易于瀏覽提交過的版本并提供一個文件歷史庫。團隊成員可以利用內置的簡單聊天程序(Wall)進行交流。它還提供一個代碼片段收集功能可以輕松實現代碼復用,便于日后有需要的時候進行查找。
github
注冊github賬號
github官網地址: https://www.github.com
登錄注冊賬號時填寫的郵箱,找到github發的郵件,打開并點擊里面的Verify email address
創建項目
我們就創建好了第一個項目。
使用github遠程倉庫
第1步: 在gibhub上獲取克隆地址
第2步: 克隆項目到本地linux,默認克隆到當前目錄
[root@vm1 ~]# git clone https://github.com/linux-daniel/daniel_project.git Cloning into 'daniel_project'... remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), done.[root@vm1 ~]# ls daniel_project/ README.md[root@vm1 ~]# cat daniel_project/README.md # daniel_project 教學測試項目第3步: 提交代碼文件
在克隆下來的倉庫里準備一個代碼文件 [root@vm1 ~]# cd daniel_project/ [root@vm1 daniel_project]# vim hello.py print("hello world")[root@vm1 daniel_project]# git add hello.py [root@vm1 daniel_project]# git commit -m "提交hello.py" [master b59e1d6] 提交hello.py1 file changed, 1 insertion(+)create mode 100644 hello.py第4步: 使用git push推送到github
[root@vm1 daniel_project]# git push -u origin master warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'. To squelch this message and maintain the current behavior after the default changes, use:git config --global push.default matchingTo squelch this message and adopt the new behavior now, use:git config --global push.default simpleSee 'git help config' and search for 'push.default' for further information. (the 'simple' mode was introduced in Git 1.7.11. Use the similar mode 'current' instead of 'simple' if you sometimes use older versions of Git)Username for 'https://github.com': linux-daniel 這里輸入你的github賬號名 Password for 'https://linux-daniel@github.com': 再輸入你的github密碼 Counting objects: 4, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 302 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To https://github.com/linux-daniel/daniel_project.git2ff4805..b59e1d6 master -> master第5步: 回到github驗證
補充:
使用下面的命令可以實現https的密碼緩存(下次不用再輸密碼了)
# git config --global credential.helper store免密push
免密push其實就是利用了ssh免密登錄的原理:
第1步: 開發者電腦產生ssh空密碼密鑰對
[root@vm1 daniel_project]# ssh-keygen -t rsa -f /root/.ssh/id_rsa -C "root@daniel.cluster.com" -N ""第2步: 把公鑰文件的內容復制到剪貼板
[root@vm1 daniel_project]# cat /root/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCz2rKSMbJwvdRN5VnsaRA0ydDDtm0ruTQY0ZVsynuj15RcFuKjrlYAEF3rU2AowL7n68xWabf3lC9l6WZjLa6cibfjW1wNnroPE2kzZADSoxcAAYxKVg/wkG2j5lPC4jJRPiSLg/yCyDA7go567ShvUCH8goMXMyMzKx1eIaU2nZoLnh7ulBv4URs5jPSE9kwhQ9MnUIzihQRvz9tqURYKIzmthSkm0CyXAlT6qufTdaNp/KmoH2Idj+rXufEsLF5qHD0lKaSM4bKZvqWNhd4a6XrF9DpoeSpeI63P3ZZkVTbmTSFgbBM8+KgxvGyUxfvjimo8Ed8TY5TGA6qC+g7F root@daniel.cluster.com第3步: github上添加開發者的公鑰
第4步: 獲取ssh克隆方式地址
第5步: 開發者再git clone項目到本地
[root@vm1 ~]# rm daniel_project/ -rf [root@vm1 ~]# git clone git@github.com:linux-daniel/daniel_project.git Cloning into 'daniel_project'... The authenticity of host 'github.com (13.229.188.59)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'github.com,13.229.188.59' (RSA) to the list of known hosts. remote: Enumerating objects: 6, done. remote: Counting objects: 100% (6/6), done. remote: Compressing objects: 100% (3/3), done. remote: Total 6 (delta 0), reused 3 (delta 0), pack-reused 0 Receiving objects: 100% (6/6), done.第6步: 再準備一個新的代碼文件, 添加并提交
[root@vm1 ~]# cd daniel_project/我這里準備一個haha.py文件 [root@vm1 daniel_project]# cat haha.py print("haha")[root@vm1 daniel_project]# git add haha.py [root@vm1 daniel_project]# git commit -m "提交haha.py" [master 2186bae] 提交haha.py1 file changed, 1 insertion(+)create mode 100644 haha.py第7步: 這次再使用git push就會發現不需要輸入賬號密碼了
[root@vm1 daniel_project]# git push第8步: github上驗證
小結: github有兩種連接方式:
Clone with HTTPS
Clone with SSH(通過ssh免密密鑰對實現免密push)
github分支(拓展)
第1步: 在github上創建一個新的dev分支
第2步: 開發者電腦的dev分支上開發,并上傳到github的dev分支 (這里可以再次git clone,也可以直接在本地對應的創建dev分支,還可以git pull進行同步更新)
[root@vm1 daniel_project]# git pull [root@vm1 daniel_project]# git branch dev [root@vm1 daniel_project]# git checkout dev Switched to branch 'dev' [root@vm1 daniel_project]# echo "新功能" > new.py [root@vm1 daniel_project]# git add new.py [root@vm1 daniel_project]# git commit -m "增加了發紅包功能" [dev 2d38f8e] 增加了發紅包功能1 file changed, 1 insertion(+)create mode 100644 new.py [root@vm1 daniel_project]# git push -u origin dev Counting objects: 4, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 295 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), completed with 1 local object. To git@github.com:linux-daniel/daniel_project.git2186bae..2d38f8e dev -> dev Branch dev set up to track remote branch dev from origin.第3步: 在github上創建pull request將dev分支的新代碼merge到master分支
第4步: 驗證最終效果
多人協作(拓展)
如果有多個開發者開發項目的話,如何代碼合并呢? 下面我們來演示這樣的過程
fork me on github
clone與fork的區別:
clone: 任何人都可以下載作者的整個項目,但非作者不能push到作者的項目里(因為沒有作者的賬號密碼)
fork:
- 張三fork了作者的項目,相當于可以下載作者的一個項目副本。
- 張三開發完后再上傳到張三自己的賬號里
- 張三請求合并到作者的賬號項目里
- 作者可以同意或拒絕這個請求
第1步: 再申請一個github賬號模擬第二位開發者(我這里新申請的賬號為linux-daniel2),登錄后查找linux-daniel第一位開發者的項目
第2步: 第二位開發者Fork第一們開發者的項目,就會在自己的賬號里得到項目代碼的副本
第3步: 第二位開發者使用自己的電腦(這里我使用vm5來模擬)進行開發,然后上傳
[root@vm5 ~]# git clone https://github.com/linux-daniel2/daniel_project.git Cloning into 'daniel_project'... remote: Enumerating objects: 13, done. remote: Counting objects: 100% (13/13), done. remote: Compressing objects: 100% (7/7), done. remote: Total 13 (delta 1), reused 9 (delta 1), pack-reused 0 Unpacking objects: 100% (13/13), done.[root@vm5 ~]# cd daniel_project/[root@vm5 daniel_project]# git branch dev [root@vm5 daniel_project]# git checkout dev Switched to branch 'dev'[root@vm5 daniel_project]# echo "分享功能" > new2.py [root@vm5 daniel_project]# git add new2.py[root@vm5 daniel_project]# git commit -m "增加了分享功能"[root@vm5 daniel_project]# git push -u origin dev Username for 'https://github.com': linux-daniel2 Password for 'https://linux-daniel2@github.com': Counting objects: 4, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 313 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), completed with 1 local object. To https://github.com/linux-daniel2/daniel_project.git2d38f8e..1c95bf2 dev -> dev Branch dev set up to track remote branch dev from origin.第4步: 第二位開發者確認開發的代碼上傳到自己的github倉庫成功
第5步: 第二位開發者創建pull request將代碼請求合并到第一位開發者的原項目里去
第6步: 回到第一位開發者的賬號,對第二位開發者的請求進行合并確認
第7步: 因為是合并到原項目的dev分支,如果沒問題的話,還需要合并到master分支。(請小伙伴們自行完成)
最終結果圖如下:
步驟小結:
開發者1為項目擁有者, 開發者2幫開發者1開發新功能
開發者2 Fork 開發者1的項目(相當于copy一個副本)
開發者2使用git clone這個項目副本到自己的開發電腦
開發者2開發新功能,并push到項目副本
開發者2使用pull request將開發好的新功能請求合并到開發者1的項目倉庫
開發者1確認
gitlab
gitlab下載
gitlab安裝與配置
準備一臺新虛擬機來安裝(內存可適當調大點,比如1.5G)
安裝
[root@vm2 ~]# rpm -ivh gitlab-ce-11.8.2-ce.0.el7.x86_64.rpm配置
[root@vm2 ~]# vim /etc/gitlab/gitlab.rb 13 external_url 'http://10.1.1.12' 修改成gitlab服務器的IP地址,對外服務初始化
[root@vm2 ~]# gitlab-ctl reconfigure 時間較久,需要3分鐘左右時間,會自動幫助配置各個組件,并啟動查看狀態
[root@vm2 ~]# gitlab-ctl status run: alertmanager: (pid 10563) 36s; run: log: (pid 10234) 64s run: gitaly: (pid 10343) 39s; run: log: (pid 9380) 163s run: gitlab-monitor: (pid 10417) 38s; run: log: (pid 10082) 80s run: gitlab-workhorse: (pid 10364) 39s; run: log: (pid 9835) 104s run: logrotate: (pid 9916) 93s; run: log: (pid 9952) 90s run: nginx: (pid 9876) 99s; run: log: (pid 9908) 96s run: node-exporter: (pid 10399) 38s; run: log: (pid 10003) 84s run: postgres-exporter: (pid 10585) 35s; run: log: (pid 10267) 60s run: postgresql: (pid 9499) 158s; run: log: (pid 9562) 157s run: prometheus: (pid 10452) 37s; run: log: (pid 10161) 70s run: redis: (pid 9275) 170s; run: log: (pid 9296) 169s run: redis-exporter: (pid 10426) 38s; run: log: (pid 10127) 74s run: sidekiq: (pid 9787) 111s; run: log: (pid 9808) 110s run: unicorn: (pid 9731) 117s; run: log: (pid 9781) 114sgitlab登錄
設置密碼(密碼需要最少8位)
gitlab設置
配置郵箱服務的用途:
-
賬號注冊時,郵件驗證
-
有合并請求時,郵件通知
-
修改密碼時,通過郵件修改
開發者設置ssh密鑰
第1步: 在開發者電腦上產生空密碼密鑰
(注意: 可以直接使用上面實驗的github開發者的密鑰,也可以模擬新的開發者重新產生,再做一遍。這里我們再做一次)
[root@vm1 ~]# ssh-keygen -t rsa -f /root/.ssh/id_rsa -C "dev1@itcast.cn" -N ""第2步: 查看并復制公鑰
[root@vm1 ~]# cat /root/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAJW+LIFdcC0DI6oM6eOf6+EPks2ODyPaR/cAWKeFcfnSvuU84ZFYtziQyJYf1RdXwxo6vH+XyBNwOGrTLB1m33RvAgUznVhBH3KA9l1OimYSqEdQJ+4g+LVDkrgj/vIRc1dv7wDglyYGOOFfRftRK/QEHK911MOyJCK1nH0rr7eE7sP33aD6I6DoIfaSC0UUDPfwHDg/bQUDsF/ez4tEPOTSeJ2jVyytArHOAjtflL1+ZvP25F4osdSXju6IG8i7HHiZ0sz1WuQEYH8KzrY/zf8DBFrnOB4vl2UTNwP/NjT06TY78gKMJqcpf1maZR3YIeYlA03ccSOWSZuqq50eP dev1@itcast.cn第3步: 在gitlab界面添加公鑰
gitlab創建倉庫
第1步: 在gitlab上創建項目(其實也就是存放代碼的倉庫)
第2步: 自定義項目名稱,描述等
第3步: 驗證創建好的項目
克隆遠程倉庫到本地
第1步: 查看gitlab上的幫助
第2步: 在開發者電腦上設置身份標識
[root@vm1 ~]# git config --global user.name "daniel" [root@vm1 ~]# git config --global user.email "daniel@itcast.cn" [root@vm1 ~]# git clone git@10.1.1.12:root/mywebsite.git第3步: 在開發者電腦上使用git命令clone,并上傳項目
[root@vm1 ~]# cd mywebsite/[root@vm1 mywebsite]# echo "test web" > README.md [root@vm1 mywebsite]# git add . [root@vm1 mywebsite]# git commit -m "add README.md"[root@vm1 mywebsite]# git push -u origin master第4步: 驗證
小結
git 分布式版本控制工具
github和gitlab都屬于遠程倉庫
git clone: 把遠程倉庫的項目代碼下載到本地
git push: 把本地的項目代碼上傳到遠程倉庫
git pull: 把遠程倉庫的項目代碼更新到本地
遠程倉庫兩種訪問方法:
- http
- ssh 使用空密碼密鑰做免密
持續集成(CI)
Continuous integration,簡稱CI
? 是一種軟件開發實踐,即團隊開發成員經常集成他們的工作,通常每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而盡快地發現集成錯誤。
目的
? 持續集成的目的不是減少build失敗的次數,而是**盡早發現問題,在最短的時間內解決問題**,減少風險和浪費。從而讓產品開發流程更加敏捷,縮短產品開發周期,在產品上線后,讓用戶用得更加順暢。
? 在沒有應用持續集成之前,傳統的開發模式是項目一開始就劃分模塊,每個開發人員分別負責一個模塊,等所有的代碼都開發完成之后再集成到一起提交給測試人員,隨著軟件技術團隊的發展,軟件已經不能簡單地通過劃分模塊的方式來開發,需要項目內部相互協作,劃分模塊這種傳統的模式的弊端也越來越明顯。由于很多bug在項目早期的設計、編碼階段就引入,到最后集成測試時才發現問題,開發人員需要花費大量的時間來定位bug,加上軟件的復雜性,bug的定位就更難了,甚至出現不得不調整底層架構的情況。這種情況的發生不僅僅對測試進度造成影響,而且會拖長整個項目周期。
? 而持續集成可以有效解決軟件開發過程中的許多問題,在集成測試階段之前就幫助開發人員發現問題,從而可以有效的確保軟件質量,減小項目的風險,使軟件開發團隊從容的面對各種變化。持續集成報告中可以體現目前項目進度,哪部分需要已經實現,哪些代碼已經通過自動化測試,代碼質量如何,讓開發團隊和項目組了解項目的真實狀況。
?
持續交付(CD)
Continuous Delivery,簡稱CD
? 持續交付是指軟件開發過程,從原始需求到最終產品開發過程中,較短周期內以需求的小顆粒度(小批量)頻繁提交的過程。主要指集成后的代碼在類生產環境(測試環境,預發布環境等)中測試并及時反饋的過程.
目的
##持續部署
Continuous Deployment,簡稱CD
? 基于持續交付的基礎上,把功能穩定,符合產品需求的版本有方法地部署至生產環境中。可以看作是持續交付的最后一環。
持續發布
Continuous Release,簡稱CR
? 發布是周期性或不定期地對項目在部署后,進行整體軟件版本的更新,例如,更新新功能或展示頁面框架等。
目的
持續測試
Continuous Testing,簡稱CT
? 持續測試是貫穿著整個軟件開發過程,驗證程序員提交代碼,檢驗合規性及降低bug,減少最終錯誤,實現敏捷及精益開發。
目的
代碼更新方法
藍綠部署
海豚的秘密
大家都知道海豚是一種可愛的海洋動物。但又有多少人知道,海豚可以永遠不睡覺。
是什么樣的能力,使得海豚可以永遠保持清醒呢?
依靠的是海豚大腦特殊的運作方式。
像人一樣,海豚的大腦也分為左腦和右腦兩個部分。
在海豚活躍的狀態下,左腦和右腦都是清醒的:
當然,海豚也是血肉之軀,也是需要休息的。在海豚休息的狀態下,其中一半大腦會進入睡眠,另一半大腦仍然保持清醒,以面對各種外界情況。
每隔兩個小時,這種一半睡眠一半清醒的狀態會進行交替,比如這一刻左腦睡眠右腦清醒,下一刻左腦清醒右腦睡眠。
這就是海豚永遠不會真正睡覺的秘密。
藍綠部署,英文名Blue Green Deployment,是一種可以保證系統在不間斷提供服務的情況下上線代碼的部署方式。
如何保證系統不間斷提供服務呢?
藍綠部署的模型中包含兩個集群,就好比海豚的左腦和右腦。
在正常情況下(沒有上線操作),集群A和集群B的代碼版本是一致的,并且同時對外提供服務。
在有項目代碼上線的時候,我們首先把一個集群(比如集群A)從負載列表中摘除,進行新版本的部署。集群B仍然繼續提供服務。
當集群A升級完畢,我們把負載均衡重新指向集群A,再把集群B從負載列表中摘除,進行新版本的部署。集群A重新提供服務。
最后,當集群B也升級完成,我們把集群B也恢復到負載列表當中。這個時候,兩個集群的版本都已經升級,并且對外的服務幾乎沒有間斷過。
滾動更新
滾動更新,英文Rolling update,同樣是一種可以保證系統在不間斷提供服務的情況下上線代碼的部署方式。
和藍綠部署不同的是,滾動部署對外提供服務的版本并不是非此即彼,而是在更細的粒度下平滑完成版本的升級。
如何做到細粒度平滑升級版本呢?
滾動部署只需要一個集群,集群下的不同節點可以獨立進行版本升級。比如在一個16節點的集群中,我們選擇每次升級4個節點:
以此類推,最終所有的節點都升級了版本。
藍綠部署與滾動更新對比
灰度發布(A/B測試、金絲雀部署)
灰度發布是指在黑與白之間,能夠平滑過渡的一種發布方式。
AB test就是一種灰度發布方式,讓一部分用戶繼續用A,一部分用戶開始用B,如果用戶對B沒有什么反對意見,那么逐步擴大范圍,把所有用戶都遷移到B上面來。
灰度發布可以保證整體系統的穩定,在初始灰度的時候就可以發現、調整問題,以保證其影響度,而我們平常所說的金絲雀部署也就是灰度發布的一種方式。
灰度發布/金絲雀部署步驟:
準備好部署各個階段的工件,包括:構建工件,測試腳本,配置文件和部署清單文件。
從負載均衡列表中移除掉“金絲雀”服務器。
升級“金絲雀”應用(排掉原有流量并進行部署)。
對應用進行自動化測試。
將“金絲雀”服務器重新添加到負載均衡列表中(連通性和健康檢查)。
如果“金絲雀”在線使用測試成功,升級剩余的其他服務器。(否則就回滾)
除此之外灰度發布還可以設置路由權重,動態調整不同的權重來進行新老版本的驗證。
17世紀,英國礦井工人發現,金絲雀對瓦斯這種氣體十分敏感。空氣中哪怕有極其微量的瓦斯,金絲雀也會停止歌唱;而當瓦斯含量超過一定限度時,雖然魯鈍的人類毫無察覺,金絲雀卻早已毒發身亡。當時在采礦設備相對簡陋的條件下,工人們每次下井都會帶上一只金絲雀作為“瓦斯檢測指標”,以便在危險狀況下緊急撤離。
總結
以上是生活随笔為你收集整理的day62-github与gitlab的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaWeb项目实践
- 下一篇: 算法:经典题五 题目五 信封套娃层数问题