背景 : m: M( X; l( D* G$ F8 G L1 D
8 }9 ^+ R2 W* q5 x9 P1 h, f4 Z
6 F% E8 j, a$ _' Z
" T5 y+ d |3 n# ]) J; P
. c- r- z- R* M* i作为 ITILxf.com" target="_blank" class="relatedlink">DevOps交付流水线的开发者,为支持CI/CD中各项任务的自动化,都需要依赖多种包管理工具来下载各种相关的工具,比如针对产生最终交付件的构建过程,就需要在构建流程的第一步,自动地把相关工具,如Curl、wget、Maven、Gradle、npm等等,下载到CI服务器。这些工具的下载,通常都需要依靠对应的公网服务器和包管理工具来支持。而这样通过公网来下载工具,有时会遇到稳定性的问题,也就是所谓的环境问题,导致工具下载失败,进而导致构建任务的失败。因此,我们需要引入新的技术来克服这些问题,保证工具包下载的稳定和可靠。 `5 W9 O! X8 ?
7 c! z3 t: F% E
3 S9 ^5 ^. Y" F
" f6 O v* Q5 c; r- z
9 R+ x2 ]0 r* g9 D工具包管理的痛点 ——缺乏稳定性
) h6 y7 v) H' v7 z2 f# P+ t* ]7 B [$ h
8 ]( W/ k, H( E: m% U" M5 f
& v. p1 `& j U7 p0 O* }通常,我们会使用各种各样的包管理工具来帮助我们下载和管理这些工具包,如Windows上的Chocolatey,Mac/Linux上的Homebrew,还有npm、Yum、Debian、Docker等等。可是,有时我们通过这些包管理工具来下载工具包时,会碰到意外的5xx服务器错误。而更多的时候,通过这些包管理工具来下载会非常的慢。这些问题在我们使用自动化构建工具(如Travis CI、Jenkins、Gitlab CI,等等)来实现持续集成CI的时候,会被成百上千倍地放大。一种解决办法就是在碰到这些环境问题时,通过手动运行构建的方式进行补救,当然,这只是指标不治本。同时,在网络访问有限制的时候,如很多金融企业都会采用的网络隔离,根本不可能去下载这些公网服务器上的工具包。 ! R/ s3 r9 B; `, l a" Z* ~# P
- w0 L% q- o0 d) [; M2 D
9 x7 x2 f! H3 `! n0 X% Z/ X$ P$ y/ y6 g5 t( g
# p/ }/ |4 a2 R4 V3 N' X; p解决方案 ——使用JFrog Artifactory的远程仓库 ( [2 B/ l Q, v3 t. b
4 ^; P v# A" D( J7 a5 Y
+ ^3 j* u1 a: P) G
5 y; q: ~' L! B2 ]2 {# {$ Y. ?
JFrog Artifactory作为全语言制品仓库,其远程仓库可以作为公网服务器的本地代理和缓存。当我们通过其远程仓库来下载所需的工具包时,Artifactory首先检查在本地的缓存中是否已经存在。如果有,直接返回该工具包;如果没有,Artifactory将会代理到公网服务器去下载相应的工具包,并缓存到本地,以供后续的下载使用。 利用Artifactory的远程仓库作为下载前述工具包的代理和缓存,能够使得DevOps流程中的各个环节,如前面描述的持续集成流程,更加的迅速和稳定。在有网络隔离要求的环境中,如金融企业的研发/生产环境,Artifactory可以帮助技术人员建立自己的企业级单一可信源。 下面,我们将通过示例为大家一一展示,Artifactory的远程仓库是如何为不同种类的工具包提供服务的。
! }; k" ~/ O( H* @- z& G7 o8 W; ^: g1 u; l: A$ t6 \& G3 @+ C/ G
$ T& V, |: m* r2 D9 H& m* N# x8 V# `; y5 p( J' j" [7 p/ D! v
; G6 a# V9 I& J, a3 R2 o$ r% C; g X, {
示例一 ——Chocolatey ) J: f4 o, M+ U# o
- N' P) r; a/ U3 V
+ T/ M$ h8 j/ g# W1 J
' C, g$ ]; E/ N当使用Choco为Windows系统下载Gradle的时候,我们经常会碰到类似下面这样的503错误,从而导致构建失败:
# X& r, E9 V* b( ~5 o
解决的方法:我们在Artifactory里定义一个Nuget类型的远程仓库,利用它作为通过Choco包管理工具下载的来源。
/ `2 [7 I/ g' r
5 k1 s; A1 a2 ~! `' R0 x" A第一步:配置Artifactory远程仓库 在Artifactory里创建一个Nuget类型的远程仓库,其主要参数如下: Q( n2 c8 B4 T1 p+ r S: }
第二步:安装Choco包 choco install <package-name> -s <artifactory-url>/api/nuget/choco , m* [5 s5 v2 q& c
使用带用户认证的方式
) I* M) z) @" C1 W. `. [6 W A
choco install <package-name> -s <artifactory-url>/api/nuget/choco -u <artifactory-user> -p <artifactory-password> ! T; n5 e: j3 i7 H) V2 i
9 _" A! H( L) J
+ U- J9 v' Z8 N( [7 X7 E+ E: l9 T) Q( y+ x& B0 ^/ ^$ \
+ D+ A3 H+ Y, B" R
示例二 ——Homebrew
$ D; t6 \* x, P" n. |
w/ q0 k8 C- j4 `; P1 [5 b) A- K, c% P; ?$ A" B0 Z$ W
3 O: S) h2 C) P和Chocolatey类似,也可以用Artifactory来支持Brew的下载:
7 v) I* P7 b0 @( d- O( Q1 z第一步:配置Artifactory远程仓库 在Artifactory里创建通用(Generic)类型的远程仓库:
- X. }* l5 m6 W J第二步:设置 “HOMEBREW_ARTIFACT_DOMAIN”环境变量 setHOMEBREW_ARTIFACT_DOMAIN=<artifactory-url>/homebrew 带用户认证的访问: ' J: F' v3 N& K2 Z$ r( }
setHOMEBREW_ARTIFACT_DOMAIN=<artifactory-user>:<artifactory-password>@<artifactory-url>/homebrew
; w4 ]# o: ?# s _第三步:安装 之后再通过 brew install命令安装,就会访问Artifactory的本地缓存了。 2 a, z+ }2 C5 ^+ \& }
, R; y; O5 [; S3 I% r! C# U$ y, x$ }3 ~& u8 _9 a
( ^) A0 x1 S( q( z" A& g0 @8 q! p
) T# L" L# k1 f H* G1 |& A t
示例三 ——Yum
+ Q7 t6 H* m5 ]5 \
# S p! s% B7 ^% @' m! _4 c
5 e1 ]5 G0 \9 H5 I- |! V1 T( s/ B& }! p8 s5 S/ P$ k* W3 y& x
本节将介绍如何利用Artifactory的远程仓库来使用Yum下载RPM包。
7 e8 w7 h9 q- h" Z v' s第一步:配置Artifactory远程仓库 在Artifactory里创建一个RPM类型的远程仓库: 例如:http://mirror.centos.org/centos/7.6.1810/os/x86_64 ! H. `6 d* w6 [1 n6 d0 _4 H
第二步:创建yum的配置 创建下述文件: /etc/yum.repos.d/artifactory 匿名访问时,文件内容为: % U g+ q' S( B( _
[artifactory]HERE6 R9 |: X: J+ k
name=artifactory baseurl=https://<artifactory-url>/yum enabled=1
0 z2 S u0 h! D! F9 q7 O* S) [gpgcheck=0
]5 H* m6 r; W带用户认证时,文件内容为: 1 f0 H5 m2 F% X! S: g! m
[artifactory]5 |- t" K2 N; u5 P+ ~2 `# z% T
name=artifactory baseurl=https://<artifactory-user:<artifactory-password>@<artifactory-url>/yum enabled=1! N8 a* ^9 o: ^) ^
gpgcheck=0 之后正常使用yum命令就可以从Artifactory的本地缓存下载RPM包了。 4 D7 o) a! e! N% d
9 S" J: d) h7 R, B' P. W8 m& N5 f
" [! _0 y& V) ]7 L/ C S8 V
4 J7 o4 Y& Y) A0 p' U* o6 s+ V9 R$ @/ ~
示例四 ——Docker
$ P5 N+ U) ?4 D8 W) v+ x& V6 ]% \3 i" J& I
- }, U1 f0 U2 a6 Z& ^% l
+ J* x. \! q" [% D! G4 i3 r
本节将介绍如何利用Docker命令从Artifactory的远程仓库来下载Docker镜像。 7 L) ~- F/ s7 u1 O8 @' n9 s
第一步:配置Artifactory远程仓库 在Artifactory里创建Docker类型的远程仓库:
( P: |# j9 H4 H- w7 j- [! z% U第二步:登录 用下述命令登录Artifactory的Docker仓库: Docker login <your docker domain> 其中<your docker domain>的写法可以参考Artifactory中docker仓库对应的”Set Me Up”显示的设置。
e5 m; |( L& ^5 b0 ?2 f0 v第三步,拉取镜像 执行下述命令,从Artifactory的缓存拉取Docker镜像: docker pull <your docker domain>/<docker image>:<docker tag> 当然,针对Docker应用,你可以使用JFrog提供的免费版镜像中心——JCR(JFrog Container Registry,https://jfrog.com/container-registry/),来管理自己的Docker镜像。
9 w) j8 g7 N. h) V" q
, E) I* o, e2 _ _* Q
, m2 `4 I& B7 _+ l6 w- c a7 t- O/ l" U
?/ C0 T( `" Z2 G" c* Q) Z+ E
总结
2 h6 t; \! l; j, ~3 `0 _" g3 x* n4 d! R0 A. F2 `
$ A9 F5 c, x( X' T7 K I- E$ X
在DevOps流程当中,我们需要下载很多工具包,来支持整个流程的自动化运转。然而。直接从外网下载这些工具包,经常会碰到环境问题,进而影响整个DevOps流程的效率和可靠性。 Artifactory通过其远程仓库的设置和全语言制品支持的能力,能够帮助我们建立各种工具包的本地源,从而使得DevOps的流程更加迅速和稳定。本文还列出了几种典型类型工具包的配置方法。(高欣)
; n% O; J4 g# U' d- o8 h5 ~% B! e/ Y4 _$ X. s: U; W. T
& H1 }" d/ U( A W1 f
|