从GitHub Actions、Travis和Appveyor下载构建日志
项目描述
GitHub | PyPI | Anaconda | 问题 | 变更日志
tinuous 是一个命令,用于从GitHub Actions、Travis-CI.com、Appveyor和/或CircleCI下载GitHub存储库的构建日志、工件和发布资产。
请参阅 <https://github.com/con/tinuous-inception>,了解使用 tinuous 和 GitHub Actions 获取 tinuous 本身 CI 日志的示例配置。
安装
tinuous 需要 Python 3.8 或更高版本。只需使用 Python 3 的 pip 安装 tinuous 及其依赖项。
python3 -m pip install tinuous
tinuous 还可以选择性地与 DataLad 集成。要同时安装 DataLad 和 tinuous,请指定 datalad 附加组件。
python3 -m pip install "tinuous[datalad]"
tinuous 也支持 conda!安装时,请运行
conda install -c conda-forge tinuous
使用方法
tinuous [<global options>] <command> [<args> ...]
全局选项
- -c FILE, --config FILE
从指定的文件中读取配置 [默认值: tinuous.yaml]
- -E FILE, --env FILE
从指定的 .env 文件中加载环境变量。默认情况下,环境变量从当前目录向上搜索找到的第一个名为 “.env” 的文件中加载。
注意:当此文件位于 Git 仓库中时,必须小心处理,以免公开暴露:要么在 .gitignore 中列出文件,要么如果使用 DataLad 或 git-annex,则配置 git-annex 以禁止公开共享该文件。
- -l LEVEL, --log-level LEVEL
将日志级别设置为给定的值。可能的值有 “CRITICAL”,“ERROR”,“WARNING”,“INFO”,“DEBUG”(不区分大小写)及其 Python 整数等效值。[默认值: INFO]
fetch 命令
tinuous [<global options>] fetch [<options>]
tinuous fetch 读取一个配置文件,告诉它要检索哪些存储库的日志和工件,从哪里检索它们,以及保存到何处,然后执行这些步骤。
选项
- --sanitize-secrets
下载后从日志文件中清理秘密
- -S FILE, --state FILE
将程序状态(例如,已知所有资产都已检索的日期和时间戳之前的状态)存储在给定的文件中 [默认值: .tinuous.state.json]
fetch-commit 命令
tinuous [<global options>] fetch-commit [<options>] <committish>
只为给定的 committish 下载日志和构建工件。状态文件不会被更新。
此命令仅支持从 GitHub 获取资源。
选项
- --sanitize-secrets
下载后从日志文件中清理秘密
sanitize 命令
tinuous [<global options>] sanitize <path> ...
清理给定的文件,用一系列星号替换所有匹配秘密正则表达式的字符串。
配置
配置文件是一个包含以下键的 YAML 文件映射
- repo
(必需) 要检索资产的 GitHub 仓库,格式为 OWNER/NAME
- vars
一个映射,定义自定义路径模板占位符。每个键是自定义占位符的名称,不带括号,其值是要替换的字符串。自定义值可以包含标准路径模板占位符以及其他自定义占位符。
- ci
(必需) 从要检索资产的 CI 系统到包含 CI 特定配置的子映射的映射。包括给定的 CI 系统是可选的;如果在此映射中列出,则会从给定的系统获取资产。
CI 系统及其子映射如下
- github
从 GitHub Actions 检索资产时的配置。子字段
- paths
一个映射,提供要保存各种类型资产的路径的模板字符串。如果为空或不存在,则不检索任何资产。子字段
- logs
为每个工作流程运行实例化的模板字符串,用于生成保存运行构建日志的目录路径(相对于当前工作目录)。如果没有指定,则不会下载日志。
- artifacts
为每个工作流程运行实例化的模板字符串,用于生成保存运行艺术品的目录路径(相对于当前工作目录)。如果没有指定,则不会下载艺术品。
- releases
为每个(非草案、非预发布)GitHub发布实例化的模板字符串,用于生成保存发布资产的目录路径(相对于当前工作目录)。如果没有指定,则不会下载发布资产。
- workflows
要检索资产的工怿规范。这可以是包含文件扩展名的工怿基本名称列表(例如,test.yml,而不是 .github/workflows/test.yml)或包含以下字段的映射
- include
要检索资产的工作流程列表,可以是基本名称或(当 regex 为 true 时)匹配基本名称的 Python 正则表达式。如果省略 include,则默认包括所有工作流程。
- exclude
不检索资产的工作流程列表,可以是基本名称或(当 regex 为 true 时)匹配基本名称的 Python 正则表达式。如果省略 exclude,则不排除任何工作流程。匹配 include 和 exclude 的工作流程被排除。
- regex
布尔值。如果为 true(默认为 false),则 include 和 exclude 字段的元素被视为匹配(非锚定)工作流程基本名称的 Python 正则表达式;如果为 false,则用作确切名称
当未指定 workflows 时,将检索存储库中所有工作流程的资产。
- travis
从 Travis-CI.com 检索日志的配置。子字段
- paths
给出要保存各种类型资产的路径的 模板字符串 的映射。如果为空或不存在,则不检索任何资产。子字段
- logs
为每个构建中的每个任务的实例化的模板字符串,用于生成保存任务日志的文件路径(相对于当前工作目录)。如果没有指定,则不会下载日志。
- appveyor
从 Appveyor 检索日志的配置。子字段
- paths
给出要保存各种类型资产的路径的 模板字符串 的映射。如果为空或不存在,则不检索任何资产。子字段
- logs
为每个构建中的每个任务的实例化的模板字符串,用于生成保存任务日志的文件路径(相对于当前工作目录)。如果没有指定,则不会下载日志。
- accountName
(必填) Appveyor 上存储库所属的 Appveyor 账户名称
- projectSlug
Appveyor 上存储库的项目缩略名;如果没有指定,则假设缩略名与存储库名称相同
- circleci
从 CircleCI 检索资产的配置。子字段
- paths
一个映射,提供要保存各种类型资产的路径的模板字符串。如果为空或不存在,则不检索任何资产。子字段
- logs
为每个工作流程中每个作业的每个步骤的每个动作的实例化的模板字符串,用于生成保存动作构建日志的文件路径(相对于当前工作目录)。如果没有指定,则不会下载日志。
- artifacts
为每个作业实例化的模板字符串,用于生成保存作业艺术品的目录路径(相对于当前工作目录)。如果没有指定,则不会下载艺术品。
- workflows
资产检索工作流程的规范。这可以是工作流程名称的列表或包含以下字段的映射
- include
要检索资产的列表,可以是名称,或者当 regex 为真时,是匹配名称的 Python 正则表达式。如果省略 include,则默认包括所有工作流程。
- exclude
不检索资产的列表,可以是名称,或者当 regex 为真时,是匹配名称的 Python 正则表达式。如果省略 exclude,则不排除任何工作流程。同时匹配 include 和 exclude 的工作流程将被排除。
- regex
一个布尔值。如果为真(默认为假),则 include 和 exclude 字段的元素被视为匹配(非锚定)工作流程名称的 Python 正则表达式;如果为假,则用作精确名称
当未指定 workflows 时,将检索所有可用工作流程的资产。
- 自
时间戳(日期、时间、时区);只检索在给定时间点之后开始构建的资产。如果没有指定,将使用 max-days-back 设置的截止日期。
脚本在检索新的构建资产时,会跟踪它们的起始点。一旦检索到给定 CI 系统和配置的所有构建资产到一定点,最新此类构建的时间戳将被存储在状态文件中,并用作下一次运行相应 CI 系统的新的 since 值。如果此时将配置文件中的 since 设置更新为较新的时间戳,则配置将覆盖状态文件中的值,并且下一次 tinuous 运行将只检索新设置之后的资产。
- max-days-back
一个整数,指定要查找构建的最大天数;默认为 30。
如果 since 早于此值指示的日期,并且如果存储在状态文件中的给定 CI 系统的时间戳缺失(即,如果这是 tinuous 首次针对 CI 系统运行)或早于 since,则 tinuous 将使用显式指定的 since 值作为截止日期,并忽略 max-days-back。
- 直到
时间戳(日期、时间、时区);只检索在给定时间点之前开始的构建的资产
- types
一组构建触发事件类型;只检索由给定事件之一触发的构建的资产。如果没有指定,将检索所有已识别的事件类型的资产。
已识别的事件类型包括
- cron
按计划运行的构建
- 手动
由人类或通过 CI 系统的 API 手动触发的构建
- pr
对拉取请求上的活动做出反应的构建,CI 系统在自动生成的合并提交上执行构建(不适用于 CircleCI)
- push
对新提交做出反应的构建
- secrets
从名称(用于日志消息)到匹配要清理的机密的 Python 正则表达式 的映射
- allow-secrets-regex
任何与secrets正则表达式匹配并且也匹配此正则表达式的字符串将不会被净化。注意,allow-secrets-regex仅与匹配secrets正则表达式的子串进行测试,而不考虑任何周围文本,因此在此正则表达式中前瞻和后顾将不起作用。
- datalad
一个描述tinuous与DataLad集成的子映射。子字段
- enabled
一个布尔值。如果为true(默认为false),则需要安装DataLad,如果当前目录不是数据集,则将其转换为DataLad数据集,可选地将资产分成子数据集,并在tinuous fetch运行结束时提交所有新资产。path模板字符串可以包含//分隔符,表示子数据集的边界。
- cfg_proc
在创建数据集和子数据集时要运行的进程
一个示例配置文件
repo: datalad/datalad
vars:
path_prefix: '{year}//{month}//{day}/{ci}/{type}'
build_prefix: '{path_prefix}/{type_id}/{build_commit[:7]}'
ci:
github:
paths:
logs: '{build_prefix}/{wf_name}/{number}/logs/'
artifacts: '{build_prefix}/{wf_name}/{number}/artifacts/'
releases: '{path_prefix}/{release_tag}/'
workflows:
- test_crippled.yml
- test_extensions.yml
- test_macos.yml
travis:
paths:
logs: '{build_prefix}/{number}/{job}.txt'
appveyor:
paths:
logs: '{build_prefix}/{number}/{job}.txt'
accountName: mih
projectSlug: datalad
circleci:
paths:
logs: '{build_prefix}/{wf_name}/{number}/{job_name}/{step}-{index}.txt'
artifacts: '{path_prefix}/{wf_name}/{number}/{job_name}/artifacts/'
since: 2021-01-20T00:00:00Z
max-days-back: 14
types: [cron, manual, pr, push]
secrets:
github: '\bgh[a-z]_[A-Za-z0-9]{36,}\b'
docker-hub: '\b[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}\b'
appveyor: '\b(v2\.)?[a-z0-9]{20}\b'
travis: '\b[a-zA-Z0-9]{22}\b'
aws: '\b[a-zA-Z0-9+/]{40}\b'
datalad:
enabled: true
cfg_proc: text2git
路径模板
给定工作流程运行、构建作业或发布保存资产的路径由创建相应CI系统配置文件中给出的适当路径模板字符串确定。模板字符串是一个包含占位符的文件路径,占位符形式为{field},其中可用的占位符有
占位符 |
定义 |
---|---|
{year} |
构建开始或发布发布的四位数字年份 |
{month} |
构建开始或发布发布的两位数字月份 |
{day} |
构建开始或发布发布的两位数字日期 |
{hour} |
构建开始或发布发布的两位数字小时 |
{minute} |
构建开始或发布发布的两位数字分钟 |
{second} |
构建开始或发布发布的两位数字秒 |
{timestamp} |
构建开始或发布发布的日期和时间。这是一个Python datetime值;可以使用strftime()格式字符串进行格式化,例如,写入{timestamp:FORMAT},例如,{timestamp:%Y-%b-%d}将生成形如“2021-Jun-14”的字符串。如果仅写为{timestamp},则日期和时间将按照ISO 8601格式进行格式化。 |
{timestamp_local} |
构建开始或发布发布的日期和时间,以本地系统时区表示。这与{timestamp}的格式相同。 |
{ci} |
CI系统的名称(github、travis、appveyor或circleci) |
{type} |
触发构建的事件类型(cron、manual、pr或push),或GitHub发布的release |
{type_id} |
有关触发事件的更多信息;对于cron和manual,这是构建开始的时间戳;对于pr,这是关联的拉取请求的编号,如果无法确定,则为UNK;对于push,这是推送到的分支的转义名(或可能是使用的Appveyor或CircleCi推送的标签)[1] [2] |
{release_tag} |
(仅``releases_path``) 发布标签 |
{build_commit} |
构建运行的提交哈希或为发布标记的提交。注意,对于Travis和Appveyor上的PR构建,这是自动生成的合并提交的哈希。 |
{commit} |
触发构建或为发布标记的原始提交的哈希。对于PR构建,这是PR分支的头部,如果无法确定,则为UNK。对于其他构建(包括GitHub Actions上的PR构建),始终与{build_commit}相同。 |
{number} |
工作流程运行次数(GitHub)或构建次数(Travis和Appveyor)或管道次数(CircleCI)[2] |
{status} |
工作流程运行(GitHub)或作业(Travis和Appveyor)或操作(CircleCI)的成功状态;使用的确切字符串取决于CI系统[2] |
{common_status} |
工作流程运行、作业或操作的成功状态,标准化为success(成功)、failed(失败)、errored(错误)或incomplete(不完整)[2] |
{wf_name} |
|
{wf_file} |
(GitHub仅限) 工作流程文件的基名(包括文件扩展名)[2] |
{wf_id} |
(CircleCI仅限) 工作流程的UUID[2] |
{run_id} |
(GitHub仅限) 工作流程运行的唯一ID[2] |
{pipeline_id} |
(CircleCI仅限) 管道的UUID[2] |
{job} |
(Travis、Appveyor和CircleCI仅限) 作业编号,不带构建编号前缀(Travis)或作业ID字符串(Appveyor)[2] |
{job_index} |
(Travis和Appveyor仅限) 作业在API返回列表中的索引,从1开始[2] |
{job_env} |
|
{job_env_hash} |
(Appveyor仅限) 转义前{job_env}的SHA1哈希[2] |
{job_id} |
(CircleCI仅限) 作业的UUID[2] |
{job_name} |
|
{step} |
(CircleCI仅限) 步骤编号[2] |
{step_name} |
(仅限CircleCI使用) 步骤的转义名称 [1] |
{index} |
(仅限CircleCI使用) 步骤运行的并行容器的索引 [2] |
可以通过写入 {placeholder[:n]} 来截断占位符的值到前 n 个字符,例如,{commit[:7]}。
所有时间戳和日期时间组件(除 {timestamp_local} 之外)均为UTC。
路径模板还可以包含在配置文件顶层 vars 映射中定义的自定义占位符。
身份验证
注意,可以从 .env 文件中加载环境变量,而不是直接在环境中设置它们。
GitHub
为了从GitHub检索资产,必须提供具有适当权限的GitHub访问令牌。通过 GH_TOKEN 或 GITHUB_TOKEN 环境变量指定令牌,通过运行 gh 或 hub 命令存储令牌,或者通过在 ~/.gitconfig 文件中设置 hub.oauthtoken Git 配置选项来指定该令牌。
Travis
为了从Travis检索日志,必须通过 TRAVIS_TOKEN 环境变量指定Travis API访问令牌,或者通过运行 travis token --com --no-interactive 来检索。
获取Travis API访问令牌的步骤如下
安装Travis命令行客户端。
运行 travis login --com 进行认证。
如果您的Travis账户与GitHub账户相关联,可以通过运行 travis login --com --github-token $GITHUB_TOKEN 进行认证。
如果 tinuous 将在执行上述步骤的同一台机器上运行,则可以在此处停止,并且 tinuous 将直接从 travis 命令中检索令牌。
运行 travis token --com 检索API访问令牌。
Travis集成还需要一个GitHub OAuth令牌,以便在Travis API未报告的拉取请求上查找信息;此令牌必须与GitHub集成相同的方式指定。
Appveyor
为了从Appveyor检索日志,必须通过 APPVEYOR_TOKEN 环境变量指定Appveyor API密钥(适用于所有可访问的账户或仅适用于与存储库关联的特定账户)。可以从 <https://ci.appveyor.com/api-keys> 获取此类密钥。
CircleCI
为了从CircleCi检索日志和工件,必须通过 CIRCLECI_CLI_TOKEN 环境变量指定CircleCI API令牌(可以是个人令牌或至少具有读取访问权限的项目令牌)。
或者,如果您在同一台将运行 tinuous 的机器上安装了CircleCI本地CLI 并通过运行 circleci setup 向其提供了API令牌,则 tinuous 将从CLI的配置文件中读取提供的API令牌。
请参阅 <https://circleci.com/docs/managing-api-tokens/> 了解如何获取CircleCI API令牌的说明。
cron集成
如果您想在Linux服务器上设置tinuous的定时运行,一种方法如下
创建一个新的目录并cd进入。
在此目录中创建一个名为tinuous.yaml的文件,如上所述
在此目录中创建一个名为.env的文件,包含所需的认证令牌。条目形式为NAME=value,例如
GITHUB_TOKEN=ghp_abcdef0123456789 TRAVIS_TOKEN=asdfghjkl APPVEYOR_TOKEN=v2.qwertyuiop CIRCLECI_CLI_TOKEN=zxcvbnm
创建一个Python 虚拟环境,以提供一个独立的安装tinuous的环境
python3 -m venv venv
在虚拟环境中安装tinuous
venv/bin/pip install tinuous
如果您想使用DataLad与tinuous一起使用,您也需要安装它,即使它已经在虚拟环境外安装了
venv/bin/pip install datalad
运行tinuous以获取您的第一个日志并测试您的配置
venv/bin/tinuous fetch
一旦您对tinuous配置满意,通过创建以下形式的cronjob来设置定时运行
0 0 * * * cd /path/to/directory && chronic flock -n -E 0 .tinuous.lock venv/bin/tinuous fetch
此作业每天午夜运行一次;根据需要调整cron表达式。我们使用chronic(来自moreutils)来抑制输出,除非命令失败,从而防止每次运行都发送充满日志消息的电子邮件。使用flock确保一次最多只有一个tinuous实例运行。
如果您想将日志提交到Git仓库,首先确保.env、venv/和.tinuous.lock包含在仓库的.gitignore中。考虑使用DataLad设置仓库;当启用DataLad集成时,tinuous将在运行结束时自动提交任何新的日志。
如果您正在使用常规Git仓库,您可以在运行结束时通过将以下脚本添加到您的tinuous目录来提交任何新的日志
#!/bin/bash set -ex venv/bin/tinuous fetch git add --all if ! git diff --cached --quiet then git commit -m "Ran tinuous" # Uncomment if you want to push the commits to a remote repository: #git push fi
并将您的cronjob更改为
0 0 * * * cd /path/to/directory && chronic flock -n -E 0 .tinuous.lock bash name-of-script.sh
如果您需要升级tinuous,请在tinuous目录中运行以下命令
venv/bin/pip install --upgrade tinuous
享受您收集的日志、构建工件和/或发布资产吧!
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。