如何在删除 Gitlab 上的特定分支时自动删除 JFrog 中的工件?

How to delete artifacts automatically in JFrog while deleting specific branch on Gitlab?

我需要将 JFrog 与 Gitlab 集成。我的主要目标是在删除特定分支后自动删除 JFrog 中的所有工件。我读过 webhooks,但我不确定如何有效地使用它们。此类问题的最佳解决方案是什么?

您可以使用 JFrog CLI:

删除 Artifactory 工件
jfrog rt del --quiet --recursive "my-repo/path/to/branch/artifacts"

在 GitLab 中删除分支时有几种方法可以触发此命令:

  1. 当您 stop a GitLab environment
  2. 时触发 on_stop_action
  3. 在删除分支时配置 GitLab webhook

GitLab 停止环境

  • 您创建的每个分支都将分配一个唯一的 GitLab 环境。
  • 删除分支后,相应的GitLab环境会自动停止
  • 这将触发 on_stop_action,进而触发管道作业以调用 JFrog CLI。
  • 您也可以在 GitLab web UI 或使用 GitLab API 中手动停止环境。如果您不想在这些情况下删除工件,请将 rules 添加到停止作业。
  • 有关详细信息,请参阅 Stop an environment when a branch is deleted

gitlab-ci.yml 作业看起来像这样(假设 JFrog CLI 已经安装在你的 GitLab runner 镜像中):

deploy_artifacts:
  stage: deploy
  script:
    - echo "Deploy artifacts to JFrog Artifactory"
  environment:
    name: project/$CI_COMMIT_REF_SLUG
    url: <optionally enter artifact URL here>
    on_stop: delete_artifacts
  rules:
    - if: $CI_MERGE_REQUEST_ID

delete_artifacts:
  stage: deploy
  script:
    - jfrog rt del --quiet --recursive "my-repo/path/to/branch/artifacts"
  environment:
    name: project/$CI_COMMIT_REF_SLUG
    action: stop
  rules:
    - if: $CI_MERGE_REQUEST_ID
      when: manual

If you can’t use pipelines for merge requests, set the GIT_STRATEGY to none in the delete_artifacts job. Then the runner doesn’t try to check out the code after the branch is deleted.

GitLab 网络钩子

  • GitLab 可以在某些事件发生时使用 POST 请求调用 webhook URL
  • 要在删除分支时触发 GitLab webhook 事件,请使用 basic push event
  • 推送事件POST请求中的某些字段对于删除分支是唯一的。有关详细信息,请参阅此 GitLab issue
  • 您需要设置一个 webhook receiver 来处理 webhook POST 请求

如果您之前没有设置自定义 webhook,它可能会有点复杂。在那种情况下,我建议改用 GitLab 环境。