GitLab 升级,公开项目无需登录

Hello everybody,

Today we have upgraded GitLab from 6.1 to 6.3. The maintenance starts from 01:30 AM and lasts 14 minutes.

After this upgrade, public projects can be accessed without login. So now you are free to paste URLs in public projects anywhere on the web.

For example, you can access USTC Blog deploy script without login: https://gitlab.lug.ustc.edu.cn/ustc-blog/ustc-blog/blob/master/admin-tools/deploy.sh

Furthermore, you can use URL to “raw” files in automated scripts. For example

/bin/bash <(curl https://gitlab.lug.ustc.edu.cn/ustc-blog/ustc-blog/raw/master/admin-tools/deploy.sh) --clean

GitLab 6.3 also includes several security fixes and a redesigned UI. Enjoy!

gitlab.lug.ustc.edu.cn 部署 SSL 证书

gitlab.lug.ustc.edu.cn 部署了有效期两年的 Class 2 Organization Validation SSL 证书,包括 gitlab.lug.ustc.edu.cn 和 gitgeek.net。首页的 Logo 切换回了 GITLAB6 默认 logo,不再推荐使用 gitgeek.net,推荐使用学校域名 gitlab.lug.ustc.edu.cn。由于很多公开的链接都用了 gitgeek.net,我们仍然会维持其运行。

由于 GitLab 代码管理需要高安全性,强制跳转 HTTP 到 HTTPS。

服务器优化 TCP 参数

blog 和 mirrors 服务器调整了 ip_conntrack 配置:

net.ipv4.netfilter.ip_conntrack_max=655360

# should not be less than net.ipv4.tcp_keepalive_time (default 7200)
net.netfilter.nf_conntrack_tcp_timeout_established=14400

blog,mirrors 和 gitlab 调整了 TCP 发送窗口大小限制,以充分利用高延迟和高带宽的线路:

net.core.wmem_max=12582912
net.core.rmem_max=12582912
net.ipv4.tcp_rmem= 10240 87380 12582912
net.ipv4.tcp_wmem= 10240 87380 12582912

blog,mirrors 和 gitlab 在 HTTP 持久连接期间不再慢启动,以加快第二次及以后访问页面:

net.ipv4.tcp_slow_start_after_idle=0

增加 TCP 发送和接收默认窗口大小到 10 个 MSS,以减少小 HTTP 请求和 HTTPS 握手的来回次数。对 2.6.33 以下内核只能调整默认发送窗口大小(以下命令仅为示例):

# example on Debian wheezy
ip route change default via 202.141.176.126 initrwnd 10 initcwnd 10
# example on Debian squeeze
ip route change default via 202.141.176.126 initcwnd 10

Gitlab的bug修复

gitlab升级到6.0之后,用户在新建project选择namespace的时候,会发现无法选择以前创建的group。这个bug推测是升级的时候造成的。

原因是在users_groups这个表中无法找到这些组的信息。

$ mysql -u root -p

$ use gitlab;

$ show tables;

users_groups表存储了用户和group的关系,其中的group_access推测是权限,50是指group owner。

namespaces表储存了namespace。这里的id就是users_groups表中的group_id。

将丢失的信息重新加进去就可以了

GitLab 支持 SPDY 协议

GitLab 支持 Google 提出的 SPDY 协议,通过压缩、多路复用,可以有效加速 HTTPS 协议。我们使用了 Nginx 1.4 开始内置的 SPDY 模块,支持 SPDY/2 协议。

赶快来体验 SPDY-enabled 的 gitgeek.net 吧!

  1. 用 Chrome 浏览器,先访问 https://gitgeek.net/users/sign_in 再访问 chrome://net-internals/#spdy 看 gitgeek.net 是否在 SPDY Sessions 列表中。
  2. 使用第三方 SDPY 协议验证工具:http://spdycheck.org/#gitgeek.net

To GitLab Maintainers: SPDY 需要 Nginx 1.4+ 和 OpenSSL 1.0.1c+,Nginx 1.5.6 是从官网上下载源码编译的,OpenSSL 1.0.1e 是加入了 Debian sid 源后升级的(原来是 OpenSSL 0.9.8)。OpenSSL 1.0.1e 又依赖 gcc 4.5+,而 Debian squeeze 上的 gcc 是 4.4.x,因此把 gcc 也升级到了 4.8,libc 也升级到了 2.17。不要随意执行 apt-get upgrade 了,以免把整个系统升级到 sid。

GitLab SSH 无 key 时不再提示输入密码

之前 git clone [email protected]:namespace/project.git 的时候,如果没设置好 SSH key,会提示输入密码,很多用户对此感到迷惑。现在在 sshd_config 中加了下面两行,会直接提示访问被拒绝。

Match User git
PasswordAuthentication no

Tips:GitLab 的代码仓库支持 SSH 和 HTTPS 两种访问方式:

  1. SSH 访问,需要用 ssh-keygen 生成密钥,把公钥(id_rsa.pub)添加到 GitLab 个人管理区域的 public key。
  2. HTTPS 访问,每次连接服务器都要输入用户名(注册邮箱)和密码。可以作为在公用电脑上的临时访问方式。

GitLab 挂上小绿锁了

代码安全是一件比较严肃的事情。看到这么多人使用 GitLab,我自己也经常在校外使用 GitLab,安全的 HTTPS 传输是必要的。由于 gitlab.lug.ustc.edu.cn 是三级域名,LUG 也没有顶级域名 ustc.edu.cn 的管理权限,搞 SSL 证书是比较麻烦的。

为此,我申请了 gitgeek.net 域名,去 StartSSL 申请了一个免费 SSL 证书。没办法,GoDaddy 非促销季的证书太贵了;要是那位高富帅给 USTC 搞个 Verisign 的 Extended Validation,我可以给TA所有服务器的 root 🙂

总之,GitLab 挂上小绿锁了:

screenshot

在 Ubuntu 和 Windows 下的主流浏览器中测试,均可以正常访问。在 Debian 和 cygwin 中用 git clone 和 curl 也可以正常访问。由于 wget 1.12 的一个 bug,会提示证书不匹配,升级 wget 即可。

如果大家发现小绿锁没有挂上,或者 HTTPS 访问出现任何问题,请把你用的操作系统、浏览器或命令行工具的名称及版本号发到 [email protected]

原来的 http://gitlab.lug.ustc.edu.cn 仍然可以使用,只不过登出之后,登录会跳到 gitgeek.net……… GitLab 就是这样的,我本来不想这样……

Tips for GitLab Maintainers

修改配置文件后,最好清除 Redis Cache。例如 Gravatar 的 URL 会缓存,今天下午我百思不得其解的小黄锁问题就是由于早先生成的 HTTP URL 被缓存了。清除缓存步骤:

  1. sudo -u git -i
  2. cd gitlab
  3. RAILS_ENV=production bundle exec rake cache:clear

重启 gitlab 服务需要比较长的时间,虽然 sudo service gitlab restart 会立即显示成功,但事实上还是原来的 sidekiq 和 unicorn 在运行。可以用 sudo service gitlab status 和 pstree -pa 来查看 gitlab 服务的状态。如果发现“残余进程”,要 kill 掉再 sudo service gitlab start。

如果 gitlab 服务起不来,可以查看 ~git/gitlab/log/ 里的日志文件。

注意,从 StartSSL 申请的免费证书是 intermediate CA 签发的,为了在 git clone 和 curl 中正常使用,需要 cat intermediate.CA.crt >> gitlab.crt,把自己的证书和 intermediate CA 证书连接在一起。