<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Developer Platform on jyukki's Blog</title><link>https://jyukki.com/tags/developer-platform/</link><description>Recent content in Developer Platform on jyukki's Blog</description><generator>Hugo -- 0.147.0</generator><language>ko-kr</language><lastBuildDate>Fri, 24 Jul 2026 10:06:00 +0900</lastBuildDate><atom:link href="https://jyukki.com/tags/developer-platform/index.xml" rel="self" type="application/rss+xml"/><item><title>2026 개발 트렌드: CI Runner Version Floor, self-hosted runner도 패치 SLO를 갖는 런타임이 된다</title><link>https://jyukki.com/posts/2026-07-24-ci-runner-version-floor-trend/</link><pubDate>Fri, 24 Jul 2026 10:06:00 +0900</pubDate><guid>https://jyukki.com/posts/2026-07-24-ci-runner-version-floor-trend/</guid><description>GitHub Actions self-hosted runner 버전 강제, pull_request_target 보호, GitHub Code Quality GA 흐름을 바탕으로 CI runner가 단순 인프라가 아니라 패치·정책·비용 SLO를 갖는 개발 런타임으로 바뀌는 흐름을 정리합니다.</description><content:encoded><![CDATA[<p>2026년 7월 24일은 GitHub Actions self-hosted runner를 운영하는 팀에게 그냥 금요일이 아닙니다. GitHub가 예고한 Enterprise Cloud with Data Residency 대상 Week 4 brownout 중 하나가 이날 진행됩니다. 오래된 runner는 등록뿐 아니라 job 실행도 간헐적으로 막히며, 7월 31일에는 full enforcement가 시작됩니다. GitHub Enterprise Cloud 일반 대상도 9월 25일 enforcement가 예정되어 있습니다.</p>
<p>이 변화는 단순한 버전 업그레이드 공지가 아닙니다. GitHub는 runner가 업데이트를 30일 넘게 따라가지 않으면 job queuing을 중단할 수 있고, critical security update가 나오면 패치 전까지 runner에 job을 보내지 않는 방향을 명시했습니다. 같은 달에는 <code>pull_request_target</code>에서 fork PR 코드를 checkout하는 흔한 pwn request 패턴을 <code>actions/checkout</code> 기본값으로 거부하는 변화가 있었고, GitHub Code Quality는 7월 20일 GA와 함께 유료 제품이 되었습니다. CI/CD가 이제 &ldquo;빌드가 돌아가는 곳&quot;에서 <strong>정책, 보안, 비용, 품질 gate가 동시에 집행되는 개발 런타임</strong>으로 이동하고 있다는 신호입니다.</p>
<p>이 글은 <a href="/posts/2026-07-22-runtime-security-patch-runway-trend/">Runtime Security Patch Runway</a>, <a href="/posts/2026-07-04-ci-native-agent-runner-actions-token-trend/">CI-native Agent Runner와 Actions Token</a>, <a href="/posts/2026-06-25-code-quality-policy-gate-trend/">Code Quality Policy Gate</a>, <a href="/learning/deep-dive/deep-dive-cicd-security-supply-chain/">CI/CD 보안과 공급망</a>과 이어집니다. 핵심 질문은 &ldquo;runner가 최신인가&rdquo; 하나가 아니라, <strong>runner fleet이 중단되기 전에 누가 어떤 근거로 패치하고, 어떤 workflow가 어떤 품질 gate 비용을 태우는가</strong>입니다.</p>
<p>참고한 외부 자료는 GitHub Changelog의 2026년 7월 항목, 2026년 6월 12일 self-hosted runner minimum version enforcement 공지, 2026년 6월 18일 <code>pull_request_target</code> checkout 보호 공지, 2026년 7월 20일 GitHub Code Quality GA 공지입니다.</p>
<h2 id="이-글에서-얻는-것">이 글에서 얻는 것</h2>
<ul>
<li>self-hosted runner 버전 강제가 왜 단순 유지보수 이슈가 아니라 CI 가용성 리스크인지 이해합니다.</li>
<li>runner version, runner image, workflow security default, OIDC subject, cache trust를 하나의 CI trust surface로 묶어 볼 수 있습니다.</li>
<li>GitHub Code Quality 같은 품질 gate가 AI-assisted 비용과 ruleset 정책을 동반할 때 어떤 운영 기준이 필요한지 정리합니다.</li>
<li>플랫폼팀이 바로 적용할 runner inventory, patch SLO, brownout rehearsal, 비용 guardrail 체크리스트를 가져갑니다.</li>
</ul>
<h2 id="핵심-개념이슈">핵심 개념/이슈</h2>
<h3 id="1-self-hosted-runner는-설치형-도구가-아니라-서비스-프로토콜의-한쪽-끝이다">1) self-hosted runner는 설치형 도구가 아니라 서비스 프로토콜의 한쪽 끝이다</h3>
<p>많은 팀이 self-hosted runner를 Jenkins agent나 빌드 VM처럼 봅니다. 한 번 AMI나 container image를 만들어 두고, 새 프로젝트가 필요하면 복제합니다. 하지만 GitHub Actions runner는 GitHub Actions 서비스와 계속 통신하는 실행 런타임입니다. 서비스 쪽 프로토콜과 보안 요구가 바뀌면 runner도 따라가야 합니다.</p>
<p>이번 enforcement의 메시지는 분명합니다.</p>
<ul>
<li>등록 가능한 최소 버전만 맞추는 것으로는 충분하지 않다.</li>
<li>업데이트가 나온 뒤 30일 이상 뒤처지면 job queuing이 중단될 수 있다.</li>
<li>critical security update는 즉시 job queuing pause로 이어질 수 있다.</li>
<li>brownout은 최종 차단 전 실제 중단 모드에 가깝게 rehearsing한다.</li>
</ul>
<p>즉 runner는 &ldquo;나중에 OS 패치 때 같이 올릴 것&quot;이 아니라 <strong>30일 단위로 호환성을 유지해야 하는 런타임 자산</strong>입니다. Node.js, Java, base image 보안 패치와 같은 수준으로 owner, version, exposure, rollback path가 있어야 합니다. 이 관점은 <a href="/posts/2026-07-22-runtime-security-patch-runway-trend/">Runtime Security Patch Runway</a>와 같습니다.</p>
<h3 id="2-brownout은-장애가-아니라-사전-실패-주입이다">2) brownout은 장애가 아니라 사전 실패 주입이다</h3>
<p>brownout을 단순 불편으로 보면 놓치는 게 많습니다. brownout은 enforcement 전 실제 실패를 일부러 드러내는 신호입니다. 오래된 runner가 등록되지 않거나 job을 실행하지 못하는 순간, 팀은 아래 질문에 답해야 합니다.</p>
<ul>
<li>어떤 repository가 어떤 runner label에 묶여 있는가?</li>
<li>queue에 오래 머무는 job이 release blocking인지, optional check인지 구분되는가?</li>
<li>runner image를 어디서 만들고 누가 배포하는가?</li>
<li>runner auto-update를 꺼둔 이유가 보안/재현성/네트워크 제약 중 무엇인가?</li>
<li>runner 교체 후 secret, cache, workspace cleanup, toolchain version이 달라지지 않는가?</li>
</ul>
<p>실무적으로는 brownout 전날이 아니라 2주 전부터 rehearsal을 해야 합니다. 특정 runner group을 새 이미지로 교체하고, 상위 20개 workflow를 실제로 돌려 job duration, cache hit ratio, failure rate를 비교합니다. enforcement 당일에야 오래된 AMI를 찾으면 이미 늦습니다.</p>
<p>초기 기준은 아래처럼 둘 수 있습니다.</p>
<table>
  <thead>
      <tr>
          <th>항목</th>
          <th>권장 기준</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>runner inventory coverage</td>
          <td>95% 이상</td>
      </tr>
      <tr>
          <td>owner unknown runner</td>
          <td>0개</td>
      </tr>
      <tr>
          <td>runner update lead time</td>
          <td>일반 업데이트 30일 이내</td>
      </tr>
      <tr>
          <td>critical runner patch</td>
          <td>24~72시간 내 적용 또는 queue pause 수용</td>
      </tr>
      <tr>
          <td>brownout rehearsal</td>
          <td>enforcement 최소 14일 전 1회</td>
      </tr>
      <tr>
          <td>queued release job p95</td>
          <td>평소 대비 2배 초과 시 incident 후보</td>
      </tr>
  </tbody>
