GitLab 实现动态 Environment URL

之前 fir 上传接口返回的数据里增加了一个 release_id,让我们可以直接跳转到对应 Build 的下载页面,但 GitLab 并不支持动态 Environment URL

为此 GitLab 提供了一个环境变量 CI_ENVIRONMENT_SLUG,可以作为合法的子域名使用,但这种方式并不利于我们接入第三方服务,例如 iOS 常用的测试分发平台 fir。

解决方法也很简单,使用一个中转服务器去存储 CI_ENVIRONMENT_SLUG 与下载地址的映射,然后通过 CI_ENVIRONMENT_SLUG 访问时查询对应的下载链接,重定向过去即可。

我顺手用 Sinatra + SQLite 实现了一套,首先是定义资源 download_url,添加 put方法新增下载链接:

put '/download_url' do
  request.body.rewind
  json = JSON.parse request.body.read

  slug = json['ci_environment_slug']
  release_id = json['fir_release_id']
  download_url = json['fir_download_url']

  pass unless !slug.nil? || !slug.empty?
  pass unless !release_id.nil? || !release_id.empty?
  pass unless !download_url.nil? || !download_url.empty?
  
  guru_club_releases.insert(ci_environment_slug: slug, 
                            fir_release_id: release_id,
                            fir_download_url: download_url)

  'Success'
end

接着是 get,通过 ci_environment_slug 获取资源:

get '/download_url' do
  slug = params['ci_environment_slug']

  row = guru_club_releases.where(ci_environment_slug: slug).first

  if row
    download_url = row[:fir_download_url]
    release_id = row[:fir_release_id]
    redirect "#{download_url}?release_id=#{release_id}"
  else
    halt 404, 'Could not find corespond release'
  end
end

这里有完整的 Demo