docker 發佈應用時, 將 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
首先是 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>
本文的例子是基於 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 }