[小團隊自動化] 基於Gitea打造一個屬於你自己的程式碼託管平臺

一冉再發表於2019-03-08

基於Gitea打造一個屬於你自己的程式碼託管平臺


寫在前邊

為什麼要打造一個屬於自己的程式碼託管平臺呢?這個事情還要從我剛開始工作說起。

我是在大三下學期的時候,大概是2017年三月份,以個人身份做過一些小專案,接收不了學校的課程無趣無意義,最後實在耐不住呆在學校的無聊和寂寞(是的,那個時候還是條單身狗),就天天逃課出去找了個工作,算是第一份工作吧。

想想過得好快,現在已經是2019年的2月了(傳說中的兩年工作/划水經驗?)期間換了兩家公司,工作方式也改變了許多。

  • 第一家公司時期,sftp一把梭
  • 第二家公司時期,svn 版本控制,寫了鉤子,能夠提交程式碼以後自動拉取
  • 第三家公司(現在),GitLab,由團隊的leader來把控程式碼的合併

我自己的使用習慣也發生了很大變化。想我在寫下基於Nginx的高可用大併發微信電子商城系統設計與實現——畢業設計的時候,還是分別在兩臺伺服器寫了 php 指令碼,通過配置 svn 的鉤子來請求兩個 php 指令碼來同時拉取程式碼的。

在熟悉了 git workflow 後,自己也慢慢習慣使用 git 來管理自己的程式碼。But,我相信你也和我一樣在很多時候,並不希望自己的倉庫是公開的(在開始決定使用 gitea 的時候 github 私倉還不免費),畢竟有些東西是敏感的。

讓我們來比較一下各種程式碼託管平臺

  • 自建Git伺服器(git init --bare test.git),一開始我確實這麼幹的,但是講道理太不方便管理了
  • GitLab,資源佔用比較高,放棄。
  • Gitee,碼雲,對於國內團隊無疑是最好的,但是國際化支援不太好。
  • GitHub,花錢,我是窮鬼,跳過。
  • Gogs,資源佔用低,配置方便,支援遷移,一開始用的這個,個人維護的,更新有點慢。
  • Gitea,Gogs的Fork版本,團隊維護,功能更加豐富,支援程式碼審計,更加活躍和激進。

一開始我確實是自建Git伺服器,太不方便了,後來瞭解了 Gogs ,開始使用 Gogs 的,再後來就是了解到 Gitea 這個 Gogs 的Fork版本,一樣的特性,功能更加豐富,於是我選擇了升級到 Gitea


部署自己的 gitea

說幹就幹,開始搞事情吧,接下來都是乾貨

準備工作

準備為 Gitea 使用的域名為 gittest.yiranzai.top

如果要將git和其它資料持久化,你需要建立一個目錄來作為資料儲存的地方

mkdir -p /var/lib/gitea
複製程式碼

編寫 docker-compose.yml檔案

還不瞭解docker-compose?點選這裡瞭解學習配置docker-compose

我們需要

  • nginx (使用 nginx 來做對外的服務代理,不要讓 gitea 直接對外暴露web服務)
  • memcached(為 gitea 提供 Cache 服務)
  • mysql (儲存 gitea 所需要儲存的資料)
  • gitea (程式碼託管平臺)
version: "3.7"
services:
  nginx:
    image: nginx:alpine
    container_name: test_nginx
    ports:
      - "80:80"
    restart: always
    networks:
      - giteanet
  mysql:
    image: mysql:5.7
    restart: always
    container_name: test_mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root_password
      - MYSQL_DATABASE=gitea
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=gitea_password
    networks:
      - giteanet
    volumes:
      - /path/to/conf/my.cnf:/etc/mysql/my.cnf:rw
      - /path/to/data:/var/lib/mysql/:rw
      - /path/to/logs:/var/log/mysql/:rw
  memcache:
    image: memcached:alpine
    container_name: test_memcache
    restart: always
    networks:
      - giteanet
  gitea:
    image: gitea/gitea:latest
    restart: always
    container_name: test_gitea
    networks:
      - giteanet
    ports:
      - "22:22"			#git服務對外使用22埠會更加方便
    volumes:
      - /var/lib/gitea:/data:rw	#gitea的data資料應該做持久化,對映到宿主機磁碟上
networks:
  giteanet:
複製程式碼

執行服務並初始化

  1. 執行服務
$ docker-compose up -d
Creating test_memcache ... done
Creating test_nginx    ... done
Creating test_mysql    ... done
Creating test_gitea    ... done
$ docker-compose ps   
    Name                   Command               State                     Ports                   
---------------------------------------------------------------------------------------------------
test_gitea      /usr/bin/entrypoint /bin/s ...   Up      0.0.0.0:22->22/tcp, 0.0.0.0:3000->3000/tcp
test_memcache   docker-entrypoint.sh memcached   Up      11211/tcp                                 
test_mysql      docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp                       
test_nginx      nginx -g daemon off;             Up      0.0.0.0:80->80/tcp  
$ cd /var/lib/gitea
$ tree .
$ .
├── git              # git倉庫儲存位置
├── gitea
│   ├── conf
│   │   └── app.ini  # gitea配置檔案
│   └── log          # gitea log目錄
└── ssh              # ssh key目錄
複製程式碼
  1. 編寫 nginx 配置檔案
server {
    listen       80;
    server_name gittest.yiranzai.top;
    location / {
        proxy_pass http://test_gitea:3000;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}
複製程式碼
  1. 重啟 nginx 使配置生效
  2. 訪問 gittest.yiranzai.top完成初始化配置

長圖顯示配置過程

[小團隊自動化] 基於Gitea打造一個屬於你自己的程式碼託管平臺

  1. 編輯檢視gitea的配置

Gitea完整配置請檢視這裡

$ vim /var/lib/gitea/gitea/app.ini
...
# 這裡我只放出有關Cache的配置
[cache]
ADAPTER = memcache
HOST = test_memcache:11211
...
複製程式碼

建立倉庫,開始起飛

啥?不會建立倉庫?勸退勸退

友情提示,右上角的 + 可以遷移別的倉庫到 gitea


END

每次到了結束,都莫名其妙的有一些成就感,大概是因為折騰出來一個新東西。

總之,終於搞好了,先慢慢隨便點點,熟悉熟悉這個簡單又強大的程式碼託管平臺吧。

Happy Coding!

系列文章

相關文章