基於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:
複製程式碼
執行服務並初始化
- 執行服務
$ 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目錄
複製程式碼
- 編寫
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;
}
}
複製程式碼
- 重啟
nginx
使配置生效 - 訪問
gittest.yiranzai.top
完成初始化配置
長圖顯示配置過程
- 編輯檢視gitea的配置
$ vim /var/lib/gitea/gitea/app.ini
...
# 這裡我只放出有關Cache的配置
[cache]
ADAPTER = memcache
HOST = test_memcache:11211
...
複製程式碼
建立倉庫,開始起飛
啥?不會建立倉庫?勸退勸退
友情提示,右上角的
+
可以遷移別的倉庫到gitea
END
每次到了結束,都莫名其妙的有一些成就感,大概是因為折騰出來一個新東西。
總之,終於搞好了,先慢慢隨便點點,熟悉熟悉這個簡單又強大的程式碼託管平臺吧。
Happy Coding!