1. Gitlab概述
1.1 GitLab介紹
GitLab是利用Ruby on Rails一個開源的版本管理系統,實現一個自托管的Git項目倉庫,可通過Web界面進行訪問公開的或者私人項目。
GitLab能夠瀏覽源代碼,管理缺陷和注釋。可以管理團隊對倉庫的訪問,它非常易於瀏覽提交過的版本並提供一個文件歷史庫。團隊成員可以利用內置的簡單聊天程序(Wall)進行交流。
它還提供一個代碼片段收集功能可以輕松實現代碼復用,便於日后有需要的時候進行查找
1.2 Gitlab服務構成
Nginx:靜態web服務器。
gitlab-shell:用於處理Git命令和修改authorized keys列表。
gitlab-workhorse: 輕量級的反向代理服務器。
logrotate:日志文件管理工具。
postgresql:數據庫。
redis:緩存數據庫。
sidekiq:用於在后台執行隊列任務(異步執行)。
unicorn:An HTTP server for Rack applications,GitLab Rails應用是托管在這個服務器上面的。
1.3 Gitlab工作流程
1.4 GitLab Shell
GitLab Shell有兩個作用:為GitLab處理Git命令、修改authorized keys列表
當通過SSH訪問GitLab Server時,GitLab Shell會:
- 限制執行預定義好的Git命令(git push,git pull,git annex)
- 調用GitLab Rails API檢查權限
- 執行pre-receive鈎子(在企業版中叫做Git鈎子)
- 執行用戶請求的動作,處理GitLab的post-receive動作
- 處理自定義的post-receive動作
當通過http(s)訪問GitLab Server時,工作流程取決於你是從Git倉庫拉取(pull)代碼還是向git倉庫推送(push)代碼:
如果是從Git倉庫拉取(pull)代碼,GitLab Rails應用會全權負責處理用戶鑒權和執行Git命令的工作
如果是向Git倉庫推送(push)代碼,GitLab Rails應用既不會進行用戶鑒權也不會執行Git命令,它會把以下工作交由GitLab Shell進行處理:
- 調用GitLab Rails API 檢查權限
- 執行pre-receive鈎子(在GitLab企業版中叫做Git鈎子)
- 執行你請求的動作
- 處理GitLab的post-receive動作
- 處理自定義的post-receive動作
1.5 GitLab Workhorse
GitLab Workhorse是一個敏捷的反向代理。它會處理一些大的HTTP請求,比如文件上傳、文件下載、Git push/pull和Git包下載。其它請求會反向代理到GitLab Rails應用,即反向代理給后端的unicorn。
2. Gitlab的安裝部署
- Gitlab要求服務器內存2G以上
2.1 方式一:下載gitlab-ce的rpm包
將對應版本的gitlab-ce下載到本地后,直接yum安裝即可
# 要先將這個rpm包下載到本地 yum install -y gitlab-ce-13.6.1-ce.0.el7.x86_64.rpm
2.2 方式二:配置yum源
在 /etc/yum.repos.d/ 下新建 gitlab-ce.repo,寫入如下內容:
[gitlab-ce] name=gitlab-ce baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ Repo_gpgcheck=0 Enabled=1 Gpgkey=https://packages.gitlab.com/gpg.key
然后創建cache,再直接安裝gitlab-ce
yum makecache # 這一步會創建大量的數據 # 直接安裝最新版 yum install -y gitlab-ce # 如果要安裝指定的版本,在后面填上版本號即可 yum install -y gitlab-ce-13.6.1 # 如果安裝時出現gpgkey驗證錯誤,只需在安裝時明確指明不進行gpgkey驗證 yum install gitlab-ce -y --nogpgcheck
2.3 gitlab的配置
配置文件位置 /etc/gitlab/gitlab.rb
[root@centos7 test]# vim /etc/gitlab/gitlab.rb [root@centos7 test]# grep "^[a-Z]" /etc/gitlab/gitlab.rb external_url 'http://10.0.0.51' # 這里一定要加上http:// # 配置郵件服務 gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.qq.com" gitlab_rails['smtp_port'] = 25 gitlab_rails['smtp_user_name'] = "hgzerowzh@qq.com" # 自己的qq郵箱賬號 gitlab_rails['smtp_password'] = "xxx" # 開通smtp時返回的授權碼 gitlab_rails['smtp_domain'] = "qq.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = false gitlab_rails['gitlab_email_from'] = "hgzerowzh@qq.com" # 指定發送郵件的郵箱地址 user["git_user_email"] = "shit@qq.com" # 指定接收郵件的郵箱地址
修改好配置文件后,要使用 gitlab-ctl reconfigure 命令重載一下配置文件,否則不生效。
gitlab-ctl reconfigure # 重載配置文件
2.4 Gitlab常用命令
gitlab-ctl start # 啟動所有 gitlab 組件 gitlab-ctl stop # 停止所有 gitlab 組件 gitlab-ctl restart # 重啟所有 gitlab 組件 gitlab-ctl status # 查看服務狀態 gitlab-ctl reconfigure # 啟動服務 gitlab-ctl show-config # 驗證配置文件 gitlab-ctl tail # 查看日志 gitlab-rake gitlab:check SANITIZE=true --trace # 檢查gitlab vim /etc/gitlab/gitlab.rb # 修改默認的配置文件
3. Gitlab的使用
- Gitlab安裝好后,設置密碼,管理賬戶為root
3.1 創建Group
- 填上組名即可,這里組名為java
3.2 創建User
- 創建四個User:pm、dev1、dev2、dev3
3.3 添加User到Group中並授權
3.4 創建Project並配置SSH
3.5 在項目中添加成員
3.6 將本地文件推送到Gitlab
# 將app01項目克隆下來 git clone git@10.0.0.51:java/app01.git # 初始化配置 git config --global user.name "hgzero" git config --global user.email "hgzero@qq.com" # 在app01目錄下新建一些文件 # 推送到gitlab git add . git commit -m "first edition" git push origin master
4. 制定開發計划
4.1 創建開發計划
- 項目:app01
- 版本:v1.0
4.2 創建里程碑Milestones
- 用pm賬號登錄gitlab后操作(先要在admin中設置pm賬號的密碼)
- 要根據開發計划來創建Milestones
4.3 根據開發計划創建issue
- 創建4個issue,分派給dev1和dev2這兩個開發人員
4.4 開發者登錄賬號查看分派的任務
- 然后開發dev1登錄gitlab,就能看到任務已經分配過來了
4.5 開發流程
- 公司里的開發開始任務
# 1. 先從倉庫把項目拉下來 git clone git@10.0.0.51:java/app01.git cd app01/ # 2.先創建一個自己的分支,然后進行開發 git checkout -b index # 創建一個叫index的分支,並切換到這個分支 git status # 3. 開始開發首頁 echo "<h1>welcome to this app</h1>" > index.html # 假設就開發了一個index頁面 # 4. 開發完成后,把項目傳到倉庫 git add . git commit -m "index" # 如果寫成 git commit -m "close #2" ,則表示merge請求允許且merge成功之后,自動刪除編號為#2的issue # 傳到index分支 git push origin index
4.6 合並分支
1)開發dev1發送合並分支請求給pm
2)pm收到開發的Merge請求后進行處理
- 使用pm登錄,就可以看到pm已經收到了合並請求merge request
3)開發dev1確認任務完成
- 退出pm賬戶,登入dev1賬戶:
- 或者點進去后,在側邊欄進行標識Done,然后已經完成的issue,可以將其Close
- 這個時候Milestones的進度已經往前進了一些了:
4.7 開發其他功能
- 然后其他開發者或者自己再次進行開發時,先要把剛剛更新后的內容(master主干)拉回來,然后再進行開發
git checkout master # 切換到master git pull # 從遠端倉庫拉取數據
# 然后再進行其他操作
5. Gitlab備份恢復
5.1 備份gitlab
1)修改配置文件
- /etc/gitlab/gitlab.rb
# 備份保存的位置,這里是默認位置,可修改成指定的位置 gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" # 設置備份保存的時間,超過此時間的日志將會被新覆蓋 gitlab_rails['backup_keep_time'] = 604800 # 這里是默認設置,保存7天 # 特別注意: # 如果自定義了備份保存位置,則要修改備份目錄的權限,比如: # chown -R git.git /data/backup/gitlab
- 配置完成后要重啟以使配置生效
# 重讀配置文件 gitlab-ctl reconfigure # 重啟gitlab gitlab-ctl restart
2)設置定時任務
# 每天凌晨2點定時創建備份 # 將一下內容寫入到定時任務中 crontab -e 0 2 * * * /usr/bin/gitlab-rake gitlab:backup:create # 備份策略建議: # 本地保留3到7天,在異地備份永久保存
3)備份時間的識別
# 備份后的文件類似這樣的形式:1494170842_gitlab_backup.tar,可以根據前面的時間戳確認備份生成的時間 data -d @1494170842
5.2 恢復gitlab
1)停止數據寫入服務
# 停止數據寫入服務 gitlab-ctl stop unicorn gitlab-ctl stop sidekiq
2)進行數據恢復並重啟
# 進行恢復 gitlab-rake gitlab:backup:restore BACKUP=1494170842 # 這個時間戳就是剛剛備份的文件前面的時間戳 # 重啟 gitlab-ctl restart
6. gitlab郵件通知配置
- vim /etc/gitlab/gitlab.rb
gitlab_rails['time_zone'] = 'Asia/Shanghai' gitlab_rails['gitlab_email_enabled'] = true gitlab_rails['gitlab_email_from'] = 'example@163.com' # 填寫發件人的郵箱地址 gitlab_rails['gitlab_email_display_name'] = 'gitlab' gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.163.com" # smtp服務器的地址,如網易的地址 gitlab_rails['smtp_port'] = 25 # 要注意如果使用了SSL/TLS的話,端口可能不是25 gitlab_rails['smtp_user_name'] = "smtp用戶名" gitlab_rails['smtp_password'] = "smtp用戶密碼" gitlab_rails['smtp_domain'] = "163.com" gitlab_rails['smtp_authentication'] = "login"
7. 使用SourceTree進行項目開發
7.1 項目拉取
- 先把項目克隆下來
- 如果ssh的方式克隆失敗,可能是因為SSH Key沒找到,可以在這里添加
7.2 創建分支進行功能開發
1)新建立一個叫“pay”的分支
2)進行功能開發
7.3 提交項目
1)開發pay功能完成后進行提交
- 可以看到SourceTree中已經有“未提交的更改”
2)添加“用戶信息”
3)進行提交
- 注釋也可以寫成 close #3 ,作用是提交完成后關閉3號issue
7.4 推送到倉庫
- 然后就可以在gitlab上進行發送merge請求了,后面就可以進行其他操作了
7.5 項目上線
1)當所有工作完成之后,就可以進行上線了
2)打標簽
- 上線先打個標簽
3)刪除無用分支
- 然后刪除已經合並到主干中的不必要的分支,如index、pay等
- 最后一定要注意時間一定要同步,不然會錯亂