Artifactory PHP Composer仓库应用实践-续

上一篇介绍了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的能力,记录交付过程信息、元数据、发布升级、质量关卡等等,这里介绍的方式可供大家借鉴参考,期望有所帮助。

猜你喜欢

转载自blog.csdn.net/afandaafandaafanda/article/details/82528546