Artifactory PHP Composer仓库应用实践-续

本文深入探讨了如何利用Artifactory和Jenkins优化PHP制品的依赖管理、发布流程、构建测试元数据记录、构建环境参数管理、发布状态升级及部署前的质量关卡设置。通过具体实例展示了如何实现制品的高效管理和自动化部署。
部署运行你感兴趣的模型镜像

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

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

在 Maven 的 `settings.xml` 配置文件中,`<mirrors>` 标签用于配置镜像仓库,`<mirror>` 子标签用于定义具体的镜像信息。下面对给定的 `<mirror>` 配置进行详细解释: ```xml <mirror> <id>dg-artifact</id> <mirrorOf>*,!artifactory - maven,!artifact - plugins,!yunlong - maven - remote,!sgov - maven - remote,!artifactory,!language - dragon - maven,npm - maven</mirrorOf> <name>maven - local - group</name> <url>https://cmc.centralrepo.rnd.huawei.com/maven/</url> </mirror> ``` ### `<id>` 标签 `id` 为 `dg-artifact`,是该镜像仓库的唯一标识符。在 Maven 中,这个标识符用于区分不同的镜像仓库配置,在配置文件的其他部分引用该镜像时,需要使用这个 `id`。同时,它也可用于日志记录和调试,方便识别具体是哪个镜像仓库在起作用。 ### `<mirrorOf>` 标签 `mirrorOf` 的值为 `*,!artifactory - maven,!artifact - plugins,!yunlong - maven - remote,!sgov - maven - remote,!artifactory,!language - dragon - maven,npm - maven`,这定义了该镜像所代理的仓库范围。具体含义如下: - `*`:表示该镜像将代理所有仓库。这是一个通配符,意味着默认情况下,Maven 会尝试从这个镜像仓库下载所有依赖。 - `!`:是排除符号,后面跟着的仓库 ID 表示不使用该镜像代理的仓库。例如 `!artifactory - maven` 表示 `artifactory - maven` 这个仓库不会使用 `dg-artifact` 镜像进行下载,Maven 会直接访问该仓库本身来获取依赖。 ### `<name>` 标签 `name` 为 `maven - local - group`,是该镜像仓库的一个友好名称,主要用于在日志和配置文件中更清晰地标识该镜像仓库,方便用户理解和管理配置。 ### `<url>` 标签 `url` 为 `https://cmc.centralrepo.rnd.huawei.com/maven/`,指定了该镜像仓库的实际访问地址。当 Maven 根据 `<mirrorOf>` 的规则决定使用该镜像时,会从这个 URL 下载依赖。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值