centos7 搭建gitlab服務器 支持郵件服務 git鈎子


gitlab是一款開源的類似github代碼托管平台。也就是說自己服務器上可以搭建個git倉庫。 稍微有點難度需要你掌握 js linux http協議等。 所以寫個備忘錄 也方便其他人少踩坑。

  1. 檢測環境

  2. 安裝gitlab

  3. 基本配置gitlab

  4. gitlab后台界面

  5. 郵件服務

  6. https

  7. webhooks

檢測環境

首先你需要購買雲主機 廠家隨意 建議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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM