|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
概要9 h! u5 D$ t' K, Q
实施步骤
1 J7 E' c0 u# ]* a- 获取 git revision
- 前端 git revision 注入
- 后端 git revision 注入7 R' D( B* o- k: C* I
; Q- s! t, r' a3 f! r0 f
概要4 J+ O* Q o4 f: U! y) Y' b; F
docker 发布应用时, 将 git revision 注入到应用中, 在问题出现时, 可以迅速定位代码版本.
! [3 n1 g5 Z$ G0 Q: q
! J( t9 Z% J5 o/ Q$ w; |" v实施步骤8 q" M3 [1 O2 R6 R$ I3 w6 _+ l0 o( l$ C
- 获取 git revision
- 将 git revision 传入具体的应用中
; R& s+ \# a T* E" Y1 e( W 前端的 revision 通过 yarn build 传入
% \5 z. n6 Z I: l( C2 f/ Q* F; N 后端的 revision 通过 环境变量传入& x- |+ g0 |' n" Y Y7 X- b4 S8 f
2 {6 F x+ V& u( G2 J/ A
获取 git revision
) H: C1 i1 ?7 [8 D- 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 o' e. R+ H; O) q, f) V S
, L8 E7 f3 ?+ h. j3 G/ m
上面的代码是获取最新的 git revision 的前 8 位, 如果最新的 git revision 有 tag, 则使用 tag 获取的 git revision 放在 GIT_COMMIT 中.
$ @& c3 d# M! [$ r4 d
$ b+ ]; x* @6 F+ z C6 s前端 git revision 注入
4 U; O5 d# N" S6 F4 p首先是 docker build 命令中传入 git revision
7 l/ z5 Q) i7 m& V8 H' @9 u9 Z$ c6 b. R2 d/ n$ w( Y! E8 j5 }
docker build -t xxx.latest --build-arg VERSION=${GIT_COMMIT} . 2 E' z- S$ f' t# n% I3 g5 L" L
+ J1 i6 I% u$ q+ r+ S
然后在 docker file 中获取 VERSION, 并将其传给 yarn build 命令4 \* a* U$ x" k! J6 _
( P& p8 C8 G% b1 N; x/ w# m4 g9 X5 [ARG VERSION=no-version # 默认值 no-version1 T4 ~; t U$ s1 y. x1 |
RUN yarn
3 {$ N& f* q _3 Q! @RUN yarn build --VERSION=${VERSION}
4 K# K7 R+ o9 C- d0 A; x& g c& W; e. \6 p, P0 ^2 D
最后是前端工程中获取此变量, 并在页面的 footer 处显示 git revision d8 I( o. i# |* k. L) G3 j' k
7 g, X2 n* D. L4 c( I% { process.argv
. K$ [' n* ?7 M7 R! P) w/ h .filter(str => /^--/.test(str))
1 q, S# P3 U6 X& \ I+ z+ X+ [ .map(str => str.replace('--', ''))
& V0 W( f8 r+ M! _ .forEach(str => {* R; n" f+ S0 B K( N8 h! y- W
let sub = str.match(/([\s\S]*)\=([\s\S]*)/)
* P: U* O" L, `1 H* E) v6 A3 b6 H$ p. z8 h/ z; ~
sub ? (TYPE[sub[1]] = sub[2]) : (TYPE[str] = true)9 b' r. L9 w8 R6 t
})8 h# H- E. E2 H4 j: V1 Z
5 `' b; l' O; w; ^' Q7 o* n5 [const mergeWebpackConfig = () => (config, env) => {
; K/ r6 a: T0 j- L: p8 u // ...省略...8 G& T; m- p. l1 q6 a
" {- K/ n2 {3 m. { config.plugins = (config.plugins || []).concat([
, ]. I8 c* q+ S) b2 w+ b new webpack.DefinePlugin({
. P9 `- }( P b O: A 'process.env.VERSION': JSON.stringify(TYPE['VERSION'])+ ^; f7 U2 M! J: t3 j' p
})
( O: u. D) N8 l" g ])
0 X9 W; u: t" T; m5 C- k // ...省略...: I4 R3 m) d: L# l" h. Y
} F- r1 m/ E) f# m
<Footer>
9 b- r( w4 u, F* r3 Z) I* E- T4 ] <div) d8 y" t& j6 T! l, }4 Q
style={{ textAlign: 'center' }}
3 B; V; ~8 G3 T5 r; ?: t& Z3 Z className="gx-layout-footer-content"
. b+ d6 G+ j' z7 U9 Y >( b4 {/ v) D* G* _5 w7 _
Copyright © 2019 {process.env.VERSION}0 }, _' |5 |1 j; F
</div>
, A( _* F; _& r</Footer>
* v( ^* d) e' u3 h6 v% o. [& }7 J$ m- D3 _& y
& I i8 j6 d. N9 z [8 w- |0 i后端 git revision 注入" x' Z4 l3 e C
+ q. C3 C* \. |& h& @5 {
本文的例子是基于 golang 的 API 后端, 获取 git revision 的方法和上面类似.2 H& q& @7 k( G! T2 b M. \8 i
, A! ]% ?) W! @' f4 L/ L: k
获取 git revision 之后, 在 docker file 中获取 VERSION, 并设置环境变量 VERSION6 p6 d: E0 |1 r& c+ w: v- G$ l
9 |: o2 j9 t: ~5 \& k) W4 F# A
ARG VERSION=no-version! R$ G* j) {$ a) P- V
ENV VERSION=${VERSION}
7 a* ?& `; O( r7 l
" {2 j8 z9 Q1 A! f7 LAPI 服务添加 -v 参数, 用来显示服务的版本& K4 I& e3 e! m! q" l3 o* I5 H
" q" B1 l+ W; }5 W! ?2 q" a
ver := flag.Bool("v", false, "verify version")& \2 x7 `3 E x3 I
flag.Parse() q& t3 F7 y1 U3 G! P
; l+ j5 ]2 O3 t
if *ver {3 f- ^1 a0 G1 a8 }4 k
fmt.Println(os.Getenv("VERSION"))
3 {% M2 E( F2 r' v1 e" L return
" f* h* M: G7 e/ _- c}
& O" w' X) Y" }* f" Z9 B* T! ?5 m& C
/ }. P/ C: c2 ~# z8 D# Y6 L ?( l; X |
|