GitHubActions是一项用于快速设置持续集成和交付(CI/CD)工作流的服务。这些工作流在称为“runners”的主机上运行。GitHub为托管运行器(WindowsServer、Ubuntu、MacOS)提供有限的操作系统选择。另一种选择是使用自托管运行器,这使存储库管理员可以更好地控制运行器。自托管运行器专用于存储库或组织。以下文章描述了使用FedoraCoreOS配置自托管运行器的步骤。入门FedoraCoreOS是一个精简的操作系统,专为易于大规模部署和维护而设计。操作系统会自动更新并默认提供运行容器所需的工具。由于这些原因,FedoraCoreOS是运行CI/CD工作流程的绝佳选择。配置和供应FedoraCoreOS机器的第一步是生成Ignition文件。Butane允许您以更友好的格式(YAML)生成Ignition文件。配置FedoraCoreOS运行器要在FedoraCoreOS上执行GitHubActions,托管主机需要二进制文件和脚本来注册和运行运行器。从Actionsrunner项目下载二进制文件和脚本并部署在/usr/local/sbin/actions-runner下。版本:“1.3.0”变体:fcosstorage:目录:-路径:/usr/local/sbin/actions-runnermode:0755user:name:coregroup:name:corefiles:-path:/usr/local/sbin/actions-runner/actions-runner-linux.tar.gzoverwrite:truecontents:source:https://github.com/actions/runner/releases/download/v2.278.0/actions-runner-linux-x64-2.278.0.tar.gzmode:0755user:name:coregroup:name:core注册和删除令牌为项目配置运行器需要“令牌”。这可以防止自托管运行器在没有正确权限的情况下被注册或从项目中删除。GitHub提供的令牌的有效期为一小时。如果runner在这个时间之后重新启动,它将需要一个新的注册令牌。这个令牌可能会有问题,尤其是在FedoraCoreOS自动更新的情况下。更新过程预计托管主机在收到新数据后至少每隔几周重新启动一次。幸运的是,可以使用GitHubRESTAPI获取这些令牌并在每次重新启动托管主机时自动配置运行器。下面的manage-runner.sh脚本使用API获取令牌,删除任何已配置的运行器,并使用新令牌注册运行器。#!/bin/bash#HandlestheGithubActionrunnerconfiguration.#RemoveandRegistrationtokenexpiresafter1hour,ifwewantourrunner#toworkafterareboot(autoupdate)weneedtorefreshthetokens.#FirstremovetherunnerwithafreshremovetokenREMOVE_TOKEN=$(curl-u${GITHUB_USER}:${GITHUB_TOKEN}-c.github应用程序。v3+json"https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPO}/actions/runners/remove-token|jq-r'.token')/usr/local/sbin/actions-runner/config.shremove--token${REMOVE_TOKEN}#ThenregistertherunnerwithafreshregistrationtokenREGISTRATION_TOKEN=$(curl-u${GITHUB_USER}:${GITHUB_TOKEN}-XPOST-H“接受:application/vnd.github.v3+json”https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPO}/actions/runners/registration-token|jq-r'.token')/usr/local/sbin/actions-runner/config.sh--urlhttps://github.com/cverna/fcos-actions-runner--token${REGISTRATION_TOKEN}--labelsfcos--unattended上面的脚本使用了一些环境变量,包括GitHubusername和personal用于认证RESTAPI请求访问令牌PersOnalAccessToken个人访问令牌需要存储库权限才能成功检索跑步者的注册和删除令牌。此令牌是安全敏感信息,因此最好将其存储在具有更严格权限的不同文件中。在这个例子中,这个文件是actions-runner.GITHUB_USER=GITHUB_REPO=GITHUB_TOKEN=这是创建这两个文件manage-runner.sh和actions-runner的Butane片段。-路径:/usr/local/sbin/actions-runner/manage-runner.shcontents:local:manage-runner.shmode:0755user:name:coregroup:name:core-path:/etc/actions-runnercontents:local:actions-runnermode:0700user:name:coregroup:name:core在FedoraCoreOS上运行操作最后,创建用于配置和启动运行器的systemd服务。在Butane配置文件中定义这些服务。systemd:units:-name:github-runner-configure.serviceenabled:truecontents:|[Unit]Description=ConfigurethegithubactionrunnerforrepositoryAfter=network-online.targetboot-complete.targetRequires=boot-complete.target[服务]环境文件=/etc/actions-runnerType=oneshotRemainAfterExit=yesUser=coreWorkingDirectory=/usr/local/sbin/actions-runnerExecStartPre=tarxvfactions-runner-linux.tar.gz--no-same-ownerExecStart=/usr/local/sbin/actions-runner/manage-runner.sh[Install]WantedBy=multi-user.target-name:github-runner.serviceenabled:truecontents:|[Unit]Description=RunthegithubactionrunnerAfter=github-runner-configure.service[Service]WorkingDirectory=/usr/local/sbin/actions-runnerUser=coreExecStart=/usr/local/sbin/actions-runner/run.sh[Install]WantedBy=multi-user.target这会创建两个服务:github-runner-configure.service(主机启动完成后运行一次)和github-runner.service(运行Actionsrunner二进制文件并等待新的CI/CD作业)。现在Butane已配置,从中生成Ignition文件并配置FedoraCoreOSActions运行器。$podmanrun-i--rm-v$PWD:/code:z--workdir/codequay.io/coreos/butane:release--pretty--strict--files-dir/codeconfig.yaml-oconfig.ignitiononceIgnition生成的文件,它可用于在支持FedoraCoreOS的平台上配置运行器。配置Action以使用自托管运行器以下测试Action工作流程将测试FCOS的自托管运行器。在您的git存储库中创建以下文件.github/workflows/main.yml。#ThisisabasicworkflowtohelpyougetstartedwithActionsname:CI#Controlswhentheactionwillrun.on:#Triggerstheworkflowonpushorpullrequesteventsbutonlyforthemainbranchpush:branches:[main]pull_request:branches:[main]#AllowsyoutorunthisworkflowmanuallyfromtheActionstabworkflow_dispatch:#Aworkflowrunismadeupofoneormorejobsthatcanrunsequentiallyorinparalleljobs:#Thisworkflowcontainsasinglejobcalled"build"build:#Thetypeofrunnerthatthejobwillrunonruns-on:fcos#Stepsrepresentasequenceoftasksthatwillbeexecutedaspartofthejobsteps:#Runsasinglecommandusingtherunnersshell-name:Runa-linescriptrun:podmanrun--rmfedora-minimal:34echoHelloWorld!请注意,runs-on的配置设置为使用标记为fcos的跑步者。可以在此处找到本文中提供的代码。