【问题标题】:How to access previous GitLab CI artifacts, process them and save file in "main" repository?如何访问以前的 GitLab CI 工件、处理它们并将文件保存在“主”存储库中?
【发布时间】:2021-03-23 19:36:11
【问题描述】:

我的应用是可视化我的软件的性能。因此,我简要描述了我在做什么以及我被困在哪里。

  1. 我的源代码在 GitLab 中
  2. 为每次提交在 CI 中编译并运行一些测试
  3. 测量测试运行所用的时间并将其保存到文件中
  4. 上传带有时间作为工件的文件

--------- 从这里开始我不知道如何实现它。

  1. 运行一些新作业,读取之前工件的所有计时文件
  2. 绘制时间,可能使用 Python 并将图像以 SVG 格式保存在“主”存储库中
  3. 在 GitLab 起始页上显示图像(README.md 应该包含它)
  4. 现在我可以看到哪些提交对我的软件性能产生了哪些影响

不知道我是否在要求不可能的事情。我希望有人可以帮助我,因为我不是 CI 专家。也许一个表达式已经足以用谷歌搜索解决方案,但我什至不知道如何制定这个。

谢谢大家:)

【问题讨论】:

    标签: gitlab gitlab-ci


    【解决方案1】:

    将图像提交到 Main

    您不能只将 SVG 图像从管道作业保存到主存储库。你需要做出承诺。这不仅会污染您的 git 历史记录并增加您的 repo,而且还可能触发一个新的管道,从而导致无限循环。

    有一些方法可以绕过无限循环,例如通过控制哪些源/分支触发管道或在提交消息前加上[skip ci],但这可能会变得复杂并且可能不值得。事实上,GitLab 不能完全按照你的意愿去做,所以你必须在某个地方做出妥协。

    从工件生成指标图

    您可以在 CSV 文件中收集来自过去管道的指标并将其保存为工件。

    将此添加到名为 add_metrics.sh 的可重用脚本中:

    #!/bin/bash
    HTTP_HEADER="PRIVATE-TOKEN: $YOUR_ACCESS_TOKEN"
    URL_START="https://gitlab.example.com/api/v4/projects/$CI_PROJECT_ID/jobs/artifacts"
    URL_END="raw/<path/to/artifact>/metrics.csv?job=$CI_JOB_NAME"
    
    COLUMN_HEADERS=Date,Time,Branch,Commit SHA,Test Time(s),Code Coverage (%)
    
    # download latest artifact
    if curl --location --header $HTTP_HEADER $URL_START/$CI_COMMIT_BRANCH/$URL_END
    then echo "Feature branch artifact downloaded."
    elif curl --location --header $HTTP_HEADER $URL_START/master/$URL_END
    then echo "Master branch artifact downloaded."
    else echo $COLUMN_HEADERS >> metrics.csv
    fi
    
    # add data sample row to CSV
    NOW_DATE=$(date +"%F")
    NOW_TIME=$(date +"%T")
    echo $NOW_DATE,$NOW_TIME,$CI_COMMIT_BRANCH,$CI_COMMIT_SHA,$TEST_TIME,$CODE_COVERAGE >> metrics.csv
    
    # keep last 50 lines
    echo "$(tail -50 metrics.csv)" > metrics.csv
    

    然后从gitlab-ci.yml 的管道中调用它:

    job_name:
      script:
        - TEST_TIME=10
        - CODE_COVERAGE=85
        - chmod +x add_metrics.sh
        - bash add_metrics.sh
      artifacts:
        paths:
          - metrics.csv
        expire_in: 1 month
    

    注意:您必须create a personal token 并将其添加到masked variable。我还将由您来填充数据指标,例如测试时间、代码覆盖率等。

    代码说明

    1. 下载当前分支的latest artifact
    2. 功能分支的第一次提交将找不到“最新”工件。如果发生这种情况,请从 master 下载最新的工件。
    3. 脚本第一次运行时,master 甚至没有“最新”工件,因此请创建一个新的 CSV 文件。
    4. 将当前样本附加到 CSV 文件的末尾。删除旧样本以保留固定数量的数据点。您可以添加日期、管道 ID 和其他指标。
    5. 存储更新的工件。
    6. 要查看图表,请从 GitLab UI 下载工件并在电子表格应用中查看。

    发布到页面

    使用 Python(pandas、matplotlib),您可以生成绘图图像并将其从您的 master 分支管道发布到 Gitlab Pages。您可以在存储库中拥有引用相同图像文件名的静态 HTML 页面,并不断替换管道中的相同图像。您还可以添加更多有用的指标,例如代码覆盖率。

    【讨论】:

    • 我需要一些时间来验证您的建议。将我当前的计时数据添加到以前的计时数据并上传工件可以正常工作。作为下一步,我将尝试通过 GitLab Pages 发布我的数据,让我们看看它是如何工作的。非常感谢您的详细回答。在示例中,if 语句的末尾缺少 fi
    • 不客气,好收获! 'tail' 命令中的文件名也是错误的,所以也修复了它。祝你好运。如果您遇到困难,请告诉我们。
    • 有一个 [skip ci] 标签可以添加到提交中,以防止循环。
    • @Fritz 好呼声。依赖提交消息约定可能容易出现人为错误,例如如果有人忘记了跳过 ci 标签。如果它是经过同行评审的脚本,那么风险可能很低。
    • @DV82XL 我认为脚本搞砸任何事情的风险非常低。我看到的唯一风险是 CI 环境的变化(例如,改变约定)。如果发生错误,您也可以通过取消任务来停止循环。但是,您的解决方案更干净,因为它不会使 git repo 和 git history 膨胀
    猜你喜欢
    • 2023-03-12
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    相关资源
    最近更新 更多