上一篇介绍了Artifactory Composer仓库的使用,演示了如何通过Composer客户端与Artifactory交互获取依赖,以及在Jenkins中打包完成持续集成的过程。
如何优化提升
完成一个基本的应用场景还不够,因为我们还关心如下内容:
- 该制品的依赖信息
- 该制品的发布过程信息
- 该制品的构建、测试情况
- 该制品的构建环境参数列表
- 构建从开发状态到上线状态的升级
- 如何通过质量关卡(测试结果等)筛选制品进行部署
这篇将介绍如何通过Artifactory管理制品的依赖信息,如何在Artifactory管理发布任务和历史,如何通过元数据记录构建、测试情况,如果管理构建环境参数列表,如何管理发布状态的升级,以及如何在部署中使用质量关卡。如果上述问题您已经有清晰的答案,那么这篇文章可能并不适合您,可以选择绕过。
特性列表
通过Artifactory Composer仓库管理PHP制品时,可直接查看到相关依赖信息,包含依赖组件名称和版本。
于此同时,还可以直接查看制品相关的构建信息,模块、ID及详情链接等。
在构建详情中,可以看到当前的发布状态,比如Develop,Test和Released等。
制品还有构建和测试相关的元数据,可以包含版本、描述和测试结果等。
通常上线部署还关注制品列表、JDK、字符集等一系列相关参数列表。
发布升级
从开发状态到发布状态的升级通过如下方式:
def promotionConfig = [
// Mandatory parameters
'buildName' : buildInfo.name,
'buildNumber' : buildInfo.number,
'targetRepo' : 'php-prd-local',
// Optional parameters
'comment' : 'this is the promotion comment',
'sourceRepo' : 'php-dev-local',
'status' : 'Released',
'includeDependencies': true,
'copy' : true,
// 'failFast' is true by default.
// Set it to false, if you don't want the promotion to abort upon receiving the first error.
'failFast' : true
]
// Promote build
server.promote promotionConfig
制品上传不再使用REST API,而是使用DSL方式:
def uploadSpec = """{
"files": [
{
"pattern": "../php-demo-${BUILD_ID}.tar.gz",
"target": "php-dev-local/${BUILD_ID}/php-demo-${BUILD_ID}.tar.gz",
"props": "version=v0.1.0;desc=app demo"
}
]
}"""
buildInfo = server.upload spec: uploadSpec
buildInfo.env.collect()
server.publishBuildInfo buildInfo
在部署之前,我们采用质量关卡进行匹配下载:
def downloadSpec = '''{
"files": [{
"aql": {
"items.find": {
"repo": {"$eq": "php-prd-local"},
"name": {"$match": "php-demo-${BUILD_ID}.tar.gz"},
"@test": {"$eq": "done"},
"@version": {"$eq": "v0.1.0"}
}
},
"target": "php-demo-${BUILD_ID}.tar.gz"
}]
}'''
server.download(downloadSpec)
测试结果以元数据形式,与Artifactory制品进行绑定,具体方式是通过REST API的形式实现。
stage('Test') {
sleep 3
echo 'Test finished...'
test = true
}
stage('Bind') {
if (test) {
sleep 3
sh 'curl -X PUT http://demo.jfrogchina.com/artifactory/api/storage/php-prd-local/${BUILD_ID}/php-demo-${BUILD_ID}.tar.gz?properties=test=done -uadmin:AKCp5bBXY7TmCE3s13XrGRM3ejcCGfiNgmtAFbaR8yNNLuZW3f7vFhzbv9NxBLP1AWxJr9Zj2'
} else {
echo 'Test NOT finished yet, stop here.'
error("Pipeline failed because of this and that..")
}
}
源码参考
整个CI&CD过程非常简单,源码如下:
node {
def server
def buildInfo
def test
stage('Init') {
server = Artifactory.server 'arti-demo'
buildInfo = Artifactory.newBuildInfo()
buildInfo.env.capture = true
}
stage('SCM') {
git([url: 'https://gitlab.com/php-demo.git', branch: 'master', credentialsId: 'jenkins-gitlab'])
}
stage('Dependency') {
sh 'cd ${WORKSPACE} && php /usr/local/bin/composer install'
}
stage('Package') {
sh 'cd ../ && tar -zcvf php-demo-${BUILD_ID}.tar.gz php-pipeline-demo'
}
stage('Upload') {
def uploadSpec = """{
"files": [
{
"pattern": "../php-demo-${BUILD_ID}.tar.gz",
"target": "php-dev-local/${BUILD_ID}/php-demo-${BUILD_ID}.tar.gz",
"props": "version=v0.1.0;desc=app demo"
}
]
}"""
buildInfo = server.upload spec: uploadSpec
buildInfo.env.collect()
server.publishBuildInfo buildInfo
}
stage('Test') {
sleep 3
echo 'Test finished...'
test = true
}
stage('Bind') {
if (test) {
sleep 3
sh 'curl -X PUT http://[ARTI-HOST]/artifactory/api/storage/php-prd-local/${BUILD_ID}/php-demo-${BUILD_ID}.tar.gz?properties=test=done -uadmin:[API-KEY]'
} else {
echo 'Test NOT finished yet, stop here.'
error("Pipeline failed because of this and that..")
}
}
stage('Promote') {
def promotionConfig = [
// Mandatory parameters
'buildName' : buildInfo.name,
'buildNumber' : buildInfo.number,
'targetRepo' : 'php-prd-local',
// Optional parameters
'comment' : 'this is the promotion comment',
'sourceRepo' : 'php-dev-local',
'status' : 'Released',
'includeDependencies': true,
'copy' : true,
// 'failFast' is true by default.
// Set it to false, if you don't want the promotion to abort upon receiving the first error.
'failFast' : true
]
// Promote build
server.promote promotionConfig
}
stage('Clean') {
sh 'rm -f /root/.jenkins/workspace/php-demo-${BUILD_ID}.tar.gz'
}
stage('Deploy') {
def downloadSpec = '''{
"files": [{
"aql": {
"items.find": {
"repo": {"$eq": "php-prd-local"},
"name": {"$match": "php-demo-${BUILD_ID}.tar.gz"},
"@test": {"$eq": "done"},
"@version": {"$eq": "v0.1.0"}
}
},
"target": "php-demo-${BUILD_ID}.tar.gz"
}]
}'''
server.download(downloadSpec)
sleep 3
echo 'Deploy finished...'
}
}
总结
PHP在交付过程中,我们可以充分发挥Artifactory和Jenkins的能力,记录交付过程信息、元数据、发布升级、质量关卡等等,这里介绍的方式可供大家借鉴参考,期望有所帮助。