我们目前使用 SubVersion,但希望迁移到基于 Git 的解决方案,以便能够执行提交前代码审查。要求是中央 Git 存储库托管在本地,具有可视化前端以允许管理项目,并使用 Active Directory 身份验证。
作为试用,我在运行 Ubuntu Server 18.04 的虚拟机上安装了 GitLab EE。我使用以下配置设置了 AD 身份验证:
gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
main:
label: 'MyOrganisation'
host: '172.16.0.6'
port: 389
uid: 'sAMAccountName'
bind_dn: 'CN=ldapbinduser,CN=Users,DC=myorganisation,DC=com'
password: 'password'
timeout: 30
active_directory: true
allow_username_or_mail_login: false
lowercase_usernames: true
block_auto_created_users: true
base: 'OU=Software,OU=Engineering,DC=myorganisation,DC=com'
group_base: 'OU=Software,OU=Engineering,DC=myorganisation,DC=com'
admin_group: 'internal software dept'
EOS
这已部分成功。GitLab 登录页面中出现 MyOrganisation 选项卡,Software 组的成员可以使用其 AD 登录名和密码登录,而非成员则不能。“Internal Software Dept”组的成员不会自动分配管理员权限,但这没关系,因为我们可以手动添加它们。
尝试将 SVN 存储库的历史记录推送到 GitLab 或克隆存储库时,会出现问题。我在 GitLab 中创建了一个内部软件组,并使用 readme.txt 文件向其添加了一个 TestProject 项目。在我的 Windows 10 PC 上,我安装了适用于 Windows 的 Git Credential Manager。当我尝试使用以下命令将其克隆到我的 PC 时:git clonehttp://gitlab/internal-software/testproject.git 我收到一条消息:
致命:无法访问'http://gitlab/internal-software/testproject.git/':请求的 URL 返回错误:500 WireShark 显示两次连接尝试,第一次尝试响应为 401 – 未经授权,第二次尝试响应为 500 – 内部服务器错误:
1 local IP gitlab IP TCP 66 59710 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
2 gitlab IP local IP TCP 66 80 → 59710 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM=1 WS=128
3 local IP gitlab IP TCP 54 59710 → 80 [ACK] Seq=1 Ack=1 Win=525568 Len=0
4 local IP gitlab IP HTTP 241 GET /internal-software/testproject.git/info/refs?service=git-upload-pack HTTP/1.1
5 gitlab IP local IP TCP 60 80 → 59710 [ACK] Seq=1 Ack=188 Win=30336 Len=0
6 gitlab IP local IP HTTP 618 HTTP/1.1 401 Unauthorized (text/plain)
7 local IP gitlab IP TCP 54 59710 → 80 [ACK] Seq=188 Ack=565 Win=524800 Len=0
8 local IP gitlab IP HTTP 292 GET /internal-software/testproject.git/info/refs?service=git-upload-pack HTTP/1.1
9 gitlab IP local IP TCP 60 80 → 59710 [ACK] Seq=565 Ack=426 Win=31360 Len=0
10 gitlab IP local IP TCP 1514 80 → 59710 [ACK] Seq=565 Ack=426 Win=31360 Len=1460 [TCP segment of a reassembled PDU]
11 gitlab IP local IP TCP 1514 80 → 59710 [ACK] Seq=2025 Ack=426 Win=31360 Len=1460 [TCP segment of a reassembled PDU]
12 gitlab IP local IP HTTP 309 HTTP/1.1 500 Internal Server Error (text/html)
13 local IP gitlab IP TCP 54 59710 → 80 [ACK] Seq=426 Ack=3740 Win=525568 Len=0
14 local IP gitlab IP TCP 54 59710 → 80 [RST, ACK] Seq=426 Ack=3740 Win=0 Len=0
500 – 内部服务器错误响应的内容是标准的 GitLab 500 – “哎呀,我们这边出了点问题” 页面。
在服务器上,我查看了 var/logs/gitlab/gitlab-rails 中的 .log 文件,并在 production_json.log 中发现了以下内容:
{“method”:“GET”,“路径”:“/internal-software/testproject/git/info/refs”,“格式”:“/","controller":"项目::GitHttpController","action":"info_refs","status":401,"duration":35.81,"view":1.05,"db":9.7,"time":"2019-09-19T08:37:55.371Z","params":[{"key":"service","value":git-upload-pack"},{"key":"namespage_id","value":"internal-software"},{"key":"project_id","value":"testproject.git"}],"remote_ip":"172.16.1.46","user_id":null,"username":null,"ua":git/2.17.0.windows.1","queue_duration":null,"correlation_id":"long_uid"} {“method”:“GET”,“路径”:“/internal-software/testproject/git/info/refs”,“格式”:“/","controller":"Projects::GitHttpController","action":"info_refs","status":500,"error":"ArgumentError:必须提供加密或方法","duration":215.3,"view":0.0,"db":14.11,"time":"2019-09-19T08:37:55.803Z","params":[{"key":"service","value":git-upload-pack"},{"key":"namespage_id","value":"internal-software"},{"key":"project_id","value":"testproject.git"}],"remote_ip":"172.16.1.46","user_id":null,"username":null,"ua":git/2.17.0.windows.1","queue_duration":null,"correlation_id":"long_uid"}
这些似乎与上面的 HTTP 请求和响应相匹配。第一个是 401,第二个是 500。
错误信息是 ArgumentError: 必须提供加密或方法 我曾尝试在 GitLab 网站、Stack Overflow、Stack Exchange 和一些知名搜索引擎上搜索这个问题,但只得到与我的问题不符的近似结果。
答案1
GitLab 支持人员给出的答案是我在配置中缺少以下设置:
encryption: 'plain'
verify_certificates: true
有了这些,我就可以克隆和推送了。我注意到,其他任何连接的人都被告知他们的帐户已被阻止,直到我使用管理员帐户解除阻止。