概要

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 中.

前端 git revision 注入

首先是 docker build 命令中传入 git revision

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

然后在 docker file 中获取 VERSION, 并将其传给 yarn build 命令

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

最后是前端工程中获取此变量, 并在页面的 footer 处显示 git revision

     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 的方法和上面类似.

获取 git revision 之后, 在 docker file 中获取 VERSION, 并设置环境变量 VERSION

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

API 服务添加 -v 参数, 用来显示服务的版本

ver := flag.Bool("v", false, "verify version")
flag.Parse() if *ver {
fmt.Println(os.Getenv("VERSION"))
return
}

docker 发布应用时添加 git revision的更多相关文章

  1. goalng 发布的版本中自动加上 git revision

    概述 起因是这样的,在编译发布 golang 工程时,希望版本号中包含有 git revision number. 但是,没有commit之前,是没法知道 revision number 的,comm ...

  2. Jenkins+Harbor+Docker发布

    使用Jenkins发布Docke 需要准备的,docker,jenkins,Harbor docker安装 安装依赖: # yum install -y yum-utils device-mapper ...

  3. docker 发布方式尝试

    docker 发布方式尝试 目前有个小项目, 尝试用docker的方式来发布, 项目只有一个节点, 使用 kubenate 有点小题大做, 所以采用docker-compose来发布. 发布过程 GI ...

  4. asp.net core项目发布网站时的选项

    发布网站时的选项 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序. Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的, ...

  5. ARCGIS Server 发布服务时出现的问题解决

    target='CFH.ConfigurationFactoryHost'  machine='IBM3850X5'  thread='24072'  elapsed='0.31200'>Ser ...

  6. dedecms发布文章时多个Tag间分割逗号自动变成英文逗号

    dedecms发布文章时经常会添加多个Tag,我们输入汉字时总是喜欢使用全角的逗号,那么有没有办法使用JS脚本把输入的Tag间中文逗号变成英文逗号呢? dedecms发布文章时多个Tag间分割逗号自动 ...

  7. VS2010 发布网站时如何使DLL文件名固定

    VS在发布网站时,bin目录里为所有cs生成的dll文件每次都是随机命名的,如:App_Web_xxxxxxxx.dll(xxxxxxx是8个小写的字母和数字组成的字符串,随机的),这样对更新 Liv ...

  8. 当git上文件大小写重命名的修改时(git大小写敏感/默认不敏感),如何提交

    git默认是大小写不敏感!!! 加了感叹号是什么意思呢,意思就是这本身就是一个坑,本人使用的IDE是idea(网上说Eclipse可以避开问题),这个IDE本身就集成了git,但是如果要在termin ...

  9. Docker 发布 Abp net core web 服务

    Docker 发布 Abp net core web 服务 准备工作:Abp 项目,这个是模板下载地址 https://aspnetboilerplate.com/Templates (本例使用的是S ...

随机推荐

  1. VMware+windbg时快照功能的使用

    VMware+windbg时快照功能的使用 一.快照功能的使用 我们在编写与调试驱动文件时经常会面临死机蓝屏情况,如果像平常一样重启,再重新配置环境,肯定会占用大量时间. Vmware虚拟机给我们提供 ...

  2. linq,skip(),take实现分页

    using (AdventureWorks2012Entities db = new AdventureWorks2012Entities()) { int num = (from stu in db ...

  3. python 提取整个 HTML 节点

    有的时候,需要把整个 HTML 节点原封不动地取下来,也就是包括节点标签.节点内容,甚至也包括内容中的空格.各种特殊符号等等. 假设已获取到页面源码,并将其保存在变量 src 中.则可有代码如下: f ...

  4. laravel npm run dev 错误 npm run dev error [npm ERR! code ELIFECYCLE]

    出现此问题是node_modules出现错误,需要执行: 1 rm -rf node_modules 2 rm package-lock.json 3 npm cache clear --force ...

  5. Python TK编程第一部分 Hello Again

    当你想写大一点的程序的时候,将你的代码封装到一个或者多个类里会是一个不错的办法.下面'hello world'这个例子来自Matt Conway的Tkinter Life Preserver. fro ...

  6. 3-Consul 使用手册

    原文:http://www.liangxiansen.cn/2017/04/06/consul/ Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键 ...

  7. 前端开发HTML5——基础标签

    什么是HTML? HTML是HyperText Markup Language(超文本标记语言)的简写,他不是一种编程语言,而是一种标记语言,用于告诉浏览器如何构造你的页面.“超文本”就是指页面可以包 ...

  8. null,undefined.'',false关系

    null == undefined //truefalse =='' //true boolean类型跟其它类型==时,会转换成Number类型 Number类型跟String类型==时,string ...

  9. maven 学习---定制库到Maven本地资源库

    这里有2个案例,需要手动发出Maven命令包括一个 jar 到 Maven 的本地资源库. 要使用的 jar 不存在于 Maven 的中心储存库中. 您创建了一个自定义的 jar ,而另一个 Mave ...

  10. 用SignApk.jar对APK进行签名

    对apk签名需要使用SignApk.jar和签名文件.可以使用Android源码获取,若没有源码,可以在这下载:SignApk.jar.(包含了SignApk.jar和签名文件和批处理文件) 1 Si ...