gitlab是一款開源的類似github代碼托管平台。也就是說自己服務器上可以搭建個git倉庫。 稍微有點難度需要你掌握 js linux http協議等。 所以寫個備忘錄 也方便其他人少踩坑。
檢測環境
首先你需要購買雲主機 廠家隨意 建議2核4g內存 這樣跑起來比較正常... 如果下面你在執行中 感覺很卡只能說配置太低。 可以去各平台雲監控查看cpu 和內存使用率
這是我騰訊雲2g4g運行時候的圖 運行配置有時候會達到100% 會導致卡頓。 請不要見怪
centos默認會安裝好一些基本服務 先檢查下是否全安裝
yum info -y curl policycoreutils-python openssh-server
如果沒就 yum install
systemctl status sshd
-- 檢查ssh服務
systemctl status postfix
-- 檢查郵件服務 這步很可能報錯 因為各大雲主機都有自己的默認配置 請去/etc/postfix/main.cf
修改 inet_protocols = ipv4
安裝gitlab
也許雲廠商源有了yum源 如果沒就用清華源
[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7
repo_gpgcheck=0
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/gpg.key
yum makecache
yum install gitlab-ce
這里要等段時間 安裝完會有個logo打印出來 下面稍微了解下裝了哪些東西
Gitlab的服務構成
- Nginx:靜態web服務器。(不和你自己的nginx沖突 其他的也一樣)
- gitlab-shell:用於處理Git命令和修改authorized keys列表。
- gitlab-workhorse: 輕量級的反向代理服務器。
- logrotate:日志文件管理工具。
- postgresql:數據庫。
- redis:緩存數據庫。
- sidekiq:用於在后台執行隊列任務(異步執行)。
- unicorn:An HTTP server for Rack applications,GitLab Rails應用是托管在這個服務器上面的。
基本配置gitlab
在配置前先了解下你這時多出個幾個bin命令
Service Management Commands |
---|
start |
stop |
restart |
status |
tail |
service-list |
graceful-kill |
help |
reconfigure |
show-config |
uninstall |
cleanse |
vim /etc/gitlab/gitlab.rb
-- 這個是gitlab的配置文件 里面除了external_url沒注釋 其他基本都注釋了 都是默認配置 取消#號 修改自定義配置
還送你了個 gitlab-rails console
控制台 以后測試用 運行這個也需要很多內存!
配置有很多 我只找了關鍵的
external_url 'http://git.dorodoro-lab.com' #改域名
unicorn['worker_processes'] = 2 #這很關鍵 不然卡爆了 默認好像是24核 快點改成2
gitlab_rails['time_zone'] = 'Asia/Shanghai' # 時間區域
#禁用內部的nginx 添加外部的nginx
web_server['external_users'] = ['nginx']
nginx['enable'] = false
改完 gitlab-ctl reconfigure
sudo usermod -G gitlab-www nginx
- 給nginx 添加用戶組
ll /var/opt/gitlab/gitlab-rails
-- 查看權限
chmod -R o+x /var/opt/gitlab/gitlab-rails
-- 讓文件有nginx權限接管通道
注 每次 gitlab-ctl reconfigure都會重新初始權限
ll /var/opt/gitlab/gitlab-workhorse/socket
-- 看權限
chmod -R o+x /var/opt/gitlab/gitlab-workhorse/socket
-- 讓文件有nginx權限接管通道 注 每次 gitlab-ctl reconfigure都會重新初始權限 沒權限的話就是502錯誤
gitlab-ctl start
-- 開啟服務
如果你想使用自帶的nginx請看這個官方的 傳送門
官方也有配置外部的nginx方法 但需要在編譯nginx時安裝Passenger 通過yum安裝的nginx是沒有的 沒關系用這個 傳送門 雖然我用了https 怕麻煩也可以http
gitlab后台界面
第一次進入的時候 用的是root賬號 權限很大 設置下密碼 進入管理后台
然后新建個管理員賬號 下面的就用管理員賬號操作 熟悉GitHub的人下面可以跳過
權限等級分三種:
- Private 私有的,只有你自己或者組內的成員能訪問
- Internal 所有登錄的用戶
- Public 公開的,所有人都可以訪問
項目權限 傳送門
還可以掛ssh密鑰免密碼操作倉庫
- 在后面新建個遠程倉庫
- 進入自己電腦建立本地倉庫
- 初始化git倉庫 git init
- 添加文件到倉庫 git add .
- 提交代碼到倉庫git commit -m ‘init commit’
- 鏈接到git server git remote add origin
- git@example.com:namespace/projectname.git
- push代碼到服務器 git push origin master
郵件服務
了解下smtp
開始之前,先介紹幾個枯燥的名詞:
MUA:用戶代理端,即用戶使用的寫信、收信客戶端軟件。比如:outlook、foxmail等客戶端軟件,乃至通過瀏覽器登錄郵箱並發送郵件的BS架構網頁也算是MUA。
MTA:郵件傳送端,即常說的郵件服務器,用於轉發、收取用戶郵件。本文之中的postfix實現的就是MTA,當然postfix也是一種特殊的MUA,不再深入介紹,本文之中僅把postfix當做MTA使用。
MDA:郵件代理端,相當於MUA和MTA的中間人,可用於過濾垃圾郵件。
POP:郵局協議,當前是第三版,也就是POP3,用於MUA連接服務器收取用戶郵件,通信端口110。
IMAP:互聯網應用協議,功能與POP類似:也用於MUA連接服務器收取用戶郵件;功能較POP多,通信端口143。
SMTP:簡單郵件傳送協議,MUA連接MTA或MTA連接MTA發送郵件使用此協議,通信端口25,啟用ssl/tls的情況下端口為465或587。
一般發郵件的步驟流程是:
1、MUA通過POP、IMAP或SMTP協議連接MTA(稱之為mta1);本文之中php通過phpmailer請求發送郵件的php腳本就扮演了MUA的角色,而postfix就是MTA;
2、MUA發送郵件給mta1(或者說MUA通過mta1發送郵件);本文中postfix就是這個mta1;
3、mta1與其他的MTA自主溝通連接將郵件傳送至指定域下的指定用戶(此時mta1就扮演了MUA的角色功能,這種交互是由郵件系統軟件自主實現,與用戶端無關)。
默認gitlab使用的是 postfix 做郵件傳送端 但沒配置的話發不了的 localhost發給誰啊 。這里我用的是smtp服務 簡單 裝b 注意防火牆別給攔了
需要開通 tx企業郵 還要個自己的域名
按照 官方文檔 修改etc 注意端口是465
還有要加上 不然發不出去
gitlab_rails['gitlab_email_from'] = 'xxxx@xx.com'
gitlab_rails['gitlab_email_reply_to'] = 'xxxx@xx.com'
gitlab-ctl reconfigure
-- 改完別忘了重新設置 還要上權限 不然502
gitlab-ctl restart
-- 重啟下
gitlab-rails console
-- 開啟控制台 會占用很高內存cpu 機器不行的話會很卡
Notify.test_email('收件人郵箱', '郵件標題', '郵件正文').deliver_now
-- 模擬發送
如果收到了說明成功
https
如果用外部 nginx 的話和平時的配置差不多 gitlab自帶nginx請按照 官方文檔 配置
無論內外nginx 都要修改etc的 external_url 的連接為https開頭 這樣代碼也是https
更換gravatar頭像地址
gitlab_rails[‘gravatar_plain_url’] = ‘http://gravatar.duoshuo.com/avatar/%{hash}?s=%{size}&d=identicon’
webhooks
為了讓部署方便 git提供了hooks(鈎子)功能 這樣每次push后就可以自動部署了 下面這套只是個示例 不過基本上都能滿足各種需求了 想改的話按情況改
在每個項目的setting->Integrations 有這樣的界面
url可以通過nginx代理定義個 這里我們定義一個url長這樣 https://git.abc.com/webhooks?sh=test
意義是一個處理鈎子的接口 通過參數sh傳入要執行的shell名
這個還有個secret作為安全簽名參數之一 最好設置下 比如123456吧
然后默認push事件 ssl認證 點下add button 生成記錄 記錄是可以test的 目前沒有服務 點了會報錯
然后起個node服務 用的是別人的庫 注意是gitlab-webhook-handler 想用GitHub請用 github-webhook-handler 不然匹配不到頭信息 不能觸發鈎子!
app.js
var http = require('http')
var url = require('url')
var fs =require('fs')
var createHandler = require('gitlab-webhook-handler')
var handler = createHandler({ path: '/webhooks', secret: '123456' }) //router
// 上面的 secret 保持和 GitHub 后台設置的一致
var shell="";
function run_cmd(cmd, args, callback) {
var spawn = require('child_process').spawn;
var child = spawn(cmd, args);
var resp = "";
child.stdout.on('data', function(buffer) { resp += buffer.toString(); });
child.stdout.on('end', function() { callback (resp) });
}
http.createServer(function (req, res) {
req.query=url.parse(req.url,true).query;
shell=req.query.sh;
handler(req, res, function (err) {
res.statusCode = 200
res.end('connect successful ')
})
}).listen(7777)
handler.on('error', function (err) {
console.error('Error:', err.message)
})
handler.on('push', function (event) {
if(!shell){
console.error('Error:','no shell specify');
return ;
}
if(!fs.existsSync(`./shell/${shell}.sh`)){
console.error('Error:','no shell exists on server');
return ;
}
console.log('Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref);
run_cmd('sh', [`./shell/${shell}.sh`], function(text){ console.log(text) });
})
/*
handler.on('issues', function (event) {
console.log('Received an issue event for % action=%s: #%d %s',
event.payload.repository.name,
event.payload.action,
event.payload.issue.number,
event.payload.issue.title)
})
*/
然后做個shell文件夾 里面放shell 注意shell給他有x權限 直接 775
test.sh
WEB_PATH='/srv/node/test' #你要放的目錄
GIT_PATH='/var/opt/gitlab/git-data/repositories/lanbosm/test.git' #gitlab原本存代碼的倉庫目錄
WEB_USER='git' #目錄的用戶
WEB_USERGROUP='wheel' #目錄的用戶組
if [ ! -d "$WEB_PATH" ]; then
echo "create dir $WEB_PATH ..."
mkdir "$WEB_PATH"
chown $WEB_USER:$WEB_USERGROUP $WEB_PATH
chmod 755 $WEB_PATH
fi
echo "Start deployment..."
cd $WEB_PATH
echo "cleaning dir...."
git --git-dir=$GIT_PATH --work-tree=$WEB_PATH clean -fd
echo "pulling source code...."
git --git-dir=$GIT_PATH --work-tree=$WEB_PATH checkout -f
if [ $? -eq 0 ]; then
echo "changing permissions..."
chown -R $WEB_USER:$WEB_USERGROUP $WEB_PATH
chmod 755 -R $WEB_PATH
echo "Finished deployment"
#這里還可以繼續擴展shell 比如 代碼放完 可以 pm2 restart xxx 下 或者其他語言重啟服務
else
echo "pulling failed"
fi
可以先在本地測試下sh 如果沒問題就用在gitlab后台test下是否push鈎子成功
如果shell寫的放的地方有文件生成 說明成功
沒問題的話給鈎子做個pm2守護進程 開機自啟 防掉線
pm2 start app.js --name webhooks
-- 開啟服務
pm2 startup
-- 開啟守護
pm2 save
-- 存放 pm2 list 中的進程
pm2 unstartup
-- 如果不想守護了
結束
感謝
https://about.gitlab.com/installation/#centos-7
https://cloud.tencent.com/developer/article/1007284
https://www.lovelucy.info/auto-deploy-website-by-webhooks-of-github-and-gitlab.html