</table>
<p>이 숫자는 절대값보다 운영 의사결정 기준입니다. &ldquo;누가 판단할지&quot;가 비어 있으면 자동화는 늘 마지막 날에 몰립니다.</p>
<h3 id="3-checkout-기본값-변화는-workflow가-supply-chain-boundary임을-보여준다">3) checkout 기본값 변화는 workflow가 supply-chain boundary임을 보여준다</h3>
<p><code>pull_request_target</code>은 오래전부터 위험한 trigger였습니다. base repository의 token과 secret, default branch cache를 가진 상태에서 fork PR의 코드를 checkout하면 공격자가 보낸 코드가 높은 권한으로 실행될 수 있습니다. GitHub가 <code>actions/checkout</code>에서 흔한 pwn request 패턴을 기본 거부하도록 바꾼 것은 workflow YAML이 단순 자동화 스크립트가 아니라 공급망 경계라는 뜻입니다.</p>
<p>여기서 중요한 교훈은 &ldquo;checkout 버전을 올리자&quot;가 아닙니다. workflow는 다음 네 가지를 동시에 봐야 합니다.</p>
<ul>
<li>trigger trust: <code>pull_request</code>, <code>pull_request_target</code>, <code>workflow_run</code>의 권한 차이</li>
<li>code origin: base branch 코드인지 fork head 코드인지</li>
<li>token scope: <code>GITHUB_TOKEN</code>과 cloud OIDC 권한이 어디까지 닿는지</li>
<li>cache/secrets: untrusted 코드가 cache, secret, artifact에 닿는지</li>
</ul>
<p>runner 버전이 낡으면 이런 보호 기본값도 뒤처집니다. workflow가 안전해 보여도, self-hosted runner image에 오래된 tool, 넓은 cloud credential, 잔류 workspace, broad Docker socket이 있으면 경계가 다시 열립니다. <a href="/posts/2026-07-04-ci-native-agent-runner-actions-token-trend/">CI-native Agent Runner와 Actions Token</a>에서 다뤘듯 runner는 권한 있는 endpoint입니다.</p>
<h3 id="4-oidc-immutable-subject는-이름보다-identity-immutability가-중요해졌다는-신호다">4) OIDC immutable subject는 이름보다 identity immutability가 중요해졌다는 신호다</h3>
<p>GitHub Actions OIDC token의 subject claim이 repository와 organization의 mutable name만 보던 구조에서 immutable ID를 포함하는 방향으로 바뀐 것도 같은 흐름입니다. repository rename이나 transfer 뒤에도 cloud provider trust policy가 예전 이름을 계속 신뢰하면, 새 소유자가 같은 subject처럼 보이는 token을 만들 가능성이 생깁니다. immutable ID는 이 위험을 줄입니다.</p>
<p>플랫폼팀 관점에서는 OIDC trust policy도 runner inventory와 함께 봐야 합니다.</p>
<ul>
<li>어떤 cloud role이 어떤 repo/ref/environment를 신뢰하는가?</li>
<li>subject claim이 mutable name 기반인지 immutable ID 기반인지 확인했는가?</li>
<li>repository rename/transfer 후 trust policy가 자동 점검되는가?</li>
<li>workflow permission과 cloud permission이 같은 위험 등급으로 분류되는가?</li>
<li>break-glass role은 만료와 감사 로그가 있는가?</li>
</ul>
<p>CI runner, workflow trigger, checkout default, OIDC subject는 별개 항목처럼 보이지만 실제로는 하나의 trust chain입니다. chain 중 하나만 낡아도 배포 토큰, cloud role, package publish credential이 노출될 수 있습니다.</p>
<h3 id="5-code-quality-ga는-품질-gate가-비용정책ai-사용량-문제로-들어왔다는-뜻이다">5) Code Quality GA는 품질 gate가 비용·정책·AI 사용량 문제로 들어왔다는 뜻이다</h3>
<p>GitHub Code Quality는 2026년 7월 20일 GA가 되면서 GitHub Enterprise Cloud와 GitHub Team에서 사용할 수 있고, CodeQL의 deterministic analysis와 AI-assisted detection, Copilot Autofix를 묶습니다. GitHub는 자체 조직에서 Code Quality finding의 67.3%를 merge 전에 해결한다고 공개했습니다. 동시에 가격은 active committer당 월 10달러와 AI-powered 작업의 usage-based billing, CodeQL 실행 compute cost로 구성됩니다.</p>
<p>이건 개발팀에게 꽤 현실적인 의미가 있습니다. 품질 gate는 더 이상 &ldquo;무료 check 하나 켜기&quot;가 아닙니다.</p>
<ul>
<li>어떤 repository에 enable할지 비용 기준이 필요하다.</li>
<li>AI-assisted detection과 Autofix 사용량이 billing으로 이어진다.</li>
<li>ruleset quality gate와 coverage threshold는 evaluate mode로 점진 적용해야 한다.</li>
<li>finding 해결률, false positive, rework time을 봐야 한다.</li>
<li>bot 계정과 active committer 기준을 이해해야 예산 예측이 가능하다.</li>
</ul>
<p>품질 자동화의 성공 기준은 finding 수가 아닙니다. merge 전 해결률, defect escape 감소, review lead time, flaky gate 비율, cost per resolved finding을 같이 봐야 합니다. 이 부분은 <a href="/posts/2026-06-25-code-quality-policy-gate-trend/">Code Quality Policy Gate</a>와 자연스럽게 연결됩니다.</p>
<h2 id="실무-적용">실무 적용</h2>
<h3 id="1-runner-fleet-inventory를-먼저-만든다">1) runner fleet inventory를 먼저 만든다</h3>
<p>처음 할 일은 runner를 업그레이드하는 것이 아니라 &ldquo;무엇을 업그레이드해야 하는지&quot;를 아는 것입니다. 최소 inventory 필드는 아래 정도입니다.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#ff79c6">runner</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">name</span>: build-linux-prod-17
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">owner_team</span>: platform-ci
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">scope</span>: org
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">runner_group</span>: prod-linux
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">labels</span>: [self-hosted, linux, x64, deploy]
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">version</span>: <span style="color:#bd93f9">2.329.0</span>
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">auto_update</span>: <span style="color:#ff79c6">false</span>
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">image_source</span>: ami-2026-07-10-ci
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">last_registered_at</span>: 2026-07-23T12:31:00Z
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">workloads</span>:
</span></span><span style="display:flex;"><span>    - release
</span></span><span style="display:flex;"><span>    - codeql
</span></span><span style="display:flex;"><span>    - docker-build
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">credential_surface</span>:
</span></span><span style="display:flex;"><span>    - cloud_oidc
</span></span><span style="display:flex;"><span>    - package_publish
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">patch_slo</span>: 30d
</span></span><span style="display:flex;"><span>  <span style="color:#ff79c6">critical_patch_slo</span>: 72h
</span></span></code></pre></div><p>이 inventory가 없으면 enforcement 공지를 읽어도 영향 범위를 모릅니다. audit log registration event는 출발점이 될 수 있지만 완전한 fleet inventory는 아닐 수 있습니다. 특히 오래 켜진 runner, ephemeral runner, autoscaling runner, VM image template, Kubernetes ARC runner를 분리해서 봐야 합니다.</p>
<h3 id="2-runner-update-pipeline을-애플리케이션-배포처럼-운영한다">2) runner update pipeline을 애플리케이션 배포처럼 운영한다</h3>
<p>runner 업데이트는 단순 패키지 업그레이드가 아닙니다. runner가 바뀌면 toolchain, cache, workspace cleanup, Docker version, network route, certificate store, locale, shell behavior가 같이 바뀔 수 있습니다. 그래서 배포 파이프라인처럼 단계가 필요합니다.</p>
<p>권장 순서:</p>
<ol>
<li>새 runner image 생성</li>
<li>canary runner group 5~10%에 적용</li>
<li>상위 workflow 20개 replay</li>
<li>job duration, cache hit ratio, failure rate, queue time 비교</li>
<li>release/deploy workflow 승인 후 확대</li>
<li>이전 image rollback 가능 기간 7~14일 유지</li>
</ol>
<p>중요 workflow의 기준은 제품마다 다르지만, 배포·보안 스캔·패키지 publish·DB migration·mobile release처럼 실패 비용이 큰 job은 canary에 반드시 포함합니다. 단순 unit test만 통과해도 deploy job에서 cloud OIDC나 Docker layer cache가 깨질 수 있습니다.</p>
<h3 id="3-workflow-trust-tier를-나눈다">3) workflow trust tier를 나눈다</h3>
<p>모든 workflow를 같은 runner에서 돌리는 방식은 점점 위험해집니다. 최소한 아래처럼 tier를 나눕니다.</p>
<table>
  <thead>
      <tr>
          <th>Tier</th>
          <th>예시</th>
          <th>runner 정책</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>T0</td>
          <td>lint, unit test, docs build</td>
          <td>low privilege, no secret</td>
      </tr>
      <tr>
          <td>T1</td>
          <td>PR from same repo</td>
          <td>read-only token, restricted cache</td>
      </tr>
      <tr>
          <td>T2</td>
          <td>CodeQL, Code Quality, coverage gate</td>
          <td>controlled toolchain, result artifact 보존</td>
      </tr>
      <tr>
          <td>T3</td>
          <td>package publish, deploy, migration</td>
          <td>isolated runner, OIDC scoped role, owner approval</td>
      </tr>
      <tr>
          <td>T4</td>
          <td>production hotfix, credential rotation</td>
          <td>break-glass, short-lived runner, full receipt</td>
      </tr>
  </tbody>
