|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
概要
2 W" _6 a8 K& h7 f: e' M. l实施步骤( X% J7 O* V2 y- }: ^1 i1 y5 H
- 获取 git revision
- 前端 git revision 注入
- 后端 git revision 注入
$ G/ Q# p/ n }/ F( C9 e- O9 Z
$ I5 K- [' F8 z1 |概要
8 {+ A7 a' ]* g6 l5 g2 G' cdocker 发布应用时, 将 git revision 注入到应用中, 在问题出现时, 可以迅速定位代码版本., [: z4 d2 n& e7 V9 V6 Q b
( y$ |' Y. u3 V4 P8 D' f实施步骤. Z: s0 \; m* m3 _3 h
- 获取 git revision
- 将 git revision 传入具体的应用中# _" L5 K4 `+ A
前端的 revision 通过 yarn build 传入
' ?7 j+ [& c* Y5 I9 T- q& Y 后端的 revision 通过 环境变量传入6 Q' T; d, u, i9 z. [5 ~
5 {+ U l4 c$ r
获取 git revision, F8 ~* ? V. w; T( p6 P& u* R8 t
- 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/ f/ d3 }) U6 {) ^4 E% w+ I
; i& G& I# x& G: ]1 Z$ Q9 q- l4 m
上面的代码是获取最新的 git revision 的前 8 位, 如果最新的 git revision 有 tag, 则使用 tag 获取的 git revision 放在 GIT_COMMIT 中.
! T5 |2 U( n( I7 |
6 |) ^% s6 o) W/ u前端 git revision 注入, M1 U4 ~* F% a4 R/ ]
首先是 docker build 命令中传入 git revision
0 L' f7 C( \; |& }9 W4 b+ E# _) W( w5 c- {! N: ] P- d
docker build -t xxx.latest --build-arg VERSION=${GIT_COMMIT} . f8 S8 j4 [/ o$ q: j
* p" B( a6 s" t& K% Q然后在 docker file 中获取 VERSION, 并将其传给 yarn build 命令- e- e7 {0 x5 v; L( c
0 [- c% L/ e: [0 ?3 ?ARG VERSION=no-version # 默认值 no-version
, y9 |* T; j; j& [4 D1 v0 @( SRUN yarn
, E# [) Y: W" }6 @4 K1 qRUN yarn build --VERSION=${VERSION}+ w g1 A% D1 G$ l
: ]7 ^& i9 m, |' |! f: v6 v- ]
最后是前端工程中获取此变量, 并在页面的 footer 处显示 git revision
' `* }! \% [" d5 q! ] r: q6 ]$ j$ i# G- W l/ T* @1 `* e
process.argv7 U2 W: a1 S! m G0 y" p
.filter(str => /^--/.test(str))
' x$ e( r9 I$ G' M! @4 |* v .map(str => str.replace('--', ''))
2 o5 e% a% a+ j' g .forEach(str => {
7 u9 @1 V! L( f! j. z* E let sub = str.match(/([\s\S]*)\=([\s\S]*)/)
7 f( }- G9 L5 P7 I" n! D6 h% A- R# H) P& ]& b& v
sub ? (TYPE[sub[1]] = sub[2]) : (TYPE[str] = true) l) W& E( d9 R! q% s! K7 S
})
, B+ _, U5 u* E& U; M0 A8 N. q2 n8 W) v, [. ?6 m! t
const mergeWebpackConfig = () => (config, env) => {: a ]* `7 t" t5 }3 M, Q; E) f5 l
// ...省略...
: F- L# Y- T7 A% t2 }6 e j8 J" I+ J$ |4 U( c7 e8 C
config.plugins = (config.plugins || []).concat([; H( o7 x2 u9 S3 e: V
new webpack.DefinePlugin({: l1 `: F! t8 H9 L- s
'process.env.VERSION': JSON.stringify(TYPE['VERSION'])* t5 V4 J6 P: D! _- w
})0 N! D! w/ V9 M7 l. I2 S" h
])
: t0 Z) r o2 {& O // ...省略...1 j4 w0 {' M- v7 j. K4 C
}+ [+ h7 N. N+ k; K, E5 ?
<Footer>0 P" W* L: O# ~
<div
9 }; V2 X2 [3 W9 e9 h style={{ textAlign: 'center' }}3 m2 `- Q# y) Y: o. H; _$ o
className="gx-layout-footer-content"0 g; H8 J+ h0 b! h4 @8 {& f8 I
>
' a5 E" N/ L' E, L- [# F4 d% p2 m) Q Copyright © 2019 {process.env.VERSION}+ H3 O f$ }, `3 @6 M
</div>
( A' z9 k' ]- x- Z2 `</Footer>* ~5 W0 B: k; ~8 D8 S
7 ~, U: K' n% O- N8 q7 k
7 z6 U8 K" B1 l后端 git revision 注入 D* H t8 g' _: Y+ r) l
* b+ F9 W2 a( D5 T% b0 T6 Y: S本文的例子是基于 golang 的 API 后端, 获取 git revision 的方法和上面类似.
" V, h$ Y9 \* j) T m' Q, [$ ]: s1 e6 B- m
获取 git revision 之后, 在 docker file 中获取 VERSION, 并设置环境变量 VERSION
! U4 j# {+ E$ ~9 ~1 i) G$ p; f: r8 f: D- B& @: o5 a6 q6 ~( H3 U9 X
ARG VERSION=no-version
3 s: l9 j6 H) A8 z6 Q! E- j2 Y- ?ENV VERSION=${VERSION} * e) _ f/ q7 H4 ]2 S5 U
! Q$ Q9 i$ S/ d( kAPI 服务添加 -v 参数, 用来显示服务的版本9 D5 \; D& _, I" D' A; g6 B
- c# D* q5 v% F6 {9 M
ver := flag.Bool("v", false, "verify version")& ?0 r7 V7 o' P) j& z
flag.Parse(); D8 ^5 W+ Z$ i
! s+ V- j0 e' {4 ?! k9 h
if *ver {) G6 l( H0 d; [% P
fmt.Println(os.Getenv("VERSION"))
& U4 ^9 k+ I6 \1 ] return
" k* x- b& e& `& w @' `: Z}5 r5 y0 O I7 x1 T& c. y
. \( l" O% w$ i% i5 d4 a" \% |
3 {3 G, v& I# h& Q |
|