代码托管网站有 github、gitee 等,但是 github 访问不是很通畅,gitee 总是审查严格。有些代码团队开发共享而暂时不方便公开时,使用自己搭建的代码托管平台会更合适些。本篇介绍如何利用 dokcer 搭建私人代码托管平台 gitlab。

安装

假设 docker 和 docker-compose 已经按照完成。如果没有安装,可以参考我的另一篇博客:docker 简单介绍.

下面跟着命令进行安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 创建工作目录
cd /disk0/proj-pf
mkdir gitlab

# hostname 改为自己的; external_url 改为自己的,8901 与 ports 里的端口映射对应上,不然后面通过 http 克隆代码库时会找不到链接。
# ssh 端口根据自己修改更改
# 把数据、配置文件和日志等保存到宿主机,方便后面更新镜像库
cat > /disk0/proj-pf/docker-compose.yml <<-"EOF"
version: '3.6'
services:
web:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: '10.2.28.35'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://10.2.28.35:8901'
gitlab_rails['gitlab_shell_ssh_port'] = 8902
ports:
- '8901:8901'
- '8902:22'
volumes:
- '/disk0/proj-pf/gitlab/config:/etc/gitlab'
- '/disk0/proj-pf/gitlab/logs:/var/log/gitlab'
- '/disk0/proj-pf/gitlab/data:/var/opt/gitlab'
shm_size: '256m'
EOF

# 启动
cd /disk0/proj-pf/gitlab
docker-compose up -d

# 停止
docker-compose down

使用

默认配置有 root 账户,可以使用 root 登录。密码查看方法如下:

1
2
# 这里的 gitlab-web-1 为 gitlab 容器名,根据自己的情况查看
docker exec -it gitlab-web-1 grep 'Password:' /etc/gitlab/initial_root_password

注意:root 用户的默认密码有效期24小时,请尽快修改密码。

默认在 gitlab 创建的代码库的分支为 main,但是低版本的 git 创建的是 master,想要使用 main (大趋势),需要安装最新版的 git 或者 git 版本大于 2.28.0,安装方法如下:

1
2
3
4
5
6
7
sudo add-apt-repository ppa:git-core/ppa

sudo apt update
sudo apt install git

# 查看 git 版本
git --version

假设本地已经有了一个代码工程,想要托管到刚刚搭建好的 gitlab 平台上,可以先在 gitlab 上创建一个空项目,然后在本地服务器执行如下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 以 main 为默认分支
git config --global init.defaultBranch main

# 解决中文乱码
git config --global core.quotepath false

# 增加默认用户名和邮箱
git config --global user.name "jinzhongxu"
git config --global user.email "jinzhongxu@outlook.com"


# 开始把本地代码项目依托到 gitlab 平台上
# 在该平台上能够直接编辑,在线编辑可使用 visual studio code。
cd py-local-codes

# 把代码项目初始化为 git 项目
git init

# 添加远程仓库。请使用你自己的仓库地址,这里只是演示
# 如果使用 8902 的 ssh 方式,需要先在账户设置中增加ssh公钥,后续提交代码就不需要输入密码
# 如果使用 8901 的 http 方式,后续每次提交代码都需要输入用户名和密码
git remote add origin ssh://git@10.2.28.35:8902/jinzhongxu/awesome-python

# 先 pull 平台仓库里的文件,如果存在 README.md
# 第一次 pull 代码到本地,需要设置默认的分支。后续 pull 只需要:git pull
git pull origin main

# 检测状态,并把本地代码添加到库里,push 到平台上
git status
git add .
git commit -m "add init"

# 提交到 gitlab 仓库,并同时设置默认提交分支。第一次提交需要指定分支,后续提交可直接使用:git push
git push --set-upstream origin main

# 如果提交后,又进行了代码的修改、增删、优化等,可按照下面方法提交
# 建议每次 push 前下 pull 远程代码仓库
git pull
git add .
git commmit -m "增加/删除/优化了decoder"
git push

配置邮箱

首先需要到163邮箱(本人以163邮箱为例)开启SMTP服务,获取授权密码,然后本地进行配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 进入容器
docker exec -it gitlab-web-1 bash

# 编辑配置文件
vi /etc/gitlab/gitlab.rb

# 配置内容大概如下:
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "xjz@163.com"
# 使用授权密码,而不是邮箱的登录密码
gitlab_rails['smtp_password'] = "ABDCDKSKSFDJSLAFJ"
gitlab_rails['smtp_domain'] = "163.com"
gitlab_rails['smtp_authentication'] = "login"
# 下面两项不能同时为true
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
# gitlab_rails['smtp_pool'] = false

###! **Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert'**
###! Docs: http://api.rubyonrails.org/classes/ActionMailer/Base.html
gitlab_rails['smtp_openssl_verify_mode'] = 'none'

# gitlab_rails['smtp_ca_path'] = "/etc/ssl/certs"
# gitlab_rails['smtp_ca_file'] = "/etc/ssl/certs/ca-certificates.crt"

### Email Settings

gitlab_rails['gitlab_email_enabled'] = true

##! If your SMTP server does not like the default 'From: gitlab@gitlab.example.com'
##! can change the 'From' with this setting.
gitlab_rails['gitlab_email_from'] = 'xjz@163.com'
gitlab_rails['gitlab_email_display_name'] = 'Gitlaber'
gitlab_rails['gitlab_email_reply_to'] = 'xjz@163.com'

# 编译配置
gitlab-ctl reconfigure

# 控制台测试发生邮件
gitlab-rails console

# 在提示符中输入一下发生内容
Notify.test_email('jzx@163.com', '邮件主题', '邮件内容').deliver_now

个人经历:使用之前授权的 qq 邮箱配置未通过,改用 163 重新获取一个新授权密码后一次通过。

其他配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 配置时区
gitlab_rails['time_zone'] = 'Asia/Shanghai'

# 配置禁止 puma cluster mode,这样能够减少内存使用
puma['worker_processes'] = 0

# 配置禁用监控,减少内存使用
prometheus_monitoring['enable'] = false

# 不进行代码自动 CI/CD DevOps Pipeline
# 如果提交 *.yml, *.txt 进行自动 build 测试等,可在每个项目中设置关闭自动 DevOps
gitlab_rails['gitlab_default_projects_features_builds'] = false

# 不在 gitlab 上管理 docker 镜像
gitlab_rails['gitlab_default_projects_features_container_registry'] = false

参考文献

  1. Ubuntu 更新 Git 至最新版本
  2. docker安装gitlab的初始账号密码
  3. docker下gitlab安装配置使用(完整版)
  4. GitLab Docker images
  5. gitlab使用163发送邮件
  6. SMTP 配置