这个想法:只要你的CI从主分支构建代码,请不要抛弃构建结果:改为发布。这使得QA工程师或错误记者提供新的构建来易于尝试。
我第一次在工作中经历了这个设置,我们使用Jenkins。 Jenkins不是我首选的CI系统,而是为了获得信用,它使其超级易于实现此功能:添加步骤来归档工件,或者使用ArchiveARtifacts Pipeline命令。
我们实际上为所有在工作中的构建执行此操作,不仅是主分支构建。它使我们的QA工程师的生活更容易。我们的工作流程如下所示:
当开发人员考虑它准备QA时,QA工程师下载PR构建生成的工件并使用它们来验证工作。
我认为将类似于我自己的项目的东西是一个很好的想法,这些项目在Github上托管并使用GitHub CI。
我预计这样的功能可以随时可用,但我找不到我想要的东西。 GitHub提供了一种从建筑物中下载文物的方法,但它并不理想:
伪像在一个大的zip中捆绑在一起,在构建多平台应用时,这是不方便的:没有人想要下载一个包含相同应用程序的acos,windows和linux应用程序。
一些项目使用标签来生产主分支构建,但我不喜欢这个想法。叫我一个纯票,但是使用标签,这种方式感觉像对概念来补偿丢失的github功能。
由于我托管vps上的博客,我最终做了什么正在vps上建立一个子域(builds.agateau.com),并将github上传到我的服务器上的ssh。
我设置的第一件事是HTTP服务器提供文件。在我的注册商上添加子域后,我在我的vps上创建了一个目录,并配置了nginx,以便访问" builds.agateau.com"可以使用nginx花式索引模块浏览和下载此目录的内容。
然后我在vps上创建了一个构建用户,在/srv/builds.agateau.com/html中创建了一个目录,并使构建用户成为这些目录的所有者,以便它可以写入它们。
最后,我为此用户创建了一个SSH键,以便GitHub Builder可以连接到它。
我研究了SSH上传的现有GitHub操作,但它只对SCP呼叫感到过度矫枉过正。相反,我决定保持简单:我的构建将调用shell脚本来进行上传。无论如何,我更喜欢将依赖关系保持在最小,这使得在本地测试构建脚本,而不是使用Commit-Push-and-and-34;工作流程"
#!/ bin / bash set -euo pipefail progname = $(basename $ 0)die(){echo" $ progname:$ *" > & 2出口1}#检查$ 1是定义的,而不是emptycheck_var(){local name = $ 1如果! env | Grep -Q" ^ $名称= .. *" ;然后死亡"环境变量$名称未设置或为空" fi}用法(){如果[" $ *" !! ="" ];然后回声"错误:$ *"回声FI猫<< EOF使用率:$ progname [选项...]< project> < build_file> [build_file ...]上载使用scp构建一个器件到服务器。文件是上载到构建/< project> /。期望设置以下环境变量: - Upload_Username - Upload_Private_Key - Upload_Hostname选项:-h,--help显示此用法消息和退出EOF Exit 1} Project =""" build_files =""虽然[$#-gt 0];案例" 1美元"在-h | - help)使用; - *)使用"未知选项' $ 1'" ;; *)如果[-Z" $项目" ];然后项目=" 1美元" else build_files =" $ build_files $ 1" fi ;;如果[-z" $ build_files" ];然后用法"没有足够的争论" ficheck_var upload_usernamecheck_var upload_private_keycheck_var upload_hostname echo"上传" eval $(SSH-代理)回声" $ upload_private_key" | ssh-add -scp -o" stricthostkeychecking" $ build_files" $ upload_username @ $ upload_hostname:builds / $ project /"
不可否认,它'对于简单的SCP呼叫有点久,但是,它是因为我更喜欢至少添加至少一定量的doc,参数解析和处理到此类脚本。我发现它有助于在6个月后重新审视它们时(我前段时间在我的shell脚本模板中写道,如果您有兴趣)。
此脚本获取项目的名称,该项目与服务器上创建的目录匹配,以及上传文件。通过环境变量提供敏感信息(用户名,主机名和私钥)。
注意:我不得不禁用主机键检查(-o" stricthostkeychecking" scp调用中的选项),因为我无法弄清楚如何将主机键作为参数或环境变量传递。我相信这种情况,它赢得了' t太糟糕了,可能发生的情况是,有人管理窃取帐户公钥并上传到他们的服务器而不是我的服务器。仍然是我喜欢能够通过主机键。如果你知道如何做到这一点,我很乐意收到你的来信!
我连接到项目github管理页面,并将用户名,主机名和私钥声明为github加密的秘密。
现在所做的一切都是从Github构建工作流程调用上传构建脚本。
以下是Git Bonsai构建工作流程,显示如何在每个推送到主分支后调用上传 - 构建。
名称:版本:[推,pull_request]作业:构建:策略:Fail-Fast:False Matrix:OS: - Ubuntu-18.04 - MacOS-10.15 - Windows-2019 runs-on:$ {{romix.oS}}默认值:shell:bash步骤: - 用途:操作/ [电子邮件保护] - 名称:build运行:ci / build-app - 名称:运行静态检查运行:ci / run-static-checks - name:运行测试运行: CI / Run-Tests - 名称:Create Archive Run:CI / Create-Archive - 名称:上传IF:GitHub.ref ==' refs / heads / master'运行:CI / Upload-Build Git-Bonsai Artifacts / *。BZ2 ENV:Upload_Username:$ {{secrets.upload_eusername}} upload_private_key:$ {{secrets.upload_private_key}} upload_hostname:$ {{secrets.upload_hostname}}
服务器端需要最后一件事:为确保服务器磁盘没有充满构建,并且构建列表页面不会变得太长,我添加了一个清理脚本,以保持每个项目的最新30个构建。此脚本每天都运行。
在这里,它再次它'因为参数解析而比人们所期望的时间长一点:
#!/ bin / bash set -euo pipefail progname = $(basename $ 0)root_dir = / srv / builds.agateau.com / html max_builds = 30#verbose命令默认cmd =" rm -v" quiet_cmd =" rm" dry_run_cmd ="回声将删除" clean_project_dir(){local project_dir =" 1美元" ls - ssort time --reverse" $ project_dir" \ | awk' nr> ' $ max_builds' {打印$ 1}' \ |虽然读名称为$ cmd" $ project_dir / $ name"完成}用法(){如果[" $ *" !! ="" ];然后回声"错误:$ *"回声FI猫<< EOF使用率:$ progname [选项...]删除旧构建工件。选项:-h,--help显示此用法消息和退出-q,--quiet工作静默 - 运行打印将被删除,而不是删除任何EOF退出1}而[$#-gt 0];案例" 1美元"在-h | - help)使用; -q | --quiet)cmd =" $ quiet_cmd"转移 ;; - 运行)cmd =" $ dry_run_cmd"转移 ;; - *)使用"未知选项' $ 1'" ;; *)使用"太多争论" ;;在$ root_dir / * /中为project_dir完成esac; do clean_project_dir" $ project_dir"完毕
要使构建网站看起来有点漂亮,我配置了花式索引模块来使用平面主题。我还在降序订单中制作了它列表构建,以便最新版本始终位于页面的顶部。
它,你可以看看它:https://builds.agateau.com/。现在只有两个项目,我计划将来增加更多。
我很高兴我花了一些时间设置这个神器上传系统,因为它已经证明了让错误记者在报告问题后确认修复。让我知道这是否对您有用,或者您是否知道发布构建工件的更简单的解决方案。