</table>
<p>fork PR, agent-generated PR, dependency update PR은 기본적으로 낮은 trust tier에서 시작합니다. 이 PR이 higher tier workflow를 요구하면 code owner review, workflow diff check, permission review를 거쳐야 합니다. <a href="/posts/2026-07-12-open-source-ai-contribution-intake-gate-trend/">Open Source AI Contribution Intake Gate</a>와 같은 흐름도 결국 runner trust tier와 만납니다.</p>
<h3 id="4-code-quality는-evaluate-mode와-비용-budget부터-둔다">4) Code Quality는 evaluate mode와 비용 budget부터 둔다</h3>
<p>Code Quality 같은 품질 gate는 좋은 도구지만, 넓게 켜면 review backlog와 비용이 동시에 늘 수 있습니다. 특히 AI-assisted detection과 Autofix는 사용량 기반 비용이 붙을 수 있으므로 repository별 enablement 기준이 필요합니다.</p>
<p>초기 도입 기준:</p>
<ul>
<li>핵심 서비스 Top 20 또는 변경 빈도 높은 repository부터 시작</li>
<li>ruleset은 처음 2주 evaluate mode</li>
<li>false positive rate 15% 초과 시 차단 gate가 아니라 advisory로 유지</li>
<li>merge 전 finding resolution rate 50% 미만이면 rule tuning 또는 교육 필요</li>
<li>cost per active committer와 AI usage를 월 단위 dashboard로 분리</li>
</ul>
<p>품질 gate의 목표는 개발자를 막는 것이 아니라 merge 전에 중요한 결함을 더 싼 시점에서 잡는 것입니다. finding이 많아졌는데 defect escape와 rework time이 줄지 않으면 성공이 아닙니다.</p>
<h3 id="5-incident-runbook을-queued-job-기준으로-만든다">5) incident runbook을 &ldquo;queued job&rdquo; 기준으로 만든다</h3>
<p>runner enforcement나 brownout 때 가장 먼저 보이는 증상은 실패보다 queue 증가일 수 있습니다. workflow가 queued 상태로 멈추면 개발자는 테스트가 느린지, runner가 없는지, 권한이 막힌지 알기 어렵습니다. runbook은 아래 질문에 10분 안에 답해야 합니다.</p>
<ul>
<li>어떤 label의 runner가 부족한가?</li>
<li>부족 원인이 version enforcement, capacity, network, registration 실패 중 무엇인가?</li>
<li>release blocking workflow가 영향을 받는가?</li>
<li>임시로 GitHub-hosted runner나 다른 runner group으로 우회해도 secret boundary가 유지되는가?</li>
<li>우회가 비용과 compliance 조건을 깨지 않는가?</li>
</ul>
<p>임시 우회는 조심해야 합니다. self-hosted runner에서만 허용하던 내부 네트워크, signing key, package publish token이 GitHub-hosted runner로 이동하면 보안 경계가 바뀝니다. 빠른 복구보다 trust boundary 보존이 우선입니다.</p>
<h2 id="트레이드오프주의점">트레이드오프/주의점</h2>
<p>첫째, auto-update를 무조건 켜는 것이 항상 정답은 아닙니다. 재현 가능한 빌드와 regulated environment에서는 runner version을 pin하고 검증 후 올려야 할 수 있습니다. 하지만 pinning은 패치 책임을 가져옵니다. auto-update를 끄면 30일 패치 SLO와 critical update 대응 경로를 직접 운영해야 합니다.</p>
<p>둘째, runner 최신화는 workflow 보안을 자동으로 완성하지 않습니다. <code>pull_request_target</code>, cache poisoning, broad token permission, Docker socket, host mount, secret exposure는 여전히 workflow 설계 문제입니다. runner version은 필요한 조건이지 충분 조건이 아닙니다.</p>
<p>셋째, Code Quality와 AI-assisted gate는 review 품질을 높일 수 있지만, false positive가 높으면 개발자는 gate를 우회하는 방법부터 찾습니다. 처음부터 hard fail로 막기보다 evaluate mode, owner review, rule tuning, exception ledger를 두는 편이 낫습니다.</p>
<p>넷째, 비용을 줄이려고 모든 품질 gate를 끄면 나중에 결함 비용이 커질 수 있습니다. 반대로 모든 repository에 고가 gate를 켜면 플랫폼 예산이 먼저 터집니다. 기준은 repository 중요도, 배포 빈도, defect cost, active committer 수, external exposure입니다.</p>
<p>다섯째, brownout을 &ldquo;GitHub 쪽 이슈&quot;로만 분류하면 학습 기회를 놓칩니다. brownout은 우리 runner inventory, owner, image pipeline, workflow tier가 준비되어 있는지 알려주는 사전 실패 주입입니다. 무시하면 enforcement 당일 같은 문제가 더 크게 옵니다.</p>
<h2 id="체크리스트-또는-연습">체크리스트 또는 연습</h2>
<h3 id="체크리스트">체크리스트</h3>
<ul>
<li><input disabled="" type="checkbox"> self-hosted runner별 owner, version, runner group, label, image source가 inventory되어 있다.</li>
<li><input disabled="" type="checkbox"> auto-update off runner에는 30일 patch SLO와 critical patch SLO가 명시되어 있다.</li>
<li><input disabled="" type="checkbox"> enforcement/brownout calendar가 release calendar와 함께 관리된다.</li>
<li><input disabled="" type="checkbox"> workflow trust tier가 있고 fork PR, deploy, package publish가 같은 runner에서 섞이지 않는다.</li>
<li><input disabled="" type="checkbox"> <code>pull_request_target</code>과 <code>workflow_run</code>에서 untrusted code checkout 패턴을 점검했다.</li>
<li><input disabled="" type="checkbox"> OIDC trust policy가 mutable repository name만 신뢰하지 않는지 확인했다.</li>
<li><input disabled="" type="checkbox"> Code Quality/CodeQL/AI Autofix 비용과 finding 해결률을 별도 dashboard로 본다.</li>
</ul>
<h3 id="연습-과제">연습 과제</h3>
<ol>
<li>현재 조직의 runner 10개를 골라 owner, version, auto-update, image source, workload를 표로 채워보세요. 10분 안에 채울 수 없으면 inventory가 부족한 상태입니다.</li>
<li>가장 중요한 release workflow 하나를 선택해 runner version upgrade canary 계획을 작성하세요. job duration, cache hit ratio, failure rate, queue time의 기준선을 먼저 적습니다.</li>
<li><code>pull_request_target</code>을 쓰는 workflow를 모두 찾아 fork PR head checkout 여부, token permission, cache 접근, secret 접근을 4칸 표로 점검해보세요.</li>
<li>Code Quality를 새로 켠다고 가정하고, 처음 2주 evaluate mode에서 볼 지표 5개와 hard fail로 전환할 조건을 정의해보세요.</li>
</ol>
<h2 id="참고한-외부-자료">참고한 외부 자료</h2>
<ul>
<li>GitHub Changelog, &ldquo;GitHub Actions: Minimum version enforcement timeline for self-hosted runners&rdquo; (2026-06-12): <a href="https://github.blog/changelog/2026-06-12-github-actions-minimum-version-enforcement-timeline-for-self-hosted-runners/">https://github.blog/changelog/2026-06-12-github-actions-minimum-version-enforcement-timeline-for-self-hosted-runners/</a></li>
<li>GitHub Changelog, &ldquo;Safer pull_request_target defaults for GitHub Actions checkout&rdquo; (2026-06-18, 2026-07-15 update): <a href="https://github.blog/changelog/2026-06-18-safer-pull_request_target-defaults-for-github-actions-checkout/">https://github.blog/changelog/2026-06-18-safer-pull_request_target-defaults-for-github-actions-checkout/</a></li>
<li>GitHub Changelog, &ldquo;GitHub Code Quality is now generally available&rdquo; (2026-07-20): <a href="https://github.blog/changelog/2026-07-20-github-code-quality-is-now-generally-available/">https://github.blog/changelog/2026-07-20-github-code-quality-is-now-generally-available/</a></li>
<li>GitHub Changelog, &ldquo;Immutable subject claims for GitHub Actions OIDC tokens&rdquo; (2026-04-23, 2026-06-10 update): <a href="https://github.blog/changelog/2026-04-23-immutable-subject-claims-for-github-actions-oidc-tokens/">https://github.blog/changelog/2026-04-23-immutable-subject-claims-for-github-actions-oidc-tokens/</a></li>
</ul>
]]></content:encoded></item></channel></rss>