Leon's Blogging

Coding blogging for hackers.

Environment Banner

| Comments

可以很快速的知道目前環境上的版本是什麼

公司因為多台機器不同環境,因此有同事做了一個 Environment banner,可以很方便地知道目前是哪一個 branch 哪一個 版本,這邊就來記錄一下

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
46
47
48
49
50
51
# app/helpers/environment_banner_helper.rb
module EnvironmentBannerHelper
  RELEASE_INFO_PATH = Rails.public_path.join('release_info')

  def current_branch
    if git_available?
      # 讀取當前 HEAD 所在的 branch 名稱
      `git rev-parse --abbrev-ref HEAD`.chomp
    else
      # 當在 deploy 的時候,無法用 git (除非另外裝),因此可以先將資訊存放在某的檔案,或是環境變數
      git_info[:branch] # 檔案
      # ENV.fetch("CURRENT_BRANCH", "--branch-not-found--") # ENV
    end
  end

  def current_sha
    if git_available?
      # 讀取當前的 log 最新一行
      `git log --oneline -1`
    else
      # 當在 deploy 的時候,無法用 git (除非另外裝),因此可以先將資訊存放在某的檔案,或是環境變數
      git_info[:sha] # 檔案
      # ENV.fetch("CURRENT_SHA", "--sha-not-found--") # ENV
    end
  end

  # 確認當前環境有沒有 git
  def git_available?
    to_dev_null = "> /dev/null 2>&1"
    system("which git #{to_dev_null} && git rev-parse --git-dir #{to_dev_null}")
  end

  # 主要是為了 capistrano 上面會有不同的 release 資料夾
  def release_number
    return unless check_release_info && IO.readlines(RELEASE_INFO_PATH)[0]
    IO.readlines(RELEASE_INFO_PATH)[0].gsub(/\D/, '').prepend('#')
  end

  def git_info
    return { sha: "N/A", branch: "N/A"} unless check_release_info && IO.readlines(RELEASE_INFO_PATH)[1]
    line = IO.readlines(RELEASE_INFO_PATH)[1].split(/\s+/)
    {
      sha:    line[0][0..6],
      branch: line[1].gsub(/refs\/heads\//, '')
    }
  end

  def check_release_info
    File.exist? RELEASE_INFO_PATH
  end
end
1
2
3
4
5
6
# app/views/layouts/application.html.erb
<% unless Rails.env.production? %>
  <div class="environment-banner <%= Rails.env %>">
    <%= Rails.env %> | <%= "#{current_branch} @ #{current_sha} #{release_number}" %>
  </div>
<% end %>
1
2
3
4
5
/* app/assets/stylesheets/application.scss */
.environment-banner.development {
  background: $green;
  color: $white;
}

capistrano deploy 時新增 release_info 檔案方式

1
2
3
4
5
6
7
8
9
10
set :repo_url, 'git@github.com:xxx/xxx.git'
ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

# 將所有 git 撞況寫到一個 file 上,再透過該 file 來顯示
# readlink 可以找到實際檔案位置,awk 分析出路徑上最後的 release 資料夾名稱
execute("echo current_release: `readlink -f #{release_path} | awk -F'/' '{print $NF}'` > #{shared_path.join('public/release_info')}")
# header
execute("git ls-remote -h #{fetch(:repo_url)} #{fetch(:branch)} >> #{shared_path.join('public/release_info')}")
# tag
execute("git ls-remote -t #{fetch(:repo_url)} | tail -n 1 >> #{shared_path.join('public/release_info')}")

Comments