docker 發佈應用時添加 git revision

概要

docker 發佈應用時, 將 git revision 注入到應用中, 在問題出現時, 能夠迅速定位代碼版本.前端

實施步驟

  1. 獲取 git revision
  2. 將 git revision 傳入具體的應用中
    • 前端的 revision 經過 yarn build 傳入
    • 後端的 revision 經過 環境變量傳入

獲取 git revision

GIT_TAG=`git describe --tags`
IFS='-' read -r -a tags <<< $GIT_TAG
if [ "${#tags[@]}" = "1" ]; then
    GIT_COMMIT=$tags
else
    GIT_COMMIT=`git rev-parse HEAD | cut -c 1-8`
fi

上面的代碼是獲取最新的 git revision 的前 8 位, 若是最新的 git revision 有 tag, 則使用 tag 獲取的 git revision 放在 GIT_COMMIT 中.webpack

前端 git revision 注入

首先是 docker build 命令中傳入 git revisiongit

docker build -t xxx.latest --build-arg VERSION=${GIT_COMMIT} .

而後在 docker file 中獲取 VERSION, 並將其傳給 yarn build 命令golang

ARG VERSION=no-version          # 默認值 no-version
RUN yarn
RUN yarn build --VERSION=${VERSION}

最後是前端工程中獲取此變量, 並在頁面的 footer 處顯示 git revisionweb

process.argv
       .filter(str => /^--/.test(str))
       .map(str => str.replace('--', ''))
       .forEach(str => {
         let sub = str.match(/([\s\S]*)\=([\s\S]*)/)

         sub ? (TYPE[sub[1]] = sub[2]) : (TYPE[str] = true)
       })

const mergeWebpackConfig = () => (config, env) => {
  // ...省略...

  config.plugins = (config.plugins || []).concat([
    new webpack.DefinePlugin({
      'process.env.VERSION': JSON.stringify(TYPE['VERSION'])
    })
  ])
  // ...省略...
}
<Footer>
  <div
    style={{ textAlign: 'center' }}
    className="gx-layout-footer-content"
  >
    Copyright © 2019 {process.env.VERSION}
  </div>
</Footer>

後端 git revision 注入

本文的例子是基於 golang 的 API 後端, 獲取 git revision 的方法和上面相似.docker

獲取 git revision 以後, 在 docker file 中獲取 VERSION, 並設置環境變量 VERSION後端

ARG VERSION=no-version
ENV VERSION=${VERSION}

API 服務添加 -v 參數, 用來顯示服務的版本bash

ver := flag.Bool("v", false, "verify version")
flag.Parse()

if *ver {
        fmt.Println(os.Getenv("VERSION"))
        return
}
相關文章
相關標籤/搜索