微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无人机 CI 运行中的共享存储/缓存

如何解决无人机 CI 运行中的共享存储/缓存

我正在尝试根据 OpenAPI 规范动态生成客户端库,作为我的 Drone CI/CD 管道中的构建工件,并将其发布到 Artifactory 注册表。出于多种原因,这必须发生在包含 API 规范的服务存储库中 - 例如,我无法将它弹出到另一个“侦听”API 规范更改的存储库中。

我可以成功生成客户端和所有爵士乐,但我遇到的问题是: 我的 CI 管道将在每次合并到 master 时生成并发布客户端的“新”版本。

这是次优的,因为服务 API 可能没有真正改变。

我执行发布的构建步骤指定如下:

  - name: publish-ts-library
    image: node
    environment:
      ARTIFACTORY_USERNAME:
        from_secret: ARTIFACTORY_USERNAME
      ARTIFACTORY_PASSWORD:
        from_secret: ARTIFACTORY_PASSWORD
      RC_RELEASE: false
    commands:
      - bash ./publish-ts-library.sh
    depends_on:
      - build-read-gateway-ts-client
    when:
      branch: master
      event:
        exclude:
        - pull_request

执行的shell脚本为:

#!/usr/bin/env bash

touch .npmrc
curl -u$ARTIFACTORY_USERNAME:$ARTIFACTORY_PASSWORD https://mycompany.jfrog.io/mycompany/api/npm/auth > .npmrc
echo "registry=https://mycompany.jfrog.io/mycompany/api/npm/npm" >> .npmrc
if [ $RC_RELEASE ]
then
    sed -i '/version/s/[^.]*$/'"0-dev${DRONE_BUILD_NUMBER}\",/" package.json
else
    sed -i '/version/s/[^.]*$/'"0.${DRONE_BUILD_NUMBER}\",/" package.json
fi
npm publish

我知道这很恶心,抱歉。

发生的事情非常简单:我们从 Drone 中的秘密中获取一些身份验证凭据,并将它们弹出到 .npmrc 文件中。然后,如果它是 RC 版本,我们将 dev 添加到版本中,否则我们只需将版本添加到无人机内部版本号。

因此,我最初的想法是获取用于生成库的 OpenAPI 规范 yaml 文件sha1sum,并将其与“最后”生成的客户端的 sha 进行比较 - 如果匹配则不-op 而不是 npm publish,但问题是我不知道我可以在哪里存储这个 SHA,以及如何配置无人机来访问这个存储。

我知道 http://plugins.drone.io/drillster/drone-volume-cache/ 之类的插件 - 但它们显然是短暂的,我需要确保这个 SHA 将在构建中持续存在,并且不会因为缓存被清除而突然“消失”,从而强制重新发布 + 碰撞其他相同的生成客户端。

有什么想法吗?

解决方法

我不熟悉无人机 ci,所以我在这里做一些假设:

  • gitawkwc 在执行脚本的上下文中可用。

如果确定工作流将始终基于 git merge,则可以使用合并提交和合并的第一个父提交哈希之间的差异来确定是否对相关的更改进行了更改文件。

#!/usr/bin/env bash

# Returns the commit sha of the first parent (merge target) of the last git merge
getMergeCommitBase () {
    git rev-parse HEAD | \
    git rev-list --parents --min-parents=2 -n1 --stdin | \
    awk '{print $2}'
}

exitIfTheseFilesHaveNotChanged () {
    local count
    count="$(git diff "$(getMergeCommitBase)" "$@" | wc -l | awk '{print $1}')"
    if [ "$count" == "0" ]
    then
        echo "no version changes detected"
        exit 1
    else
        echo "changes detected - publishing new version"
    fi
}

# If any of these files have changed,we want to publish a new version
exitIfTheseFilesHaveNotChanged path/to/file.json path/to/directory/

# the rest is your original script

touch .npmrc
curl -u$ARTIFACTORY_USERNAME:$ARTIFACTORY_PASSWORD https://mycompany.jfrog.io/mycompany/api/npm/auth > .npmrc
echo "registry=https://mycompany.jfrog.io/mycompany/api/npm/npm" >> .npmrc
if [ $RC_RELEASE ]
then
    sed -i '/version/s/[^.]*$/'"0-dev${DRONE_BUILD_NUMBER}\",/" package.json
else
    sed -i '/version/s/[^.]*$/'"0.${DRONE_BUILD_NUMBER}\",/" package.json
fi
npm publish

希望这个想法有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。