EDA365电子论坛网
标题:
docker 发布应用时添加 git revision
[打印本页]
作者:
baqiao
时间:
2020-7-13 13:56
标题:
docker 发布应用时添加 git revision
概要
- O; s: u ~+ i
实施步骤
8 j% c' h/ [" f4 A
获取 git revision
前端 git revision 注入
后端 git revision 注入
: w( y% o7 e% g
) J$ u& U2 ^1 X3 [ s) a8 }; ^8 ~
概要
& s {2 q' M0 i# B' Q
docker 发布应用时, 将 git revision 注入到应用中, 在问题出现时, 可以迅速定位代码版本.
# h2 Y- O0 b! ^, _. R
' N: ~' S0 m% A8 g7 b$ d' M; |
实施步骤
* s) T4 V- I e* C1 [
获取 git revision
将 git revision 传入具体的应用中
! z8 D9 V, v, K$ H" X5 _
前端的 revision 通过 yarn build 传入
% r. Z# |6 v0 I; d
后端的 revision 通过 环境变量传入
! t2 u: j2 e* g& w6 C
3 D3 z" |- U8 p
获取 git revision
; f5 @& e( w0 R. d j
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
2 J! e( l+ H* d, F
& r; m n* L2 r# y1 c4 B
上面的代码是获取最新的 git revision 的前 8 位, 如果最新的 git revision 有 tag, 则使用 tag 获取的 git revision 放在 GIT_COMMIT 中.
# S# c, j6 q% @ h$ B( q6 z
$ S( f! n; ]% M9 H# ^9 ^* E
前端 git revision 注入
4 U) c8 o: J( X
首先是 docker build 命令中传入 git revision
! H% ^$ a. h8 s7 ~5 ?" d
$ Y7 I6 Y+ ]/ B a( x; A% _4 R0 t' ]
docker build -t xxx.latest --build-arg VERSION=${GIT_COMMIT} .
$ X( Q9 A0 q6 J' m& E
' I( X( y7 q0 y& ~) i
然后在 docker file 中获取 VERSION, 并将其传给 yarn build 命令
* ~+ |- S7 U* j! H, f! K
+ g+ T& M; Q! X$ V) {; H; N* N
ARG VERSION=no-version # 默认值 no-version
& M8 [2 H" b0 f1 U/ ?
RUN yarn
( m: g9 F" R% G8 k: a
RUN yarn build --VERSION=${VERSION}
( B/ p- B" B5 X! X) H9 x
! z- d6 T3 t* D: x
最后是前端工程中获取此变量, 并在页面的 footer 处显示 git revision
! z8 d1 _5 @( A' E2 I& k9 R2 v
( [/ b5 u+ U: J& p" R; @
process.argv
" g* c' \( D/ A4 n5 E+ \* K
.filter(str => /^--/.test(str))
2 `$ C# M1 m; @! Y
.map(str => str.replace('--', ''))
* p$ b; W t2 V7 {# [
.forEach(str => {
+ x$ M$ D/ `* v7 a v$ n
let sub = str.match(/([\s\S]*)\=([\s\S]*)/)
, d' D+ c* v( @ P5 r9 t
1 x$ N& m" e, `: e0 A9 E% {
sub ? (TYPE[sub[1]] = sub[2]) : (TYPE[str] = true)
" s5 E) ~2 j3 \7 R! \
})
: w5 R: b8 H6 D1 J3 C3 A$ B
8 |4 h9 h/ R6 a5 z: n* l
const mergeWebpackConfig = () => (config, env) => {
" ~7 X% d# |7 Z; d8 B8 J* d1 E0 n
// ...省略...
/ i8 a* Z+ _; ~+ Y2 k* r- n/ j
7 \' Q0 q" v, j3 L7 f; T' k
config.plugins = (config.plugins || []).concat([
6 x2 c2 a3 K* j* C' ]' P' O' V0 `
new webpack.DefinePlugin({
! t/ O1 Q! x& n# G
'process.env.VERSION': JSON.stringify(TYPE['VERSION'])
1 f2 |% Y$ I" E1 o% e
})
5 X% S7 v2 @+ O7 E' b7 q0 v) R8 X
])
/ i( { F5 ~3 W' D' B2 R+ |. ?7 ^
// ...省略...
`% N9 w8 i# f( L( x$ z2 W; @* G
}
$ f; M/ o) P' k b; P, G/ X
<Footer>
0 Y( k& d* _% L O' L1 m
<div
3 t$ Q- H, M% y5 {2 B! D
style={{ textAlign: 'center' }}
# S6 e( V. B8 E) R% \3 p8 P0 @
className="gx-layout-footer-content"
9 }: \0 [; e, z& L1 f3 C. \
>
2 H9 A0 H8 {9 Q0 u4 W$ o8 n
Copyright © 2019 {process.env.VERSION}
& f4 }6 c9 i% h$ a, ^3 |4 Z
</div>
5 q# v- }2 e- m! A
</Footer>
) U& c/ M' I A2 J5 y" J
* f% G" d4 h) F5 i! k3 G X6 ]! c- Q
! K* `% N+ m: \( \" d% n( V* @
后端 git revision 注入
/ S- d' q4 [9 ]
" l' q& z8 N, W. l) m
本文的例子是基于 golang 的 API 后端, 获取 git revision 的方法和上面类似.
3 t9 y+ P2 o$ k5 }: F
5 l1 A: A1 d& d, e) V
获取 git revision 之后, 在 docker file 中获取 VERSION, 并设置环境变量 VERSION
1 f E) }1 C8 z+ T
7 V, U* u& Z; e; L- Z
ARG VERSION=no-version
6 l; C; p( ]& J% s Z) K# U) W
ENV VERSION=${VERSION}
/ |+ o9 o1 b6 _ S
# g5 X, l' A X4 }
API 服务添加 -v 参数, 用来显示服务的版本
8 K5 r2 d; n9 I$ ^# ?4 T
/ \0 A. J+ V7 [9 w8 U
ver := flag.Bool("v", false, "verify version")
4 B2 |8 w. P' |$ V+ Z0 e
flag.Parse()
/ r" u: e+ z6 | `3 b" [: S* J
( P8 [" y* o5 T* ~* X$ M
if *ver {
0 x- A6 }. R- U6 S0 \
fmt.Println(os.Getenv("VERSION"))
: u$ |' Z- o- f" E
return
- i9 x& T$ m" T$ g4 p
}
! z5 ~& q/ {, N& z$ t/ `
& \; a7 t0 {* m. i
) j. ^ x9 j+ d2 v- E
作者:
NingW
时间:
2020-7-13 15:18
docker 发布应用时添加 git revision
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2