需求
之前团队从 SVN 已经转到 Git 管理代码了,但是但是大家还是非常不熟悉怎么管理,应该也是我没有把大家带入正轨吧,关于 GitFlow 没有好好给大家讲清楚,木办法。用Gogs 管理感觉不是太好,代码多了,团队项目多之后管理不是太方便。于是把目标转向了 Gitlab。但是发现服务器直接装 Gitlab 很不爽,要装一大垞东东。那就转为 Docker 吧,经过一些尝试,一段时间的运行非常不错,加上 Gitlab Runner 测试提交文件是否有问题。也可以直接用 Runner 来打包发布,但是暂时没用它,现在还是用 Jenkins 来进行发布。也比较好用了,大家代码提交合并后,一键发布代码。 :)
其中外网 IP 的 1111 端口映射到服务器的 5622 端口,但 5622 端口已用 nginx 反射代理了 nexus,所以 docker gitlab 在主要要换一个端口,暂时用了 18080。
安装 Gitlab
把 Docker 安装好,然后设置好代理,要不然的话,下载镜像实在是太太太太慢了。我用了两个代理,一个是官方的天朝代理,一个是中科大的代理。
1 2 3 4 5 6 7
| { "registry-mirrors": ["https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn"], "insecure-registries": ["x.x.x.x:8088"], "disable-legacy-registry": true, "log-driver": "json-file", "log-opts": { "max-size": "5m", "max-file": "3" } }
|
然后就是开始拖镜像,运行容器了。再稍微进行一点配置就 OK。
前期准备工作
- Host 有 git 用户
- 生成 Host git 用户与 docker git 用户通信用的 ssh 密钥与公钥,
ssh-keygen
。公钥保存在/opt/gitlab/authorized_keys_proxy
,密钥保存在/opt/gitlab/id_rsa
。 - 找一份 sshd 配置文件拷贝一份至
/opt/gitlab/sshd_config
,修改一处AuthorizedKeysFile
,让 Host git 用户用密钥登录至 docker gitlab。参考处
1 2 3
| ... AuthorizedKeysFile %h/.ssh/authorized_keys /gitlab-data/ssh/authorized_keys ****重要**** ...
|
- 查看 git 用户 user id 和 group id,生成一份passwd和group文件给 docker gitlab 使用,文件见文末,从 gitlab 中提取的。我服务器上分别是 1006 和 1008。为了保证 Host 和 docker gitlab 中的数据文件不会因为权限问题而无法使用。主要是 gitlab 中的用户 SSH Key 文件与 Host git 用户共享。
- 在 Host 写个 bash 脚本,用于转发 Host 22 端口接收到 git 用户时转到 docker gitlab 去。
1 2 3
| su - git mkdir -p /opt/gitlab/data/.ssh ln -sf /opt/gitlab/data/.ssh /home/git/.ssh
|
- gitlab 用户用 SSH Key 进行 git 操作时,先连接到 Host,读取
/home/git/.ssh/authorized_keys
信息并验证,其中authorized_keys
第一行告诉用户强制运行一条命令/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell
,正好用此命令转发 git 命令至 docker gitlab。这点与gogs中的配置类似。
/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell1 2 3
| #!/bin/sh
ssh -i /opt/gitlab/id_rsa -p 12222 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
|
运行 gitlab
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker pull gitlab/gitlab-ce:latest docker run -d -e -p 18080:5622 -p 12222:22 \ --name gitlab --restart always \ -v /opt/gitlab/config:/etc/gitlab \ -v /opt/gitlab/logs:/var/log/gitlab \ -v /opt/gitlab/data:/var/opt/gitlab \ -v /opt/gitlab/sshd_config:/etc/ssh/sshd_config:ro \ -v /opt/gitlab/authorized_keys_proxy:/gitlab-data/ssh/authorized_keys:ro \ -v /opt/gitlab/passwd:/etc/passwd:ro \ -v /opt/gitlab/group:/etc/group:ro \ -v /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone:ro \ --ulimit sigpending=62793 --ulimit nproc=131072 \ --ulimit nofile=60000 --ulimit core=0 \ gitlab/gitlab-ce:latest
|
配置 gitlab
用docker ps
查看 gitlab 容器运行成功后,停止容器运行,对 gitlab 进行配置。我的配置项如下。详细各配置项可见 gitlab.rb 的注释说明,或参照gitlab 官网说明。
/opt/gitlab/config/gitlab.rb1 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
| external_url 'http://10.17.65.22:5622/gitlab' gitlab_rails['gitlab_ssh_host'] = '10.17.65.22' gitlab_rails['time_zone'] = 'Asia/Shanghai' gitlab_rails['gitlab_email_enabled'] = true gitlab_rails['gitlab_email_from'] = 'admin@guoliangwu.com' gitlab_rails['gitlab_email_display_name'] = 'Admin' gitlab_rails['gitlab_email_reply_to'] = 'no_reply@guoliangwu.com' gitlab_rails['gitlab_username_changing_enabled'] = false gitlab_rails['gitlab_default_theme'] = 4 gitlab_rails['gitlab_default_projects_features_snippets'] = false gitlab_rails['gitlab_default_projects_features_builds'] = false gitlab_rails['gitlab_default_projects_features_container_registry'] = false gitlab_rails['incoming_email_enabled'] = false gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.guoliangwu.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['smtp_user_name'] = "admin@guoliangwu.com" gitlab_rails['smtp_password'] = "xxxx" gitlab_rails['smtp_domain'] = "guoliangwu.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true gitlab_rails['registry_enabled'] = false unicorn['worker_processes'] = 4 sidekiq['concurrency'] = 15 postgresql['shared_buffers'] = "2GB" prometheus['enable'] = false
|
end
至此,Gitlab 应该能欢快地跑起来了。后面我在其它服务器配了 gitlab runner 来检查上传的代码是否有问题,不知道有没有时间深入了解 runner,先把.gitlab-ci.yml
传上来,以备以后使用吧。PS:因为以后打包发布什么的都要用 maven,就用了 maven 镜像。
.gitlab.yml1 2 3 4 5 6 7 8 9 10
| image: maven:latest
test: stage: test script: - test $(find shanghai/service -name "*.properties" -path "*/properties/*" | wc -l) -eq 0 - test $(find shanghai/web -name "index.js" -path "*/config/*" | wc -l) -eq 0 - test $(find shanghai/web -name "*.vue" -type f -exec grep -E 'debugger|console\.log' {} \; | wc -l) -eq 0 tags: - common
|
passwd
/etc/gitlab/passwd1 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
| root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false _apt:x:104:65534::/nonexistent:/bin/false sshd:x:105:65534::/var/run/sshd:/usr/sbin/nologin git:x:1006:1008::/var/opt/gitlab:/bin/sh ****注意**** gitlab-www:x:999:999::/var/opt/gitlab/nginx:/bin/false gitlab-redis:x:997:997::/var/opt/gitlab/redis:/bin/false gitlab-psql:x:996:996::/var/opt/gitlab/postgresql:/bin/sh mattermost:x:994:994::/var/opt/gitlab/mattermost:/bin/sh registry:x:993:993::/var/opt/gitlab/registry:/bin/sh gitlab-prometheus:x:992:992::/var/opt/gitlab/prometheus:/bin/sh gitlab-consul:x:991:991::/var/opt/gitlab/consul:/bin/sh
|
group
/opt/gitlab/group1 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 46 47 48 49 50 51 52
| root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: kmem:x:15: dialout:x:20: fax:x:21: voice:x:22: cdrom:x:24: floppy:x:25: tape:x:26: sudo:x:27: audio:x:29: dip:x:30: www-data:x:33: backup:x:34: operator:x:37: list:x:38: irc:x:39: src:x:40: gnats:x:41: shadow:x:42: utmp:x:43: video:x:44: sasl:x:45: plugdev:x:46: staff:x:50: games:x:60: users:x:100: nogroup:x:65534: systemd-journal:x:101: systemd-timesync:x:102: systemd-network:x:103: systemd-resolve:x:104: systemd-bus-proxy:x:105: ssh:x:106: git:x:1008: ****注意**** gitlab-www:x:999: gitlab-redis:x:997: gitlab-psql:x:996: mattermost:x:994: registry:x:993: gitlab-prometheus:x:99
|