1864 lines
106 KiB
HTML
1864 lines
106 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
|
||
<meta charset="utf-8"/>
|
||
|
||
|
||
<meta http-equiv="Content-Security-Policy" content="
|
||
default-src 'self' d3r49iyjzglexf.cloudfront.net dsbai75kcyzl9.cloudfront.net d2qm0z2kzhiwa.cloudfront.net;
|
||
img-src 'self' data: http: https:;
|
||
script-src 'self' d3r49iyjzglexf.cloudfront.net dsbai75kcyzl9.cloudfront.net d2qm0z2kzhiwa.cloudfront.net www2.circleci.com j.6sc.co *.algolianet.com *.algolia.net https://cdn-assets-prod.s3.amazonaws.com/js/preview2/ https://s3-us-west-2.amazonaws.com/b2bjsstore/b/LNKLDHM3E2OJ/reb2b.js.gz cdn.amplitude.com https://www.clarity.ms/tag/uet/ tags.clickagy.com https://a.clickcertain.com/px/li/ cdnjs.cloudflare.com/ajax/libs/ dn1f1hmdujj40.cloudfront.net/js/ consent.cookiebot.com consentcdn.cookiebot.com https://www.datadoghq-browser-agent.com googleads.g.doubleclick.net/pagead/ connect.facebook.net www.google.ca/pagead/ www.google.co.jp/pagead/ www.google.co.uk/pagead/ www.google.com/pagead/ https://www.google.com/recaptcha/ www.google.ie/pagead/ www.google-analytics.com www.googleadservices.com/pagead/ www.googletagmanager.com https://boards.greenhouse.io/embed/job_board/js https://www.gstatic.com/recaptcha/ https://b.st-hatena.com/js/bookmark_button.js *.hotjar.com *.hotjar.io cdn.jsdelivr.net/clipboard.js/ https://cdn.jsdelivr.net/npm/algoliasearch@4.24.0/dist/algoliasearch-lite.umd.js https://cdn.jsdelivr.net/npm/instantsearch.js@4.74.2/dist/instantsearch.production.min.js https://cdn.jsdelivr.net/npm/intl-tel-input@18.1.5/build/js/utils.js https://b-code.liadm.com/lc2.js https://d-code.liadm.com/did-008f.min.js https://i.liadm.com/s/56408 https://www.line-website.com/social-plugins/js/thirdparty/loader.min.js munchkin.marketo.net snap.licdn.com/li.lms-analytics/ in.ml314.com ml314.com cdn.optimizely.com/js/ cdn3.optimizely.com/js/ app.optimizely.com https://master-py3-monolithapp.app.optimizely.com/ https://optimizely.s3.amazonaws.com/js/ platform.twitter.com *.qualified.com a.quora.com https://www.redditstatic.com/ads/pixel.js https://a.remarketstats.com/px/li-co/ cdn.segment.com https://cdn.sprig.com https://tags.srv.stackadapt.com/events.js cookie.sync.usonar.jp cdn.cookie.sync.usonar.jp apis.usonar.jp https://a.usbrowserspeed.com/cs https://opps-widget.getwarmly.com www.youtube.com/iframe_api www.youtube.com/s/player/ https://ws.zoominfo.com/pixel/ 'unsafe-inline' 'unsafe-eval' https://unpkg.com/@highlightjs/ https://js.zi-scripts.com/zi-tag.js https://static.reo.dev *.hsadspixel.net *.hs-analytics.net js.hscta.net js-eu1.hscta.net *.hubspot.com static.hsappstatic.net *.usemessages.com *.hs-banner.com *.hubspotusercontent00.net *.hubspotusercontent10.net *.hubspotusercontent20.net *.hubspotusercontent20.net *.hubspotusercontent30.net *.hubspotusercontent40.net *.hscollectedforms.net *.hsleadflows.net *.hsforms.net *.hsforms.com *.hs-scripts.com *.hubspotfeedback.com feedback.hubapi.com feedback-eu1.hubapi.com 48752163.fs1.hubspotusercontent-na1.net *.hubspot.net https://cdn.jsdelivr.net/npm/ blob: bzrcdn.openai.com;
|
||
style-src 'self' d3r49iyjzglexf.cloudfront.net dsbai75kcyzl9.cloudfront.net d2qm0z2kzhiwa.cloudfront.net www2.circleci.com fonts.googleapis.com www.googletagmanager.com/debug/ https://cdn.jsdelivr.net/npm/instantsearch.css@8.5.1/themes/reset-min.css https://tags.srv.stackadapt.com/sa.css *.qualified.com 'unsafe-inline' https://unpkg.com/@highlightjs/ *.hubspotusercontent00.net *.hubspotusercontent10.net *.hubspotusercontent20.net *.hubspotusercontent30.net *.hubspotusercontent40.net cdn2.hubspot.net;
|
||
font-src 'self' d3r49iyjzglexf.cloudfront.net dsbai75kcyzl9.cloudfront.net d2qm0z2kzhiwa.cloudfront.net fonts.gstatic.com/s/ *.hotjar.com *.hotjar.io *.hubspot.net *.qualified.com;
|
||
frame-src 'self' www2.circleci.com consentcdn.cookiebot.com bid.g.doubleclick.net https://td.doubleclick.net e.infogram.com www.facebook.com https://www.google.com/ www.googletagmanager.com https://boards.greenhouse.io https://b.hatena.ne.jp/entry/button/ https://*.hotjar.com *.hotjar.io https://social-plugins.line.me/widget/ a8188917468.cdn.optimizely.com *.qualified.com platform.twitter.com syndication.twitter.com player.vimeo.com www.youtube.com https://job-boards.greenhouse.io https://i.liadm.com/ *.hubspot.com *.hs-sites.com *.hs-sites-eu1.com *.hubspot.net play.hubspotvideo.com play-eu1.hubspotvideo.com *.hsforms.net *.hsforms.com;
|
||
base-uri 'self';
|
||
connect-src 'self' d3r49iyjzglexf.cloudfront.net dsbai75kcyzl9.cloudfront.net d2qm0z2kzhiwa.cloudfront.net https://*.circleci.com/ http://localhost:5338 c.6sc.co https://eps.6sc.co/v3/company/details https://epsilon.6sense.com/v3/company/details https://epsilon-globalaccelerator.6sense.com/v3/company/details https://epsilon-cloudfront.6sense.com/v3/company/details https://ipv6.6sc.co/ https://v.eps.6sc.co/v ib.adnxs.com https://secure.adnxs.com/ *.algolia.net *.algolianet.com https://alocdn.com/c/vn3d8u2u/a/xtarget/p.json https://cdn-assets-prod.s3.amazonaws.com/js/preview2/ api.amplitude.com https://azureatom2.westus3.cloudapp.azure.com:9091/ws/simple/ https://*.browser-intake-datadoghq.com https://aorta.clickagy.com hemsync.clickagy.com/external/ https://cdn.contentful.com/spaces/il1yandlcjgk/environments/master/ https://consentcdn.cookiebot.com *.g.doubleclick.net https://www.facebook.com/tr/ opps-api.getwarmly.com/api/ https://analytics.google.com/g/ https://google.com/ccm/form-data/ www.google.ca/pagead/ www.google.co.jp/pagead/ www.google.co.uk/pagead/ www.google.com/pagead/ https://google.com/pagead/form-data/ www.google.ie/pagead/ www.google-analytics.com www.googleadservices.com/pagead/ https://www.google.com/ccm/collect *.hotjar.com:* *.hotjar.com *.hotjar.io wss://ws.hotjar.com/api/v2/client/ws https://hubspot-forms-static-embed.s3.amazonaws.com/prod/45466221/ https://pro.ip-api.com/json https://ipapi.co/json *.liadm.com https://px.ads.linkedin.com/attribution_trigger https://px.ads.linkedin.com/wa/ 485-zmh-626.mktoresp.com/webevents/ app.optimizely.com/api/client/ errors.client.optimizely.com/log logx.optimizely.com/v1/events https://master-py3-monolithapp.app.optimizely.com/api/client/ tapi.optimizely.com/api/ *.qualified.com wss://ws.qualified.com wss://ws2.qualified.com/cable https://conversions-config.reddit.com/v1/pixel/error https://pixel-config.reddit.com/pixels/a2_gnjgkmy4996t/config https://www.redditstatic.com/ads/conversions-config/v1/pixel/config/a2_gnjgkmy4996t_telemetry https://api.rollbar.com/api/1/item/ api.segment.io/v1/ cdn.segment.com/v1/ https://cdn.segment.com/analytics-next/bundles/* https://cdn.segment.com/next-integrations/integrations/* https://api.sprig.com https://cdn.sprig.com https://tags.srv.stackadapt.com/sa.jpeg https://tags.srv.stackadapt.com/saq_pxl https://tags.srv.stackadapt.com/js_tracking https://a.usbrowserspeed.com/cs ws.zoominfo.com/pixel/ https://js.zi-scripts.com/unified/v1/master/getSubscriptions https://js.zi-scripts.com/unified/v1/master/logError https://cdn.segment.com/v1/projects/AbgkrgN4cbRhAVEwlzMkHbwvrXnxHh35/settings api.segment.io api.segment.com track.segment.com cdn.segment.com https://api.reo.dev https://www.google.com/rmkt/collect/805776048/ https://www.google.com/rmkt/collect/1032131388/ *.hubapi.com js.hscta.net js-eu1.hscta.net *.hubspot.com *.hs-banner.com *.hscollectedforms.net *.hsforms.com static.hsappstatic.net ad.doubleclick.net bzrcdn.openai.com bzr.openai.com;
|
||
object-src 'none';
|
||
form-action 'self' www.facebook.com/tr/ platform.twitter.com syndication.twitter.com *.hsforms.com;
|
||
media-src 'self' d3r49iyjzglexf.cloudfront.net dsbai75kcyzl9.cloudfront.net d2qm0z2kzhiwa.cloudfront.net https://videos.ctfassets.net/il1yandlcjgk/ mediastream: *.qualified.com;
|
||
">
|
||
|
||
<script>
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag(){dataLayer.push(arguments);}
|
||
|
||
gtag('consent', 'default', {
|
||
'ad_personalization': 'granted',
|
||
'ad_storage': 'granted',
|
||
'ad_user_data': 'granted',
|
||
'analytics_storage': 'granted',
|
||
'functionality_storage': 'granted',
|
||
'personalization_storage': 'granted',
|
||
'wait_for_update': 500
|
||
});
|
||
|
||
gtag('consent', 'default', {
|
||
'ad_personalization': 'denied',
|
||
'ad_storage': 'denied',
|
||
'ad_user_data': 'denied',
|
||
'analytics_storage': 'denied',
|
||
'functionality_storage': 'denied',
|
||
'personalization_storage': 'denied',
|
||
'wait_for_update': 500,
|
||
'region': [
|
||
'AT', 'BE', 'BG', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES',
|
||
'FI', 'FR', 'GB', 'GG', 'GR', 'HR', 'HU', 'IE', 'IM', 'IS',
|
||
'IT', 'JE', 'LI', 'LT', 'LU', 'LV', 'MT', 'NL', 'NO', 'PL',
|
||
'PT', 'RO', 'SE', 'SI', 'SK', 'BR', 'CA-QC'
|
||
]
|
||
});
|
||
|
||
gtag('set', 'ads_data_redaction', true);
|
||
gtag('set', 'url_passthrough', false);
|
||
</script>
|
||
|
||
<script id="Cookiebot" src="https://consent.cookiebot.com/uc.js" data-cbid="a28b71f3-4d2e-4eac-93bc-34929948dd7d" type="text/javascript" async></script>
|
||
<script type="text/javascript" src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/node_modules/algoliasearch/dist/lite/builds/browser.umd-28165911fb7bb83c3e9ed0fb541b3362.js" crossorigin="anonymous" defer></script>
|
||
|
||
<script type="text/javascript" src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/node_modules/instantsearch.js/dist/instantsearch.production.min-643e287d1ee3188565992de26a16c172.js" crossorigin="anonymous" defer></script>
|
||
|
||
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="mobile-web-app-capable" content="yes">
|
||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||
<link href="/blog/feed.xml" type="application/rss+xml" rel="alternate" title="Latest 10 blog posts (atom)">
|
||
|
||
|
||
<script data-cookieconsent="marketing" type="text/plain">
|
||
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
||
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
||
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
||
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
||
})(window,document,'script','dataLayer','GTM-W9HDVK');
|
||
</script>
|
||
|
||
|
||
<link rel="apple-touch-icon" sizes="180x180" href="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/blog/meta/apple-touch-icon-ae782d6339f660e1c51fe68f58d7f0bb.png">
|
||
<link rel="icon" type="image/png" sizes="512x512" href="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/blog/meta/android-chrome-512x512-b0a3962c7ec90ae60cb31f99a3fc37b5.png">
|
||
<link rel="icon" type="image/png" sizes="192x192" href="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/blog/meta/android-chrome-192x192-4b4b8e31a8e09d0c50661d56be7abe09.png">
|
||
<link rel="icon" type="image/png" sizes="150x150" href="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/blog/meta/android-chrome-192x192-4b4b8e31a8e09d0c50661d56be7abe09.png">
|
||
<link rel="icon" type="image/png" sizes="32x32" href="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/blog/meta/favicon-32x32-b99b3f32c912ffa11871fca4c1bc9794.png">
|
||
<link rel="icon" type="image/png" sizes="16x16" href="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/blog/meta/favicon-16x16-3753a156e703f3623e04c22092c57784.png">
|
||
<link rel="manifest" href="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/blog/meta/site-df659f8936fedc4317891e7da811d30b.webmanifest">
|
||
<link rel="mask-icon" href="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/blog/meta/safari-pinned-tab-762525fdd8903e935f141a92dd70b325.svg" color="#04aa51">
|
||
<link rel="shortcut icon" href="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/blog/meta/favicon-a4b5df34fe849ecd8018a252dbf89a6c.ico">
|
||
<meta name="apple-mobile-web-app-title" content="CircleCI">
|
||
<meta name="application-name" content="CircleCI">
|
||
<meta name="msapplication-TileColor" content="#161616">
|
||
<meta name="msapplication-square150x150logo" content="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/blog/meta/mstile-150x150-126d37f348480d7ae2b632e3033a2f25.png" />
|
||
<meta name="theme-color" content="#ffffff">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<link rel="alternate" hreflang="x-default" href="https://circleci.com/blog/jan-4-2023-incident-report/">
|
||
|
||
|
||
|
||
|
||
|
||
<link rel="alternate" hreflang="en" href="https://circleci.com/blog/jan-4-2023-incident-report/">
|
||
|
||
|
||
|
||
<link rel="alternate" hreflang="ja" href="https://circleci.com/ja/blog/jan-4-2023-incident-report/">
|
||
|
||
|
||
|
||
<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width">
|
||
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Inter:wght@100..900&family=Space+Grotesk:wght@300..700&display=swap" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
||
<noscript><link href="https://fonts.googleapis.com/css2?family=Inter:wght@100..900&family=Space+Grotesk:wght@300..700&display=swap" rel="stylesheet"></noscript>
|
||
|
||
<link type="text/css" rel="stylesheet" href="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/morph/main-51e101e43381bbe07a29106e867549be.css" >
|
||
|
||
|
||
|
||
|
||
<script type="text/javascript">
|
||
(function () {
|
||
var pageSubcategory = null || "post";
|
||
var pageName = "jan-4-2023-incident-report" || null;
|
||
|
||
// store as globals to read off of it later in analytics.js
|
||
window.analyticsPageProperties = {
|
||
pageSubcategory: pageSubcategory,
|
||
pageName: pageName,
|
||
};
|
||
})();
|
||
|
||
window.thirdPartyIds = {
|
||
|
||
};
|
||
|
||
window.circleJsConfig = {
|
||
analytics: {
|
||
enable: true
|
||
},
|
||
page: {
|
||
lang: "en"
|
||
},
|
||
env: "production"
|
||
};
|
||
</script>
|
||
|
||
|
||
<script>
|
||
!function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","page","once","off","on"];analytics.factory=function(t){return function(){var e=Array.prototype.slice.call(arguments);e.unshift(t);analytics.push(e);return analytics}};for(var t=0;t<analytics.methods.length;t++){var e=analytics.methods[t];analytics[e]=analytics.factory(e)}analytics.load=function(t){var e=document.createElement("script");e.type="text/javascript";e.async=!0;e.src=("https:"===document.location.protocol?"https://":"http://")+"cdn.segment.com/analytics.js/v1/"+t+"/analytics.min.js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(e,n)};analytics.SNIPPET_VERSION="3.1.0";}}();
|
||
</script>
|
||
<script data-cookieconsent="marketing" type="text/plain">
|
||
analytics.load("AbgkrgN4cbRhAVEwlzMkHbwvrXnxHh35");
|
||
</script>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<title>CircleCI Jan 4, 2023 security incident report - CircleCI</title>
|
||
|
||
<meta property="og:title" content="CircleCI Jan 4, 2023 security incident report - CircleCI" />
|
||
|
||
|
||
<meta name="description" content="Read the full incident report from CircleCI’s January 4, 2023 security incident, including what happened, our response, and the steps we took to fix it." />
|
||
<meta property="og:description" content="Read the full incident report from CircleCI’s January 4, 2023 security incident, including what happened, our response, and the steps we took to fix it." />
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<link rel="canonical" href="https://circleci.com/blog/jan-4-2023-incident-report/" />
|
||
<meta property="og:url" content="https://circleci.com/blog/jan-4-2023-incident-report/" />
|
||
|
||
|
||
<meta property="og:site_name" content="CircleCI" />
|
||
|
||
|
||
|
||
<meta property="og:image" content="https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=1200&fm=jpg" />
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<meta property="og:type" content="article" />
|
||
<meta property="article:published_time" content="2023-01-12T22:00:00-08:00" />
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
|
||
|
||
<meta name="twitter:site" content="@circleci" />
|
||
|
||
|
||
<meta name="twitter:creator" content="@" />
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<meta name="facebook-domain-verification" content="nnlbym6zbwhtcivy2t5hbes5vvvjpu" />
|
||
|
||
|
||
|
||
|
||
|
||
<script type="application/ld+json">
|
||
|
||
{"@context":"http://schema.org","@type":"Article","url":"https://circleci.com/blog/jan-4-2023-incident-report/","datePublished":"2023-01-12T22:00:00-08:00","dateModified":"2023-01-12T22:00:00-08:00","author":{"@type":"Person","name":"Rob Zuber","jobTitle":"Chief Technology Officer"},"publisher":{"@type":"Organization","name":"CircleCI","logo":"https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/blog/meta/circleci-logo-stacked-fb-d935075860d0f00f19fe71f0cec05899.png"},"headline":"CircleCI Jan 4, 2023 security incident report","description":"Read the full incident report from CircleCI's January 4, 2023 security incident, including what happened, our response, and the steps we took to fix it.","image":"https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg"}
|
||
|
||
</script>
|
||
|
||
|
||
|
||
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "http://schema.org",
|
||
"@type": "BreadcrumbList",
|
||
"itemListElement": [
|
||
{
|
||
"@type": "ListItem",
|
||
"position": 1,
|
||
"name": "Home",
|
||
"item": "https://circleci.com/"
|
||
},
|
||
{
|
||
"@type": "ListItem",
|
||
"position": 2,
|
||
"name": "Blog",
|
||
"item": "https://circleci.com/blog/"
|
||
},
|
||
{
|
||
"@type": "ListItem",
|
||
"position": 3,
|
||
"name": "CircleCI Jan 4, 2023 security incident report"
|
||
}
|
||
]
|
||
}
|
||
</script>
|
||
|
||
|
||
<!-- End Jekyll SEO tag -->
|
||
|
||
</head>
|
||
<body class="page-blog lang-en">
|
||
|
||
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-W9HDVK"
|
||
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
||
|
||
|
||
|
||
<div class="bg-white border-b border-b-morph-fog z-10 top-0 sticky">
|
||
<div class="2xl:container mx-auto pl-8 pr-5 md:pr-8 lg:px-16">
|
||
<nav class="flex justify-between items-center h-18">
|
||
|
||
|
||
<a
|
||
href="/blog/"
|
||
class="flex flex-row items-center gap-2"
|
||
data-analytics-action="clicked-blog-top-nav"
|
||
data-analytics-properties='{ "menu": "blog-nav", "cta_text": "circleci_logo" }'
|
||
data-js-id="mobile-blur-prev"
|
||
>
|
||
<svg role="img" aria-label="CircleCI" fill="none" height="25" viewBox="0 0 116 25" width="116" xmlns="http://www.w3.org/2000/svg"><path d="m8.87876 12.6691c0-1.5781 1.30334-2.87304 2.89174-2.87304s2.8917 1.29494 2.8917 2.87304c0 1.5782-1.3033 2.8731-2.8917 2.8731-1.6292 0-2.89174-1.2544-2.89174-2.8731zm2.89174-12.018362c-5.66126 0-10.42647 3.844272-11.7705 9.064382v.1214c0 .32368.24437.56648.570196.56648h4.887394c.24437 0 .44801-.1214.52947-.3237 1.0182-2.18515 3.21753-3.68239 5.78344-3.68239 3.5026 0 6.3536 2.83262 6.3536 6.31269 0 3.4801-2.851 6.3127-6.3536 6.3127-2.56591 0-4.76524-1.4972-5.78344-3.6824-.08146-.2023-.2851-.3237-.52947-.3237h-4.887394c-.325826-.0405-.570196.2023-.570196.526v.1214c1.34403 5.2201 6.10924 9.0644 11.7705 9.0644 6.6794 0 12.0963-5.382 12.0963-12.0184 0-6.67688-5.4169-12.058862-12.0963-12.058862zm31.6458 14.851062h-1.6291c-.1222 0-.2036.0404-.2851.1214-.9367 1.4163-2.5659 2.347-4.3986 2.347-2.9732 0-5.3354-2.347-5.3354-5.3011 0-2.95398 2.4029-5.301 5.3354-5.301 1.8327 0 3.4619.93071 4.3986 2.34702.0815.08094.1629.1214.2851.1214h1.6291c.2037 0 .3666-.16186.3666-.36419 0-.04047 0-.1214-.0407-.16187-1.2219-2.42796-3.747-4.08706-6.6387-4.08706-4.1136 0-7.4533 3.31821-7.4533 7.4053 0 4.168 3.3397 7.4457 7.4533 7.4457 2.8917 0 5.4168-1.6591 6.6387-4.087.0407-.0405.0407-.081.0407-.1619 0-.1619-.1629-.3237-.3666-.3237zm4.9689-12.70636c0 .76885-.6517 1.41631-1.4255 1.41631s-1.4255-.64746-1.4255-1.41631c0-.76886.6517-1.41631 1.4255-1.41631.8146.04046 1.4255.64745 1.4255 1.41631zm-.3258 16.59106v-13.75844h-2.1179v13.75844c0 .2023.1629.3642.3665.3642h1.4255c.163 0 .3259-.1619.3259-.3642zm9.2046-14.08217c-2.1586.08093-3.8692 1.13305-4.9689 2.67076v-1.98284c0-.20233-.1629-.36419-.3665-.36419h-1.4255c-.2037 0-.3666.16186-.3666.36419v13.39425c0 .2023.1629.3642.3666.3642h1.4255c.2036 0 .3665-.1619.3665-.3642v-6.7174c0-2.79211 2.1993-5.09867 4.9689-5.26054.2036 0 .3665-.16186.3665-.36419v-1.41631c0-.16187-.1629-.32373-.3665-.32373zm14.1734 10.19747h-1.6291c-.1222 0-.2037.0404-.2851.1214-.9368 1.4163-2.5659 2.347-4.3987 2.347-2.9324 0-5.3354-2.3875-5.3354-5.3011 0-2.91351 2.403-5.301 5.3354-5.301 1.8328 0 3.4619.93071 4.3987 2.34702.0814.08094.1629.1214.2851.1214h1.6291c.2036 0 .3666-.16186.3666-.36419 0-.04047-.0001-.1214-.0408-.16187-1.2218-2.42796-3.747-4.08706-6.6387-4.08706-4.1135 0-7.4533 3.31821-7.4533 7.4053 0 4.087 3.3398 7.4053 7.4533 7.4053 2.8917 0 5.4169-1.6592 6.6387-4.0871.0407-.0405.0408-.0809.0408-.1619-.0408-.1214-.163-.2832-.3666-.2832zm4.2357-14.4464h-1.4254c-.2037 0-.3666.16186-.3666.36419v18.00741c0 .2023.1629.3642.3666.3642h1.4254c.2037 0 .3666-.1619.3666-.3642v-18.00741c0-.20233-.1629-.36419-.3666-.36419zm9.9377 4.20846c-4.1135 0-7.4532 3.31822-7.4532 7.40524 0 4.0871 3.3397 7.4053 7.4532 7.4053 2.8917 0 5.4169-1.6591 6.6387-4.087.0408-.0405.0408-.081.0408-.1619 0-.2023-.1629-.3642-.3666-.3642h-1.6291c-.1222 0-.2036.0405-.2851.1619-.9775 1.4163-2.5659 2.3065-4.3987 2.3065-2.688 0-4.9281-1.9828-5.2946-4.5726h12.3814c.2036 0 .3258-.1619.3665-.3238 0-.1214 0-.2428 0-.3642 0-4.08702-3.3397-7.40524-7.4533-7.40524zm-5.1317 6.02944c.6109-2.22563 2.688-3.88474 5.1317-3.88474s4.5209 1.65911 5.1318 3.88474zm33.2339-10.602096c-1.181 0-2.118.930716-2.118 2.104236 0 1.17351.937 2.10423 2.118 2.10423s2.118-.93072 2.118-2.10423c0-1.13305-.937-2.104236-2.118-2.104236zm1.752 4.936856v13.75844c0 .2023-.163.3642-.367.3642h-2.851c-.204 0-.366-.1619-.366-.3642v-13.75844zm-12.789 14.44634c3.462 0 6.394-2.3875 7.209-5.5843 0-.0405 0-.0405 0-.0809 0-.2023-.163-.3642-.367-.3642h-3.014c-.162 0-.285.0809-.325.2023-.611 1.3354-1.955 2.2661-3.544 2.2661-2.158 0-3.9097-1.74-3.9097-3.8847s1.7517-3.88476 3.9097-3.88476c1.589 0 2.933.93072 3.544 2.26606.04.1214.163.2024.325.2024h3.014c.204 0 .367-.1619.367-.3642 0-.0405 0-.0405 0-.081-.815-3.19677-3.747-5.58427-7.209-5.58427-4.1136 0-7.4533 3.31821-7.4533 7.40527 0 4.2085 3.3397 7.4862 7.4533 7.4862z" fill="currentColor"/></svg>
|
||
<div class="text-h4 leading-none pb-0.5">
|
||
Blog
|
||
</div>
|
||
</a>
|
||
|
||
<div class="blog-nav--list blog-nav--external-links flex items-center">
|
||
<a
|
||
href="https://circleci.com/"
|
||
data-analytics-action="clicked-blog-top-nav"
|
||
data-analytics-properties='{ "menu": "blog-nav", "cta_text": "circleci.com" }'
|
||
class="group/link hidden md:block max-w-max w-max shrink-0 px-3 py-6 text-[15px] hover:text-slime-650 transition-colors duration-300"
|
||
>CircleCI</a>
|
||
<a
|
||
href="https://circleci.com/docs/"
|
||
data-analytics-action="clicked-blog-top-nav"
|
||
data-analytics-properties='{ "menu": "blog-nav", "cta_text": "documentation" }'
|
||
class="group/link hidden md:block max-w-max w-max shrink-0 px-3 py-6 text-[15px] hover:text-slime-650 transition-colors duration-300"
|
||
data-js-id="lang-blur-prev"
|
||
>Documentation</a>
|
||
<div class="hidden sm:block group/menu h-18">
|
||
<button
|
||
class="h-full px-3 focus:outline-none focus:outline-0 focus:outline-offset-0 group-hover/menu:text-slime-650 group-focus-within/menu:text-slime-650 transition-colors duration-300"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "top nav", "category": "search", "page_location": "mega menu - search" }'
|
||
onclick="toggleMenu('search')"
|
||
>
|
||
<svg fill="none" height="18" viewBox="0 0 18 18" width="18" xmlns="http://www.w3.org/2000/svg"><g stroke="currentColor" stroke-width="1.6"><circle cx="7.76908" cy="7.15385" r="6.15385"/><path d="m12.0771 12.0769 4.9231 4.9231"/></g></svg>
|
||
<span class="sr-only">
|
||
Search CircleCI blog
|
||
</span>
|
||
</button>
|
||
</div>
|
||
<div class="relative group/menu h-18">
|
||
<button
|
||
class="h-full px-3 [@media(hover:hover)]:pointer-events-none focus:outline-none"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "top nav", "category": "language", "page_location": "mega menu - language", "cta_text": "choose language" }'
|
||
onclick="toggleMenu('menu-lang', true)"
|
||
>
|
||
<div class="h-full py-6 border-y-2 border-transparent group-hover/menu:text-slime-650 group-focus-within/menu:text-slime-650 transition-colors duration-300">
|
||
<svg fill="none" height="18" viewBox="0 0 18 18" width="18" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" stroke-miterlimit="10" stroke-width="1.25"><path d="m8.9991 17.3078c4.5882 0 8.3077-3.7195 8.3077-8.30772s-3.7195-8.307697-8.3077-8.307697c-4.58821 0-8.307694 3.719477-8.307694 8.307697s3.719484 8.30772 8.307694 8.30772z"/><path d="m8.99853 17.3078c1.76387 0 3.19387-3.7195 3.19387-8.30772s-1.43-8.307697-3.19387-8.307697c-1.76391 0-3.19384 3.719477-3.19384 8.307697s1.42993 8.30772 3.19384 8.30772z"/><path d="m.691406 6.44287h16.615394"/><path d="m.691406 11.5567h16.615394"/></g></svg>
|
||
<span class="sr-only">Select Language</span>
|
||
</div>
|
||
</button>
|
||
<div
|
||
class="hidden group-hover/menu:block open:block absolute w-max pt-2 top-full left-1/2 -translate-x-1/2 z-20"
|
||
data-js-id="menu-lang"
|
||
>
|
||
<div
|
||
data-analytics-scroll
|
||
data-analytics-action=""
|
||
data-analytics-properties='{ "location": "top nav", "category": "language", "page_location": "mega menu - language" }'
|
||
></div>
|
||
<div class="bg-white rounded-2xl shadow-md flex flex-col gap-1 p-2">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<a
|
||
href="#main"
|
||
hreflang="en"
|
||
class="hover:bg-morph-fog p-2 pr-3 rounded-lg leading-tight border border-blue-400 "
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "top nav", "category": "language", "page_location": "language - english" }'
|
||
>English</a>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<a
|
||
href="https://circleci.com/ja/blog/jan-4-2023-incident-report/"
|
||
hreflang="ja"
|
||
class="hover:bg-morph-fog p-2 pr-3 rounded-lg leading-tight "
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "top nav", "category": "language", "page_location": "language - japan" }'
|
||
>日本語</a>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<a
|
||
href="https://app.circleci.com/signup"
|
||
class="hidden md:block text-base leading-5 button-base button-primary on-light ml-3"
|
||
data-analytics-action="clicked-blog-top-nav"
|
||
data-analytics-properties='{ "menu": "blog-nav", "cta_text": "signup_button" }'
|
||
>
|
||
Sign up
|
||
</a>
|
||
<button
|
||
class="relative group/menu py-7 px-3 md:hidden"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "top nav", "category": "mobile menu" }'
|
||
onclick="openMenu('mobile')"
|
||
>
|
||
<div
|
||
class="w-5 h-4 flex flex-col justify-between items-stretch group-hover/menu:text-slime-650 group-focus-within/menu:text-slime-650 transition-colors duration-300"
|
||
data-analytics-scroll
|
||
data-analytics-action=""
|
||
data-analytics-properties='{ "location": "top nav", "category": "hamburger" }'
|
||
>
|
||
<div class="h-0.5 bg-current"></div>
|
||
<div class="h-0.5 bg-current"></div>
|
||
<div class="h-0.5 bg-current"></div>
|
||
<span class="sr-only">Toggle navigation</span>
|
||
</div>
|
||
</button>
|
||
</div>
|
||
</nav>
|
||
</div>
|
||
<div class="absolute left-0 right-0 w-full overflow-x-hidden h-screen top-0 pointer-events-none">
|
||
<div data-dialog-type="menu" data-js-id="mobile" class="group/mobile hidden open:block lg:open:hidden bg-white absolute inset-0 w-full h-full max-h-screen backdrop:hidden open:animate-slide-in overflow-hidden pointer-events-auto overflow-y-auto">
|
||
<div class="sticky px-8 top-0 z-10 flex justify-between items-center -mr-2 bg-white">
|
||
<div></div>
|
||
<button
|
||
class="px-3 py-7"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "top nav", "category": "close", "page_location": "mega menu - mobile" }'
|
||
onclick="closeAllMenus()"
|
||
>
|
||
<div class="w-5 h-4 flex flex-col justify-between items-stretch">
|
||
<div class="h-0.5 bg-current -rotate-45 origin-right"></div>
|
||
<div class="h-0.5 bg-current rotate-45 origin-right"></div>
|
||
<span class="sr-only">close</span>
|
||
</div>
|
||
</button>
|
||
</div>
|
||
<div
|
||
data-analytics-scroll
|
||
data-analytics-action=""
|
||
data-analytics-properties='{ "location": "top nav", "category": "mobile", "page_location": "mega menu - mobile" }'
|
||
></div>
|
||
<div class="px-8 py-6 h-[calc(100vh-72px)] overflow-y-auto space-y-6 transition-all opacity-0 translate-x-3 group-data-[animation-state=done]/mobile:translate-x-0 group-data-[animation-state=done]/mobile:opacity-100 duration-100 ease-in-out">
|
||
<div class="pb-6">
|
||
<h2 class="mb-5 pl-2 font-light text-small text-neutral-400">Site</h2>
|
||
<div class="flex flex-col gap-1.5">
|
||
<a
|
||
href="https://circleci.com/"
|
||
class="flex gap-3 text-[20px] font-medium p-2 hover:bg-morph-fog rounded-lg group/link"
|
||
data-analytics-action="clicked-blog-top-nav"
|
||
data-analytics-properties='{ "menu": "blog-category", "cta_text": "CircleCI" }'
|
||
><div class="rounded-lg border bg-neutral-40 border-neutral-80 inline-block p-1 max-h-8.5"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M9.82123 11.9849C9.82123 10.8051 10.8042 9.83699 12.0021 9.83699C13.2001 9.83699 14.183 10.8051 14.183 11.9849C14.183 13.1647 13.2001 14.1328 12.0021 14.1328C10.7734 14.1328 9.82123 13.195 9.82123 11.9849ZM12.0021 3C7.7325 3 4.13865 5.87396 3.125 9.77648V9.86723C3.125 10.1092 3.3093 10.2907 3.55503 10.2907H7.24104C7.42534 10.2907 7.57892 10.2 7.64036 10.0487C8.40827 8.41513 10.067 7.2958 12.0021 7.2958C14.6438 7.2958 16.7939 9.41344 16.7939 12.0151C16.7939 14.6168 14.6438 16.7344 12.0021 16.7344C10.067 16.7344 8.40827 15.6152 7.64036 13.9815C7.57892 13.8303 7.42534 13.7395 7.24104 13.7395H3.55503C3.3093 13.7092 3.125 13.8908 3.125 14.1328V14.2235C4.13865 18.126 7.7325 21 12.0021 21C17.0397 21 21.125 16.9765 21.125 12.0151C21.125 7.02353 17.0397 3 12.0021 3Z" fill="currentColor"/>
|
||
</svg>
|
||
</div>
|
||
<div class="flex items-center pt-0.5 gap-3">CircleCI</div></a>
|
||
<a
|
||
href="https://circleci.com/docs/"
|
||
class="flex gap-3 text-[20px] font-medium p-2 hover:bg-morph-fog rounded-lg group/link"
|
||
data-analytics-action="clicked-blog-top-nav"
|
||
data-analytics-properties='{ "menu": "blog-category", "cta_text": "documentation" }'
|
||
>
|
||
<div class="rounded-lg border bg-neutral-40 border-neutral-80 inline-block p-1 max-h-8.5"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 4C4 2.89543 4.89321 2 5.99778 2H13C13.7756 2 14.1862 2.22592 14.3721 2.37404C14.4358 2.42476 14.4916 2.48428 14.5474 2.54381C14.5738 2.57201 14.6002 2.60022 14.6275 2.62749L19.5 7.5C19.5 7.5 20 8 20 9V20.0032C20 21.1078 19.1046 22 18 22H6C4.89543 22 4 21.1046 4 20V4ZM6 5C6 4.44772 6.44712 4 6.9994 4H13C13.4129 4 13.6869 4.21016 13.8065 4.32581C13.8377 4.35602 13.8667 4.38832 13.8958 4.42064C13.9118 4.43848 13.9278 4.45633 13.9442 4.47383L17.4837 8.24925C17.5144 8.28202 17.5466 8.31366 17.5787 8.34529C17.6449 8.41041 17.7112 8.47556 17.765 8.55076C17.8715 8.69969 18 8.96868 18 9.4V19.0036C18 19.5559 17.5523 20 17 20H7C6.44772 20 6 19.5523 6 19V5ZM15.5 18C15.7761 18 16 17.7761 16 17.5V16.5C16 16.2239 15.7761 16 15.5 16H8.5C8.22386 16 8 16.2239 8 16.5V17.5C8 17.7761 8.22386 18 8.5 18H15.5ZM16 13.5C16 13.7761 15.7761 14 15.5 14H8.5C8.22386 14 8 13.7761 8 13.5V12.5C8 12.2239 8.22386 12 8.5 12H15.5C15.7761 12 16 12.2239 16 12.5V13.5ZM12 9.5C12 9.77614 12.2239 10 12.5 10H16.2929C16.7383 10 16.9614 9.46143 16.6464 9.14645L12.8536 5.35355C12.5386 5.03857 12 5.26165 12 5.70711V9.5Z" fill="currentColor"/>
|
||
</svg>
|
||
</div>
|
||
<div class="flex items-center pt-0.5 gap-3">
|
||
Documentation
|
||
</div>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
<div class="pb-6">
|
||
<h2 class="mb-5 pl-2 font-light text-small text-neutral-400">Blog</h2>
|
||
<div class="flex flex-col gap-1.5">
|
||
|
||
|
||
|
||
<a
|
||
href="/blog/tag/devops101/"
|
||
class="hover:bg-morph-fog flex gap-3 p-2 transition-colors duration-300 rounded-lg w-fit max-w-full items-center group/link"
|
||
data-analytics-action="clicked-blog-top-nav"
|
||
data-analytics-properties='{ "menu": "blog-category", "cta_text": "devops101" }'
|
||
>
|
||
DevOps 101
|
||
</a>
|
||
|
||
|
||
|
||
<a
|
||
href="/blog/tag/news/"
|
||
class="hover:bg-morph-fog flex gap-3 p-2 transition-colors duration-300 rounded-lg w-fit max-w-full items-center group/link"
|
||
data-analytics-action="clicked-blog-top-nav"
|
||
data-analytics-properties='{ "menu": "blog-category", "cta_text": "news" }'
|
||
>
|
||
CircleCI News
|
||
</a>
|
||
|
||
|
||
|
||
<a
|
||
href="/blog/tag/engineering-productivity/"
|
||
class="hover:bg-morph-fog flex gap-3 p-2 transition-colors duration-300 rounded-lg w-fit max-w-full items-center group/link"
|
||
data-analytics-action="clicked-blog-top-nav"
|
||
data-analytics-properties='{ "menu": "blog-category", "cta_text": "engineering-productivity" }'
|
||
>
|
||
Engineering Productivity
|
||
</a>
|
||
|
||
|
||
|
||
<a
|
||
href="/blog/tag/engineering-management/"
|
||
class="hover:bg-morph-fog flex gap-3 p-2 transition-colors duration-300 rounded-lg w-fit max-w-full items-center group/link"
|
||
data-analytics-action="clicked-blog-top-nav"
|
||
data-analytics-properties='{ "menu": "blog-category", "cta_text": "engineering-management" }'
|
||
>
|
||
Engineering Management
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
<div class="space-y-1.5">
|
||
|
||
<a
|
||
href="https://app.circleci.com/signup"
|
||
class="block text-[20px] font-medium p-2 hover:bg-morph-fog rounded-lg"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "top nav", "category": "signup" }'
|
||
>
|
||
<div class="flex gap-3">
|
||
Sign up
|
||
<div class="w-8 h-8 border flex items-center justify-center transition-colors button-primary on-light rounded-lg"><div class="arrow"></div></div>
|
||
</div>
|
||
</a>
|
||
|
||
<button
|
||
class="text-[20px] font-medium p-2 hover:bg-morph-fog rounded-lg flex gap-3 items-center w-full"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "top nav", "category": "search", "page_location": "mega menu - mobile" }'
|
||
onclick="openMenu('search')"
|
||
>
|
||
Search
|
||
<svg fill="none" height="18" viewBox="0 0 18 18" width="18" xmlns="http://www.w3.org/2000/svg"><g stroke="currentColor" stroke-width="1.6"><circle cx="7.76908" cy="7.15385" r="6.15385"/><path d="m12.0771 12.0769 4.9231 4.9231"/></g></svg>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div data-dialog-type="menu" data-js-id="search" class="hidden open:block bg-white lg:bg-transparent absolute inset-0 lg:top-18 bottom-auto lg:border-t border-t-morph-fog h-full max-h-screen lg:max-h-[calc(100vh-72px)] open:animate-slide-in lg:open:animate-none overflow-hidden pointer-events-auto overflow-y-auto">
|
||
<button onclick="closeAllMenus()" class="hidden lg:block w-full absolute z-0 inset-0 h-full cursor-default"></button>
|
||
<div class="sticky px-8 top-0 z-10 flex justify-between items-center -mr-2 bg-white lg:hidden">
|
||
<button
|
||
class="px-3 py-7"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "top nav", "category": "back", "page_location": "mega menu - search" }'
|
||
onclick="closeMenu('search')"
|
||
>
|
||
<div class="arrow-left"></div>
|
||
<div class="sr-only">Back</div>
|
||
</button>
|
||
<div class="text-[20px] font-medium">Search</div>
|
||
<button
|
||
class="px-3 py-7"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "top nav", "category": "close", "page_location": "mega menu - search" }'
|
||
onclick="closeAllMenus()"
|
||
>
|
||
<div class="w-5 h-4 flex flex-col justify-between items-stretch">
|
||
<div class="h-0.5 bg-current -rotate-45 origin-right"></div>
|
||
<div class="h-0.5 bg-current rotate-45 origin-right"></div>
|
||
<span class="sr-only">close</span>
|
||
</div>
|
||
</button>
|
||
</div>
|
||
<div
|
||
data-analytics-scroll
|
||
data-analytics-action=""
|
||
data-analytics-properties='{ "location": "top nav", "category": "search", "page_location": "mega menu - search" }'
|
||
></div>
|
||
<div class="bg-white w-full relative lg:shadow-md">
|
||
<div class="w-full 2xl:container mx-auto py-12 px-8 lg:p-16">
|
||
<div class="flex justify-between">
|
||
<div id="searchbox" class="relative flex items-center gap-2.5 border border-morph-vapor focus-within:border-morph-terminal rounded-full p-3 mb-4 sm:mb-10 w-full sm:w-3/4 lg:w-1/2 leading-4"></div>
|
||
<button
|
||
class="w-4 h-4 mt-3 relative hidden lg:block"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "top nav", "category": "search", "page_location": "mega menu - search", "cta_text": "close" }'
|
||
onclick="closeAllMenus()"
|
||
>
|
||
<div class="w-5 h-4 flex flex-col justify-between items-stretch">
|
||
<div class="h-0.5 bg-current -rotate-45 origin-right"></div>
|
||
<div class="h-0.5 bg-current rotate-45 origin-right"></div>
|
||
<span class="sr-only">close</span>
|
||
</div>
|
||
</button>
|
||
</div>
|
||
<div data-js-id="search-results" data-active-index="blog" class="group/index sm:mt-9 flex gap-6 sm:gap-8 flex-col sm:flex-row">
|
||
<div class="w-full sm:w-9/12 md:w-10/12 xl:w-7/12">
|
||
<a data-js-id="scroll-target" class="absolute -mt-24 lg:-mt-9"></a>
|
||
<div class="hidden group-data-[active-index=blog]/index:block">
|
||
<div class="flex gap-2 items-center mb-8">
|
||
<div class="type-h4">Results</div>
|
||
<div class="text-[10px] text-morph-terminal bg-neutral-40 border-neutral-80 border rounded-2xl py-0.5 px-1 inline-block" data-js-id="stats-h4-blog"></div>
|
||
</div>
|
||
<div data-js-id="hits-blog"></div>
|
||
<div data-js-id="pagination-blog" class="mt-8"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<main id="main" data-js-id="mobile-blur-next">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div data-js-id="infinite-observer">
|
||
<article data-js-id="blog-post" class="bg-white overflow-hidden">
|
||
|
||
<script>
|
||
(function () {
|
||
window.analyticsPageProperties = window.analyticsPageProperties || {};
|
||
window.analyticsPageProperties.pageProps = window.analyticsPageProperties.pageProps || {};
|
||
|
||
var props = window.analyticsPageProperties.pageProps;
|
||
|
||
props["blog_slug"] = "jan-4-2023-incident-report"; // YYYY-MM-DD
|
||
props["blog_publish_date"] = "2023-01-12"; // YYYY-MM-DD
|
||
props["blog_publish_year"] = "2023"; // Year
|
||
props["blog_publish_month"] = "01"; // Month [01, 02, 03…]
|
||
props["blog_publish_weekday"] = "Thursday"; // Day of week [Monday, Tuesday, Wednesday, etc]
|
||
props["blog_primary_tag"] = "news"; // primary tag (first in list)
|
||
props["blog_author"] = "rob-zuber"; // author database key
|
||
props["blog_additional_authors"] = null; // secondary author IDs
|
||
props["blog_all_tags"] = ["news","security"]; // list/array of all tags on a particular post, including primary tag.
|
||
props["blog_estimated_reading_time"] = 13; // estimated reading time in minutes
|
||
props["blog_author_type"] = "employee"; // enum: [guest writer, employee]
|
||
props["blog_source"] = "contentful"; // enum: [contentful, github]
|
||
props["blog_type"] = null; // enum: [awareness, conversion]
|
||
|
||
window.analyticsPageProperties.pageProps = props;
|
||
|
||
window.postRecUrls = ['/blog/circleci-cursor-origin/','/blog/smarter-testing-stop-running-tests-that-dont-matter/','/blog/five-takeaways-2026-q2-pulse/','/blog/five-takeaways-2026-software-delivery-report/','/blog/sign-oci-containers-and-other-artifacts-using-sigstore-cosign/','/blog/smarter-testing/','/blog/introducing-chunk/','/blog/platform-toolkit/','/blog/supercharge-your-ios-and-macos-development-circleci-offers-m4-pro-resources/','/blog/circleci-mcp-server/'];
|
||
})();
|
||
</script>
|
||
|
||
<header class="bg-morph-fog relative">
|
||
<div class="bg-white w-full h-15 absolute bottom-0 left-0 right-0 z-0"></div>
|
||
<div class="2xl:container mx-auto px-8 lg:px-16 pt-16 flex gap-8">
|
||
<div class="hidden lg:block w-1/12 2xl:w-2/12"></div>
|
||
<div class="w-full lg:w-11/12 mx-auto 2xl:ml-auto 2xl:mr-0">
|
||
<div class="w-full mb-6 overflow-hidden">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/blog/tag/news/" class="text-blue-500 font-medium mr-6 transition-colors duration-300">CircleCI News</a><span class="text-nowrap relative before:absolute before:h-4 before:bg-neutral-300 before:w-px before:-left-3 before:block before:top-0.5 mr-6">Jan 12, 2023</span><span class="text-nowrap relative before:absolute before:h-4 before:bg-neutral-300 before:w-px before:-left-3 before:block before:top-0.5">13 min read</span>
|
||
</div>
|
||
<h1 class="type-h2 text-morph-terminal mb-3 text-balance">CircleCI Jan 4, 2023 security incident report</h1>
|
||
<div class="flex flex-col md:flex-row gap-y-8 gap-x-12 md:items-center w-full">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="flex gap-4 ">
|
||
<div class="rounded-full overflow-hidden w-10 h-10 shrink-0">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<picture>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="//images.ctfassets.net/il1yandlcjgk/3vOSw572RqVIbQyyiqM2il/2401826fdc85b55b91a5d2a6fac1a5ef/rob.jpg?w=50&fm=webp&q=75 1x, //images.ctfassets.net/il1yandlcjgk/3vOSw572RqVIbQyyiqM2il/2401826fdc85b55b91a5d2a6fac1a5ef/rob.jpg?w=100&fm=webp&q=60 2x, //images.ctfassets.net/il1yandlcjgk/3vOSw572RqVIbQyyiqM2il/2401826fdc85b55b91a5d2a6fac1a5ef/rob.jpg?w=150&fm=webp&q=45 3x"
|
||
media="(min-width: 0px)"
|
||
/>
|
||
|
||
|
||
<img
|
||
src="//images.ctfassets.net/il1yandlcjgk/3vOSw572RqVIbQyyiqM2il/2401826fdc85b55b91a5d2a6fac1a5ef/rob.jpg?w=50&fm=webp&q=60"
|
||
alt="Rob Zuber"
|
||
class=""
|
||
/>
|
||
</picture>
|
||
</div>
|
||
<div class="media-body media-middle">
|
||
<p class="post-author-name">
|
||
|
||
<a href="/blog/author/rob-zuber/" class="hover:text-slime-650">
|
||
Rob Zuber
|
||
</a>
|
||
|
||
</p>
|
||
|
||
<p class="text-small leading-tight">
|
||
Chief Technology Officer
|
||
</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="2xl:container mx-auto px-8 lg:px-16 flex gap-8">
|
||
<div class="hidden lg:block w-1/12 2xl:w-2/12"></div>
|
||
<div class="w-full lg:w-10/12 2xl:w-8/12 relative mt-14">
|
||
<div class="rounded-2xl w-full overflow-hidden h-0 bg-morph-vapor pt-[57%] relative">
|
||
<div class="w-[101%] h-full absolute top-0 left-0 -right-1 -bottom-0.5">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<picture>
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=840&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=1680&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=2520&fm=webp&q=45 3x"
|
||
media="(min-width: 1440px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=1037&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=2074&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=3111&fm=webp&q=45 3x"
|
||
media="(min-width: 1280px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=902&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=1804&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=2706&fm=webp&q=45 3x"
|
||
media="(min-width: 1024px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=969&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=1938&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=2907&fm=webp&q=45 3x"
|
||
media="(min-width: 768px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=710&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=1420&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=2130&fm=webp&q=45 3x"
|
||
media="(min-width: 640px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=581&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=1162&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=1743&fm=webp&q=45 3x"
|
||
media="(min-width: 0px)"
|
||
/>
|
||
|
||
|
||
<img
|
||
src="https://images.ctfassets.net/il1yandlcjgk/1yYERrcJtNkaXwiaLOBtRW/a7ac6b11a20e00ce472bc9a7a65735b3/rba-plain-logo-v3.jpg?w=1037&fm=webp&q=60"
|
||
alt="CircleCI logo against a gray and green background."
|
||
class="object-cover w-full h-full absolute inset-0"
|
||
/>
|
||
</picture>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="hidden lg:block w-1/12 2xl:w-2/12"></div>
|
||
</div>
|
||
</header>
|
||
<div class="2xl:container mx-auto px-8 lg:px-16 pt-8 flex gap-8">
|
||
<div class="hidden lg:block w-1/12 2xl:w-2/12"></div>
|
||
<div class="w-full lg:w-10/12 2xl:w-8/12 mx-auto flex flex-col sm:flex-row gap-y-14">
|
||
<div class="shrink-0 w-max">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div data-js-id="share-buttons" class="social-btns share-buttons w-max flex sm:flex-col gap-4 items-center pt-1.5">
|
||
<a href="https://twitter.com/intent/tweet?text=CircleCI%20Jan%204,%202023%20security%20incident%20report&url=https://circleci.com/blog/jan-4-2023-incident-report/?utm_source=twitter%26utm_medium=social-organic%26utm_campaign=social-share-blog&via=circleci&related=circleci&lang=en"
|
||
class="hover:text-slime-650"
|
||
rel="nofollow"
|
||
target="_blank"
|
||
title="Share on X"
|
||
data-js-id="popout"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "blog post", "category": "social share icon", "page_location": "twitter", "cta_text": "twitter" }'>
|
||
<svg width="24" height="24" viewBox="0 0 1200 1227" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z" fill="currentColor"/>
|
||
</svg>
|
||
<span class="sr-only">Share on X</span>
|
||
</a>
|
||
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https://circleci.com/blog/jan-4-2023-incident-report/"
|
||
class="hover:text-slime-650 "
|
||
rel="nofollow"
|
||
target="_blank"
|
||
title="Share on LinkedIn"
|
||
data-js-id="popout"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "blog post", "category": "social share icon", "page_location": "linkedin", "cta_text": "linkedin" }'>
|
||
<svg viewBox="0 0 448 512" width="24" height="24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="m416 32h-384.1c-17.6 0-31.9 14.5-31.9 32.3v383.4c0 17.8 14.3 32.3 31.9 32.3h384.1c17.6 0 32-14.5 32-32.3v-383.4c0-17.8-14.4-32.3-32-32.3zm-280.6 384h-66.4v-213.8h66.5v213.8zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5s17.2-38.5 38.5-38.5c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4v-104c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9v105.8h-66.4v-213.8h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg><span class="sr-only">Share on LinkedIn</span>
|
||
</a>
|
||
<a href="https://facebook.com/sharer.php?u=https://circleci.com/blog/jan-4-2023-incident-report/?utm_source=facebook%26utm_medium=social-organic%26utm_campaign=social-share-blog"
|
||
class="hover:text-slime-650 "
|
||
rel="nofollow"
|
||
target="_blank"
|
||
title="Share on Facebook"
|
||
data-js-id="popout"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "blog post", "category": "social share icon", "page_location": "facebook", "cta_text": "facebook" }'>
|
||
<svg viewBox="0 0 512 512" width="24" height="24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="m504 256c0-137-111-248-248-248s-248 111-248 248c0 123.78 90.69 226.38 209.25 245v-173.31h-63v-71.69h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73v46.55h68.78l-11 71.69h-57.78v173.31c118.56-18.62 209.25-121.22 209.25-245z"/></svg><span class="sr-only">Share on Facebook</span>
|
||
</a>
|
||
|
||
|
||
<a href="http://www.reddit.com/submit?title=CircleCI%20Jan%204,%202023%20security%20incident%20report&url=https://circleci.com/blog/jan-4-2023-incident-report/?utm_source=reddit%26utm_medium=social-organic%26utm_campaign=social-share-blog"
|
||
class="hover:text-slime-650"
|
||
rel="nofollow"
|
||
target="_blank"
|
||
title="Share on Reddit"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "blog post", "category": "social share icon", "page_location": "reddit", "cta_text": "reddit" }'>
|
||
<svg viewBox="0 0 512 512" width="24" height="24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="m201.5 305.5c-13.8 0-24.9-11.1-24.9-24.6 0-13.8 11.1-24.9 24.9-24.9 13.6 0 24.6 11.1 24.6 24.9 0 13.6-11.1 24.6-24.6 24.6zm302.5-49.5c0 137-111 248-248 248s-248-111-248-248 111-248 248-248 248 111 248 248zm-132.3-41.2c-9.4 0-17.7 3.9-23.8 10-22.4-15.5-52.6-25.5-86.1-26.6l17.4-78.3 55.4 12.5c0 13.6 11.1 24.6 24.6 24.6 13.8 0 24.9-11.3 24.9-24.9s-11.1-24.9-24.9-24.9c-9.7 0-18 5.8-22.1 13.8l-61.2-13.6c-3-.8-6.1 1.4-6.9 4.4l-19.1 86.4c-33.2 1.4-63.1 11.3-85.5 26.8-6.1-6.4-14.7-10.2-24.1-10.2-34.9 0-46.3 46.9-14.4 62.8-1.1 5-1.7 10.2-1.7 15.5 0 52.6 59.2 95.2 132 95.2 73.1 0 132.3-42.6 132.3-95.2 0-5.3-.6-10.8-1.9-15.8 31.3-16 19.8-62.5-14.9-62.5zm-68.9 116.2c-18.2 18.2-76.1 17.9-93.6 0-2.2-2.2-6.1-2.2-8.3 0-2.5 2.5-2.5 6.4 0 8.6 22.8 22.8 87.3 22.8 110.2 0 2.5-2.2 2.5-6.1 0-8.6-2.2-2.2-6.1-2.2-8.3 0zm7.7-75c-13.6 0-24.6 11.1-24.6 24.9 0 13.6 11.1 24.6 24.6 24.6 13.8 0 24.9-11.1 24.9-24.6 0-13.8-11-24.9-24.9-24.9z"/></svg><span class="sr-only">Share on Reddit</span>
|
||
</a>
|
||
<a href="http://news.ycombinator.com/submitlink?t=CircleCI%20Jan%204,%202023%20security%20incident%20report&u=https://circleci.com/blog/jan-4-2023-incident-report/?utm_source=hacker%20news%26utm_medium=social-organic%26utm_campaign=social-share-blog"
|
||
class="hover:text-slime-650"
|
||
rel="nofollow"
|
||
target="_blank"
|
||
title="Share on Hacker News"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "blog post", "category": "social share icon", "page_location": "hacker-news", "cta_text": "hacker-news" }'>
|
||
<svg viewBox="0 0 448 512" width="24" height="24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="m0 32v448h448v-448zm21.2 197.2h-.2c.1-.1.2-.3.3-.4 0 .1 0 .3-.1.4zm218 53.9v100.9h-31.4v-102.7l-79.8-153.3h37.3c52.5 98.3 49.2 101.2 59.3 125.6 12.3-27 5.8-24.4 60.6-125.6h34.8z"/></svg><span class="sr-only">Share on Hacker News</span>
|
||
</a>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
<div class="w-full sm:px-14 shrink pb-20">
|
||
<div data-js-id="post-content" class="prose">
|
||
|
||
<p><a href="https://circleci.com/blog/january-4-2023-security-alert/">On January 4, 2023, we alerted customers</a> to a security incident. Today, we want to share with you what happened, what we’ve learned, and what our plans are to continuously improve our security posture for the future.</p>
|
||
|
||
<p>We would like to thank our customers for your attention to rotating and revoking secrets, and apologize for any disruption this incident may have caused to your work. We encourage customers who have yet to take action to do so in order to prevent unauthorized access to third-party systems and stores. Additionally, we want to thank our customers and our community for your patience while we have been conducting a thorough investigation. In aiming for responsible disclosure, we have done our best to balance speed in sharing information with maintaining the integrity of our investigation.</p>
|
||
|
||
<p><strong>This report will cover:</strong></p>
|
||
<ul>
|
||
<li><a href="#what-happened">What happened?</a></li>
|
||
<li><a href="#how-do-we-know-this-attack-vector-is-closed-and-its-safe-to-build">How do we know this attack vector is closed and it’s safe to build?</a></li>
|
||
<li><a href="#communication-and-support-for-customers">Communication and support for customers</a></li>
|
||
<li><a href="#how-do-i-know-if-i-was-impacted">How do I know if I was impacted?</a></li>
|
||
<li><a href="#details-that-may-help-your-team-with-internal-investigations">Details that may help your team with internal investigations</a></li>
|
||
<li><a href="#what-we-learned-from-this-incident-and-what-we-will-do-next">What we learned from this incident and what we will do next</a></li>
|
||
<li><a href="#a-note-on-employee-responsibility-vs-systems-safeguards">A note on employee responsibility vs. systems safeguards</a></li>
|
||
<li><a href="#security-best-practices">Security best practices</a></li>
|
||
<li><a href="#closing-thoughts">Closing thoughts</a></li>
|
||
</ul>
|
||
|
||
<p><a name="what-happened" class="deep-link-anchor"></a></p>
|
||
<h2>What happened?</h2>
|
||
|
||
<p><i>All dates and times are reported in UTC, unless otherwise noted.</i></p>
|
||
|
||
<p>On December 29, 2022, we were alerted to suspicious GitHub OAuth activity by one of our customers. This notification kicked off a deeper review by CircleCI’s security team with GitHub.</p>
|
||
|
||
<p>On December 30, 2022, we learned that this customer’s GitHub OAuth token had been compromised by an unauthorized third party. Although that customer was able to quickly resolve the issue, out of an abundance of caution, on December 31, 2022, we proactively initiated the process of rotating all GitHub OAuth tokens on behalf of our customers. Despite working with GitHub to increase API rate limits, the rotation process took time. While it was not clear at this point whether other customers were impacted, we continued to expand the scope of our analysis.</p>
|
||
|
||
<p>By January 4, 2023, our internal investigation had determined the scope of the intrusion by the unauthorized third party and the entry path of the attack. To date, we have learned that an unauthorized third party leveraged malware deployed to a CircleCI engineer’s laptop in order to steal a valid, 2FA-backed SSO session. This machine was compromised on December 16, 2022. The malware was not detected by our antivirus software. Our investigation indicates that the malware was able to execute session cookie theft, enabling them to impersonate the targeted employee in a remote location and then escalate access to a subset of our production systems.</p>
|
||
|
||
<p>Because the targeted employee had privileges to generate production access tokens as part of the employee’s regular duties, the unauthorized third party was able to access and exfiltrate data from a subset of databases and stores, including customer environment variables, tokens, and keys. We have reason to believe that the unauthorized third party engaged in reconnaissance activity on December 19, 2022. On December 22, 2022, exfiltration occurred, and that is our last record of unauthorized activity in our production systems. Though all the data exfiltrated was encrypted at rest, the third party extracted encryption keys from a running process, enabling them to potentially access the encrypted data.</p>
|
||
|
||
<p>While we are confident in the findings of our internal investigation, we have engaged third-party cyber security specialists to assist in our investigation and to validate our findings. Our findings to date are based on analyses of our authentication, network, and monitoring tools, as well as system logs and log analyses provided by our partners.</p>
|
||
|
||
<p>In response to this incident, we took the following actions:</p>
|
||
|
||
<ul>
|
||
<li>On January 4, 2023, at 16:35 UTC, we shut down all access for the employee whose account was compromised.</li>
|
||
<li>On January 4, 2023, at 18:30 UTC, we shut down production access to nearly all employees, limiting access to an extremely small group for operational issues. At no time during this investigation did we have any evidence that the credentials of any other employees or their devices had been compromised, but we took this action in order to limit the potential surface area.</li>
|
||
<li>On January 4, 2023, at 22:30 UTC, we rotated all potentially exposed production hosts to ensure clean production machines.</li>
|
||
<li>On January 5, 2023, at 03:26 UTC, we revoked all Project API Tokens.</li>
|
||
<li>On January 6, 2023, at 05:00 UTC, we revoked all Personal API Tokens that had been created prior to 00:00 UTC on January 5, 2023.</li>
|
||
<li>On January 6, 2023, at 06:40 UTC we began work with our partners at Atlassian to rotate all Bitbucket tokens on behalf of our customers. This work was completed on January 6, 2023, at 10:15 UTC.</li>
|
||
<li>On January 7, 2023, at 07:30 UTC, we completed the rotation of GitHub OAuth tokens that we began on December 31, 2022, at 04:00 UTC.</li>
|
||
<li>On January 7, 2023, at 18:30 UTC, we began working with our partners at AWS to notify customers of potentially affected AWS tokens. We understand that those notifications were complete as of January 12, 2023, at 00:00 UTC.</li>
|
||
</ul>
|
||
|
||
<p>In the intervening time, we have continued our forensic investigation with the support of external investigators, rolled out additional layers of security on our platform, and built and distributed additional tools (more details below) to support our customers in securing their secrets.</p>
|
||
|
||
<p><a name="how-do-we-know-this-attack-vector-is-closed-and-its-safe-to-build" class="deep-link-anchor"></a></p>
|
||
<h2>How do we know this attack vector is closed and it’s safe to build?</h2>
|
||
|
||
<p>We are confident that customers can safely build on CircleCI.</p>
|
||
|
||
<p>We have taken many steps since becoming aware of this attack, both to close the attack vector and add additional layers of security, including the following:</p>
|
||
|
||
<ul>
|
||
<li>Added detection and blocking through our MDM and A/V solutions for the specific behaviors exhibited by the malware used in this attack.</li>
|
||
<li>Restricted access to production environments to a very limited number of employees as we implement additional security measures. We’re confident in our platform’s security, and we have no indication that any other employee’s device has been compromised.</li>
|
||
<li>For the employees who retain production access, we have added additional step-up authentication steps and controls. This will help us prevent possible unauthorized production access, even in the case of a stolen 2FA-backed SSO session.</li>
|
||
<li>Implemented monitoring and alerting for the specific behavior patterns we identified in this scenario, across multiple triggers and via a variety of third-party vendors.</li>
|
||
</ul>
|
||
|
||
<p>We know that security work is never done. In addition to closing this particular vector, we have also performed enhanced and ongoing reviews to ensure a stronger defense against potential attacks.</p>
|
||
|
||
<p><a name="communication-and-support-for-customers" class="deep-link-anchor"></a></p>
|
||
<h2>Communication and support for customers</h2>
|
||
|
||
<p>Upon completion of the rotation of all production hosts on January 4, 2023 at 22:30 UTC, we were confident that we had eliminated both the attack vector and the potential of a lingering corrupted host.</p>
|
||
|
||
<p>On January 4, 2023, at 6:30 PM PST / January 5, 2023, at 02:30 UTC, we sent disclosure emails, posted <a href="https://circleci.com/blog/january-4-2023-security-alert/">a security notification on our blog</a>, notified customers via our social media accounts and our <a href="https://discuss.circleci.com/t/circleci-security-alert-rotate-any-secrets-stored-in-circleci/46479">Discuss forum</a>, and created a <a href="https://support.circleci.com/articles/15091097-rotating-secrets-for-january-4th-incident">support article</a> on how to perform the recommended security steps.</p>
|
||
|
||
<p>We recommended that all customers rotate their secrets, including OAuth tokens, Project API Tokens, SSH keys, and more (see <a href="https://circleci.com/blog/january-4-2023-security-alert/">blog post</a> or <a href="https://discuss.circleci.com/t/circleci-security-alert-rotate-any-secrets-stored-in-circleci/46479">Discuss post</a> for more details).</p>
|
||
|
||
<p>This disclosure initiated an active and ongoing period of communication with our customers. We would like to thank our customers both for your concerted response to this incident as well as for helping us to identify opportunities to provide you with additional tooling. We took this feedback and in response built and released new tools and amended our existing tools to speed remediation for customers via the following:</p>
|
||
|
||
<ul>
|
||
<li>A <a href="https://github.com/CircleCI-Public/CircleCI-Env-Inspector" target="_blank" rel="noreferrer noopener">script for secret finding</a> in order to create an actionable list for secrets rotation.</li>
|
||
<li>Two key changes to the CircleCI API:
|
||
<ul>
|
||
<li>New functionality to return SHA-256 signatures for checkout keys in order to better match the GitHub UI.</li>
|
||
<li>The <code>updated_at</code> field was added to the Contexts API so that customers can verify the successful rotation of these variables.</li>
|
||
</ul>
|
||
</li>
|
||
<li>Audit logs were made accessible to all customers on both free and paid plans to help customers review CircleCI platform activity.</li>
|
||
</ul>
|
||
|
||
<p>We appreciate all feedback from customers about where we could improve our communications including opportunities to make the incident more visible across our channels.</p>
|
||
|
||
<p><a name="how-do-i-know-if-i-was-impacted" class="deep-link-anchor"></a></p>
|
||
<h2>How do I know if I was impacted?</h2>
|
||
|
||
<p><strong>Is my data at risk?</strong></p>
|
||
|
||
<p>In this incident, the unauthorized actor exfiltrated customer information on December 22, 2022, which included environment variables, keys, and tokens for third-party systems. If you stored secrets on our platform during this time period, assume they have been accessed and take the recommended mitigation steps. We recommend you investigate for suspicious activity in your system starting on December 16, 2022 and ending on the date you completed your secrets rotation after our disclosure on January 4, 2023. Anything entered into the system after January 5, 2023 can be considered secure.</p>
|
||
|
||
<p><strong>Did an unauthorized actor use that data to access any of my systems?</strong></p>
|
||
|
||
<p>Because this incident involved the exfiltration of keys and tokens for third-party systems, there is no way for us to know if your secrets were used for unauthorized access to those third-party systems. We have provided some details below to aid customers in their investigations.</p>
|
||
|
||
<p><strong>At the time of publishing, fewer than 5 customers have informed us of unauthorized access to third-party systems as a result of this incident.</strong></p>
|
||
|
||
<p><a name="details-that-may-help-your-team-with-internal-investigations" class="deep-link-anchor"></a></p>
|
||
<h2>Details that may help your team with internal investigations</h2>
|
||
|
||
<p>With the help of third-party forensic investigators, we have recently confirmed additional details that may help customers in their audits and investigations.</p>
|
||
|
||
<p><strong>Dates of impact:</strong></p>
|
||
<ul>
|
||
<li>We see unauthorized third-party access on December 19, 2022, with exfiltration of data occurring on December 22, 2022.</li>
|
||
<li>We have no evidence of customer-impacting activity prior to December 19, 2022. Out of an abundance of caution, we recommend you investigate the period between the date of corruption on December 16, 2022 through the date when you rotated your secrets following January 4, 2023 for unusual activity in your systems.</li>
|
||
</ul>
|
||
|
||
<p><strong>IP addresses identified as being used by the threat actor:</strong></p>
|
||
<ul>
|
||
<li>178.249.214.10</li>
|
||
<li>89.36.78.75</li>
|
||
<li>89.36.78.109</li>
|
||
<li>89.36.78.135</li>
|
||
<li>178.249.214.25</li>
|
||
<li>72.18.132.58</li>
|
||
<li>188.68.229.52</li>
|
||
<li>111.90.149.55</li>
|
||
</ul>
|
||
|
||
<p><strong>Data centers and VPN providers identified as being used by the threat actor:</strong></p>
|
||
<ul>
|
||
<li>Datacamp Limited</li>
|
||
<li>Globalaxs Quebec Noc</li>
|
||
<li>Handy Networks, LLC</li>
|
||
<li>Mullvad VPN</li>
|
||
</ul>
|
||
|
||
<p><strong>Malicious files to search for and remove:</strong></p>
|
||
<ul>
|
||
<li>/private/tmp/.svx856.log</li>
|
||
<li>/private/tmp/.ptslog</li>
|
||
<li>PTX-Player.dmg (SHA256: 8913e38592228adc067d82f66c150d87004ec946e579d4a00c53b61444ff35bf)</li>
|
||
<li>PTX.app</li>
|
||
</ul>
|
||
|
||
<p><strong>Block the following domain:</strong></p>
|
||
<ul>
|
||
<li>potrax[.]com</li>
|
||
</ul>
|
||
|
||
<p><strong>Review GitHub audit log files for unexpected commands such as:</strong></p>
|
||
<ul>
|
||
<li>repo.download_zip</li>
|
||
</ul>
|
||
|
||
<p><a name="what-we-learned-from-this-incident-and-what-we-will-do-next" class="deep-link-anchor"></a></p>
|
||
<h2>What we learned from this incident and what we will do next</h2>
|
||
|
||
<p><strong>We learned: While we have the tools in place to deter and detect attacks, there is always opportunity to strengthen our security posture.</strong><br />
|
||
The authentication, security, and tracing tools we had in place allowed us to comprehensively diagnose and remediate the issue. As the sophistication of malicious actors increases, we are continuously evolving our security standards and pushing best practices to stay ahead of future threats. We will be increasingly aggressive in our use of security tools. Going forward, to support a more conservative stance and preclude bad actors from improperly accessing our systems, we will be optimizing the configuration of our existing tools to create additional layers of defense.</p>
|
||
|
||
<p><strong>Our plan:</strong><br />
|
||
To start, we will initiate periodic automatic OAuth token rotation for all customers. Our plans also include a shift from OAuth to GitHub apps, enabling us to enforce more granular permissions within tokens. We also plan to complete a comprehensive analysis of all of our tooling configurations, including a third-party review. We’re continuing to take additional steps including expanding alerting, reducing session trust, adding additional authentication factors, and performing more regular access rotations. Finally, we will be making our system permissions more ephemeral, severely restricting the target value of any tokens gained from a similar incident.</p>
|
||
|
||
<p><strong>We learned: We can make it easier for customers to adopt our most advanced security features.</strong><br />
|
||
Through the evolution of CircleCI, we have continued to introduce features to improve the security of our customers’ build pipelines. While advanced security features are available to customers, we can do more to improve adoption of those features.</p>
|
||
|
||
<p><strong>Our plan:</strong><br />
|
||
It must be easier for customers to seamlessly adopt the latest and most advanced security features available, including OIDC and IP ranges. There are also additional proactive steps we are exploring, for example, automatic token expiration and notifications for unused secrets. We will make it simpler and more convenient for our customers to create and maintain highly secure pipelines, enabling every advantage of the cloud while smartly managing risk.</p>
|
||
|
||
<p><a name="a-note-on-employee-responsibility-vs-systems-safeguards" class="deep-link-anchor"></a></p>
|
||
<h2>A note on employee responsibility vs. systems safeguards</h2>
|
||
|
||
<p>We want to be clear. While one employee’s laptop was exploited through this sophisticated attack, a security incident is a systems failure. Our responsibility as an organization is to build layers of safeguards that protect against all attack vectors.</p>
|
||
|
||
<p><a name="security-best-practices" class="deep-link-anchor"></a></p>
|
||
<h2>Security best practices</h2>
|
||
|
||
<p>Given the increasing presence of highly sophisticated and motivated bad actors, we are committed to sharing best practices with our customers in order to strengthen our collective defense against inevitable future attempts. Here are recommendations customers can take to increase pipeline security:</p>
|
||
<ul>
|
||
<li>Use <a href="https://circleci.com/docs/openid-connect-tokens/">OIDC tokens</a> wherever possible to avoid storing long-lived credentials in CircleCI.</li>
|
||
<li>Take advantage of <a href="https://circleci.com/docs/ip-ranges/">IP ranges</a> to limit inbound connections to your systems to only known IP addresses.</li>
|
||
<li>Use <a href="https://circleci.com/docs/contexts/">Contexts</a> to consolidate shared secrets and restrict access to secrets to specific projects, which can then be <a href="https://circleci.com/docs/contexts/#rotating-environment-variables">rotated automatically via API</a>.</li>
|
||
<li>For privileged access and additional controls, you may choose to use <a href="https://circleci.com/docs/runner-overview/#circleci-runner-use-cases">runners</a>, which allow you to connect the CircleCI platform to your own compute and environments, including IP restrictions and IAM management.</li>
|
||
</ul>
|
||
|
||
<p><a name="closing-thoughts" class="deep-link-anchor"></a></p>
|
||
<h2>Closing thoughts</h2>
|
||
|
||
<p>We know there is no convenient time to respond to a security incident on a critical system, and we want to sincerely thank all of our customers who immediately took action following this incident. It is through this collective action that we will be in a stronger position to combat future threats. We also witnessed firsthand the strength and generosity of our customer community, with many of you heading to our <a href="https://discuss.circleci.com">Discuss forum</a> to share knowledge and help one another. Thank you for your support and patience as we worked to resolve this incident.</p>
|
||
|
||
</div>
|
||
|
||
<footer>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<ul class="post-tags flex flex-wrap gap-4 mt-8">
|
||
|
||
|
||
|
||
<li>
|
||
<a class="py-1.5 px-4 leading-none text-small border rounded-lg border-blue-500 whitespace-nowrap hover:bg-blue-500 hover:text-white focus:bg-blue-500 focus:text-white text-blue-500 transition-colors duration-300" href="/blog/tag/news/">
|
||
CircleCI News
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
<li>
|
||
<a class="py-1.5 px-4 leading-none text-small border rounded-lg border-blue-500 whitespace-nowrap hover:bg-blue-500 hover:text-white focus:bg-blue-500 focus:text-white text-blue-500 transition-colors duration-300" href="/blog/tag/security/">
|
||
Security
|
||
</a>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</footer>
|
||
</div>
|
||
</div>
|
||
<div class="relative hidden lg:block w-1/12 2xl:w-2/12 text-morph-fog">
|
||
<div class="absolute -top-12 left-4">
|
||
<svg width="480" height="480" viewBox="0 0 480 480" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path fill-rule="evenodd" clip-rule="evenodd" d="M240 464C240 472.837 232.837 480 224 480L135 480C126.164 480 119 472.837 119 464L119 376C119 367.163 111.837 360 103 360L16.0001 360C7.16358 360 0.000133187 352.837 0.00013396 344L0.00014174 255C0.000142513 246.163 7.1636 239 16.0001 239L104 239C112.837 239 120 231.837 120 223L120 136C120 127.163 127.164 120 136 120L240 120L343 120C351.837 120 359 112.837 359 104L359 16C359 7.16344 366.164 -9.9519e-06 375 -9.17938e-06L464 -1.39876e-06C472.837 -6.2624e-07 480 7.16345 480 16L480 105C480 113.837 472.837 121 464 121L376 121C367.164 121 360 128.163 360 137L360 224C360 232.837 352.837 240 344 240L240 240L137 240C128.164 240 121 247.163 121 256L121 343C121 351.837 128.164 359 137 359L224 359C232.837 359 240 366.163 240 375L240 464Z" fill="currentColor"/>
|
||
</svg>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<div class="bg-morph-fog py-18">
|
||
<div class="2xl:container mx-auto px-8 lg:px-16">
|
||
<h2 class="type-h2 text-morph-terminal mb-10">Similar posts you may enjoy</h2>
|
||
|
||
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8">
|
||
|
||
|
||
<a
|
||
href="/blog/circleci-cursor-origin/"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-location="resource item"
|
||
data-analytics-category="resources"
|
||
class="group bg-white rounded-2xl overflow-hidden flex flex-col items-stretch "
|
||
>
|
||
|
||
<div class="grow-0 w-full overflow-hidden h-0 bg-morph-vapor pt-[57%] relative">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<picture>
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=437&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=874&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=1311&fm=webp&q=45 3x"
|
||
media="(min-width: 1440px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=431&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=862&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=1293&fm=webp&q=45 3x"
|
||
media="(min-width: 1280px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=375&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=750&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=1125&fm=webp&q=45 3x"
|
||
media="(min-width: 1024px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=487&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=974&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=1461&fm=webp&q=45 3x"
|
||
media="(min-width: 768px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=353&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=706&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=1059&fm=webp&q=45 3x"
|
||
media="(min-width: 640px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=604&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=1208&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=1812&fm=webp&q=45 3x"
|
||
media="(min-width: 0px)"
|
||
/>
|
||
|
||
|
||
<img
|
||
src="https://images.ctfassets.net/il1yandlcjgk/5wPv8lJNwKKmmTPugKUzEn/7585bbf2f122943012fb2acdff2beddf/speed-header-1.png?w=604&fm=webp&q=60"
|
||
alt="Abstract illustration of a pipeline moving at speed"
|
||
class="object-cover w-full h-full absolute inset-0 group-hover:scale-105 duration-300 transition-transform"
|
||
/>
|
||
</picture>
|
||
</div>
|
||
|
||
|
||
|
||
<div class="p-8 grow">
|
||
<h3 class="type-h4 mb-2 text-morph-terminal group-hover:text-slime-650 transition-colors duration-300">
|
||
CircleCI is now available on Cursor Origin
|
||
</h3>
|
||
<div class="post-metadata text-small group-hover:text-slime-650 transition-colors duration-300 overflow-hidden">
|
||
|
||
<span class="text-nowrap mr-6">Sep 1, 2026</span><span class="text-nowrap relative before:absolute before:h-4 before:bg-neutral-300 before:w-px before:-left-3 before:block before:top-0.5">4 min read</span>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="flex gap-4 min-h-20 px-8 pb-5 grow-0 items-center">
|
||
<div class="rounded-full overflow-hidden w-10 h-10 shrink-0">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<picture>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="//images.ctfassets.net/il1yandlcjgk/2s1tFQ8oTG0QnN7fAbjOcU/f4f1821f8d94e0c016f1323507eefb21/nathan-fish.jpeg?w=50&fm=webp&q=75 1x, //images.ctfassets.net/il1yandlcjgk/2s1tFQ8oTG0QnN7fAbjOcU/f4f1821f8d94e0c016f1323507eefb21/nathan-fish.jpeg?w=100&fm=webp&q=60 2x, //images.ctfassets.net/il1yandlcjgk/2s1tFQ8oTG0QnN7fAbjOcU/f4f1821f8d94e0c016f1323507eefb21/nathan-fish.jpeg?w=150&fm=webp&q=45 3x"
|
||
media="(min-width: 0px)"
|
||
/>
|
||
|
||
|
||
<img
|
||
src="//images.ctfassets.net/il1yandlcjgk/2s1tFQ8oTG0QnN7fAbjOcU/f4f1821f8d94e0c016f1323507eefb21/nathan-fish.jpeg?w=50&fm=webp&q=60"
|
||
alt="Nathan Fish"
|
||
class=""
|
||
/>
|
||
</picture>
|
||
</div>
|
||
<div class="media-body media-middle">
|
||
<p class="post-author-name">
|
||
|
||
Nathan Fish
|
||
|
||
</p>
|
||
|
||
<p class="text-small leading-tight">
|
||
Director of Product Management
|
||
</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<a
|
||
href="/blog/smarter-testing-stop-running-tests-that-dont-matter/"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-location="resource item"
|
||
data-analytics-category="resources"
|
||
class="group bg-white rounded-2xl overflow-hidden flex flex-col items-stretch "
|
||
>
|
||
|
||
<div class="grow-0 w-full overflow-hidden h-0 bg-morph-vapor pt-[57%] relative">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<picture>
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=437&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=874&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=1311&fm=webp&q=45 3x"
|
||
media="(min-width: 1440px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=431&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=862&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=1293&fm=webp&q=45 3x"
|
||
media="(min-width: 1280px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=375&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=750&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=1125&fm=webp&q=45 3x"
|
||
media="(min-width: 1024px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=487&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=974&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=1461&fm=webp&q=45 3x"
|
||
media="(min-width: 768px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=353&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=706&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=1059&fm=webp&q=45 3x"
|
||
media="(min-width: 640px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=604&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=1208&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=1812&fm=webp&q=45 3x"
|
||
media="(min-width: 0px)"
|
||
/>
|
||
|
||
|
||
<img
|
||
src="https://images.ctfassets.net/il1yandlcjgk/28bJbauzjHtXDEa9ymk1N3/2256c0e096fe49162a6e77c5ce067a16/delivery-header-2.png?w=604&fm=webp&q=60"
|
||
alt="delivery-header-2"
|
||
class="object-cover w-full h-full absolute inset-0 group-hover:scale-105 duration-300 transition-transform"
|
||
/>
|
||
</picture>
|
||
</div>
|
||
|
||
|
||
|
||
<div class="p-8 grow">
|
||
<h3 class="type-h4 mb-2 text-morph-terminal group-hover:text-slime-650 transition-colors duration-300">
|
||
CircleCI Smarter Testing: Stop running tests that don't matter
|
||
</h3>
|
||
<div class="post-metadata text-small group-hover:text-slime-650 transition-colors duration-300 overflow-hidden">
|
||
|
||
<span class="text-nowrap mr-6">Aug 26, 2026</span><span class="text-nowrap relative before:absolute before:h-4 before:bg-neutral-300 before:w-px before:-left-3 before:block before:top-0.5">14 min read</span>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="flex gap-4 min-h-20 px-8 pb-5 grow-0 items-center">
|
||
<div class="rounded-full overflow-hidden w-10 h-10 shrink-0">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<picture>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="//images.ctfassets.net/il1yandlcjgk/2s1tFQ8oTG0QnN7fAbjOcU/f4f1821f8d94e0c016f1323507eefb21/nathan-fish.jpeg?w=50&fm=webp&q=75 1x, //images.ctfassets.net/il1yandlcjgk/2s1tFQ8oTG0QnN7fAbjOcU/f4f1821f8d94e0c016f1323507eefb21/nathan-fish.jpeg?w=100&fm=webp&q=60 2x, //images.ctfassets.net/il1yandlcjgk/2s1tFQ8oTG0QnN7fAbjOcU/f4f1821f8d94e0c016f1323507eefb21/nathan-fish.jpeg?w=150&fm=webp&q=45 3x"
|
||
media="(min-width: 0px)"
|
||
/>
|
||
|
||
|
||
<img
|
||
src="//images.ctfassets.net/il1yandlcjgk/2s1tFQ8oTG0QnN7fAbjOcU/f4f1821f8d94e0c016f1323507eefb21/nathan-fish.jpeg?w=50&fm=webp&q=60"
|
||
alt="Nathan Fish"
|
||
class=""
|
||
/>
|
||
</picture>
|
||
</div>
|
||
<div class="media-body media-middle">
|
||
<p class="post-author-name">
|
||
|
||
Nathan Fish
|
||
|
||
</p>
|
||
|
||
<p class="text-small leading-tight">
|
||
Director of Product Management
|
||
</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<a
|
||
href="/blog/five-takeaways-2026-q2-pulse/"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-location="resource item"
|
||
data-analytics-category="resources"
|
||
class="group bg-white rounded-2xl overflow-hidden flex flex-col items-stretch "
|
||
>
|
||
|
||
<div class="grow-0 w-full overflow-hidden h-0 bg-morph-vapor pt-[57%] relative">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<picture>
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=437&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=874&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=1311&fm=webp&q=45 3x"
|
||
media="(min-width: 1440px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=431&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=862&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=1293&fm=webp&q=45 3x"
|
||
media="(min-width: 1280px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=375&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=750&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=1125&fm=webp&q=45 3x"
|
||
media="(min-width: 1024px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=487&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=974&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=1461&fm=webp&q=45 3x"
|
||
media="(min-width: 768px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=353&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=706&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=1059&fm=webp&q=45 3x"
|
||
media="(min-width: 640px)"
|
||
/>
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=604&fm=webp&q=75 1x, https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=1208&fm=webp&q=60 2x, https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=1812&fm=webp&q=45 3x"
|
||
media="(min-width: 0px)"
|
||
/>
|
||
|
||
|
||
<img
|
||
src="https://images.ctfassets.net/il1yandlcjgk/5Gk3lbY880yWmVNoxUtk1B/18abaf44c940d0970d0c0e8846e90be9/SoSDR-2023-BOOK__1_.png?w=604&fm=webp&q=60"
|
||
alt="Q2 2026 State of Software Delivery Pulse report"
|
||
class="object-cover w-full h-full absolute inset-0 group-hover:scale-105 duration-300 transition-transform"
|
||
/>
|
||
</picture>
|
||
</div>
|
||
|
||
|
||
|
||
<div class="p-8 grow">
|
||
<h3 class="type-h4 mb-2 text-morph-terminal group-hover:text-slime-650 transition-colors duration-300">
|
||
5 takeaways from the State of Software Delivery Q2 Pulse report
|
||
</h3>
|
||
<div class="post-metadata text-small group-hover:text-slime-650 transition-colors duration-300 overflow-hidden">
|
||
|
||
<span class="text-nowrap mr-6">Jul 8, 2026</span><span class="text-nowrap relative before:absolute before:h-4 before:bg-neutral-300 before:w-px before:-left-3 before:block before:top-0.5">5 min read</span>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="flex gap-4 min-h-20 px-8 pb-5 grow-0 items-center">
|
||
<div class="rounded-full overflow-hidden w-10 h-10 shrink-0">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<picture>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<source
|
||
srcset="//images.ctfassets.net/il1yandlcjgk/5jaDKy7of1bny9EdxkfENU/e1d8506d6f4dc49c02127006e288eeb4/jacob-schmitt.jpg?w=50&fm=webp&q=75 1x, //images.ctfassets.net/il1yandlcjgk/5jaDKy7of1bny9EdxkfENU/e1d8506d6f4dc49c02127006e288eeb4/jacob-schmitt.jpg?w=100&fm=webp&q=60 2x, //images.ctfassets.net/il1yandlcjgk/5jaDKy7of1bny9EdxkfENU/e1d8506d6f4dc49c02127006e288eeb4/jacob-schmitt.jpg?w=150&fm=webp&q=45 3x"
|
||
media="(min-width: 0px)"
|
||
/>
|
||
|
||
|
||
<img
|
||
src="//images.ctfassets.net/il1yandlcjgk/5jaDKy7of1bny9EdxkfENU/e1d8506d6f4dc49c02127006e288eeb4/jacob-schmitt.jpg?w=50&fm=webp&q=60"
|
||
alt="Jacob Schmitt"
|
||
class=""
|
||
/>
|
||
</picture>
|
||
</div>
|
||
<div class="media-body media-middle">
|
||
<p class="post-author-name">
|
||
|
||
Jacob Schmitt
|
||
|
||
</p>
|
||
|
||
<p class="text-small leading-tight">
|
||
Senior Technical Content Marketing Manager
|
||
</p>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
|
||
</a>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</article>
|
||
</div>
|
||
|
||
<div data-js-id="copy-button-template" style="display: none;">
|
||
<a
|
||
data-toggle="tooltip"
|
||
data-placement="top"
|
||
data-delay="150"
|
||
data-original-text="Copy to clipboard"
|
||
data-success-text="Copied!"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-location="code snippet"
|
||
class="group/tooltip not-prose absolute top-2.5 right-2.5 w-8 h-8 p-1.5 rounded-full bg-[hsl(217,28%,58%)] hover:bg-white hover:text-slime-650 transition-colors duration-300 text-morph-terminal cursor-pointer"
|
||
data-js-id="copy-button"
|
||
>
|
||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M3.43752 6V6C2.09131 6 1 7.09132 1 8.43752V16C1 17.6569 2.34315 19 4 19H11.5624C12.9086 19 14 17.9086 14 16.5624V16.5624" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
|
||
<rect x="6" y="1" width="13" height="13" rx="3" stroke="currentColor" stroke-width="2"/>
|
||
</svg>
|
||
|
||
<div
|
||
data-js-id="copy-tooltip"
|
||
class="group-hover/tooltip:block hidden absolute -top-3 -translate-y-full left-1/2 -translate-x-1/2 p-4 bg-9pm-500/60 shadow-inner shadow-white/30 backdrop-blur-md rounded-lg text-white text-small w-max text-center z-1"
|
||
>Copy to clipboard</div>
|
||
</a>
|
||
</div>
|
||
|
||
|
||
<div class="hidden">
|
||
<a
|
||
role="button"
|
||
class="w-full"
|
||
data-js-id="dialog-button-template"
|
||
data-analytics-action="click-outer-cta"
|
||
></a>
|
||
</div>
|
||
<dialog id="zoomed-image" class="backdrop:bg-9pm-500/60 backdrop:backdrop-blur-md text-white fixed inset-0 z-20 w-screen h-screen m-0 p-0 bg-transparent shadow-none max-w-full max-h-full">
|
||
<div class="w-max absolute top-2 right-2">
|
||
<button onclick="document.getElementById('zoomed-image').close()" class="p-2 focus:outline-hidden focus:ring-3 focus:ring-slime-500/75"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="15" height="15"> <path d="M8.114 10L.944 2.83 0 1.885 1.886 0l.943.943L10 8.113l7.17-7.17.944-.943L20 1.886l-.943.943-7.17 7.17 7.17 7.17.943.944L18.114 20l-.943-.943-7.17-7.17-7.17 7.17-.944.943L0 18.114l.943-.943L8.113 10z" fill="currentColor"></path> </svg><span class="sr-only">close</span></button>
|
||
</div>
|
||
<div class="flex items-center justify-center mx-auto p-8 lg:px-16 w-full max-w-full h-full">
|
||
<img
|
||
data-js-id="dialog-img"
|
||
class="object-scale-down w-full h-full"
|
||
src="#"
|
||
alt=""
|
||
/>
|
||
</div>
|
||
</dialog>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<footer class="bg-morph-midnight text-body-light pt-16">
|
||
<div class="2xl:container mx-auto px-8 lg:px-16 py-8 lg:py-16">
|
||
<div class="mb-16">
|
||
<a
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "footer", "category": "logo", "cta_text": "circleci" }'
|
||
href="/"
|
||
>
|
||
<svg role="img" aria-label="CircleCI" fill="none" height="25" viewBox="0 0 116 25" width="116" xmlns="http://www.w3.org/2000/svg"><path d="m8.87876 12.6691c0-1.5781 1.30334-2.87304 2.89174-2.87304s2.8917 1.29494 2.8917 2.87304c0 1.5782-1.3033 2.8731-2.8917 2.8731-1.6292 0-2.89174-1.2544-2.89174-2.8731zm2.89174-12.018362c-5.66126 0-10.42647 3.844272-11.7705 9.064382v.1214c0 .32368.24437.56648.570196.56648h4.887394c.24437 0 .44801-.1214.52947-.3237 1.0182-2.18515 3.21753-3.68239 5.78344-3.68239 3.5026 0 6.3536 2.83262 6.3536 6.31269 0 3.4801-2.851 6.3127-6.3536 6.3127-2.56591 0-4.76524-1.4972-5.78344-3.6824-.08146-.2023-.2851-.3237-.52947-.3237h-4.887394c-.325826-.0405-.570196.2023-.570196.526v.1214c1.34403 5.2201 6.10924 9.0644 11.7705 9.0644 6.6794 0 12.0963-5.382 12.0963-12.0184 0-6.67688-5.4169-12.058862-12.0963-12.058862zm31.6458 14.851062h-1.6291c-.1222 0-.2036.0404-.2851.1214-.9367 1.4163-2.5659 2.347-4.3986 2.347-2.9732 0-5.3354-2.347-5.3354-5.3011 0-2.95398 2.4029-5.301 5.3354-5.301 1.8327 0 3.4619.93071 4.3986 2.34702.0815.08094.1629.1214.2851.1214h1.6291c.2037 0 .3666-.16186.3666-.36419 0-.04047 0-.1214-.0407-.16187-1.2219-2.42796-3.747-4.08706-6.6387-4.08706-4.1136 0-7.4533 3.31821-7.4533 7.4053 0 4.168 3.3397 7.4457 7.4533 7.4457 2.8917 0 5.4168-1.6591 6.6387-4.087.0407-.0405.0407-.081.0407-.1619 0-.1619-.1629-.3237-.3666-.3237zm4.9689-12.70636c0 .76885-.6517 1.41631-1.4255 1.41631s-1.4255-.64746-1.4255-1.41631c0-.76886.6517-1.41631 1.4255-1.41631.8146.04046 1.4255.64745 1.4255 1.41631zm-.3258 16.59106v-13.75844h-2.1179v13.75844c0 .2023.1629.3642.3665.3642h1.4255c.163 0 .3259-.1619.3259-.3642zm9.2046-14.08217c-2.1586.08093-3.8692 1.13305-4.9689 2.67076v-1.98284c0-.20233-.1629-.36419-.3665-.36419h-1.4255c-.2037 0-.3666.16186-.3666.36419v13.39425c0 .2023.1629.3642.3666.3642h1.4255c.2036 0 .3665-.1619.3665-.3642v-6.7174c0-2.79211 2.1993-5.09867 4.9689-5.26054.2036 0 .3665-.16186.3665-.36419v-1.41631c0-.16187-.1629-.32373-.3665-.32373zm14.1734 10.19747h-1.6291c-.1222 0-.2037.0404-.2851.1214-.9368 1.4163-2.5659 2.347-4.3987 2.347-2.9324 0-5.3354-2.3875-5.3354-5.3011 0-2.91351 2.403-5.301 5.3354-5.301 1.8328 0 3.4619.93071 4.3987 2.34702.0814.08094.1629.1214.2851.1214h1.6291c.2036 0 .3666-.16186.3666-.36419 0-.04047-.0001-.1214-.0408-.16187-1.2218-2.42796-3.747-4.08706-6.6387-4.08706-4.1135 0-7.4533 3.31821-7.4533 7.4053 0 4.087 3.3398 7.4053 7.4533 7.4053 2.8917 0 5.4169-1.6592 6.6387-4.0871.0407-.0405.0408-.0809.0408-.1619-.0408-.1214-.163-.2832-.3666-.2832zm4.2357-14.4464h-1.4254c-.2037 0-.3666.16186-.3666.36419v18.00741c0 .2023.1629.3642.3666.3642h1.4254c.2037 0 .3666-.1619.3666-.3642v-18.00741c0-.20233-.1629-.36419-.3666-.36419zm9.9377 4.20846c-4.1135 0-7.4532 3.31822-7.4532 7.40524 0 4.0871 3.3397 7.4053 7.4532 7.4053 2.8917 0 5.4169-1.6591 6.6387-4.087.0408-.0405.0408-.081.0408-.1619 0-.2023-.1629-.3642-.3666-.3642h-1.6291c-.1222 0-.2036.0405-.2851.1619-.9775 1.4163-2.5659 2.3065-4.3987 2.3065-2.688 0-4.9281-1.9828-5.2946-4.5726h12.3814c.2036 0 .3258-.1619.3665-.3238 0-.1214 0-.2428 0-.3642 0-4.08702-3.3397-7.40524-7.4533-7.40524zm-5.1317 6.02944c.6109-2.22563 2.688-3.88474 5.1317-3.88474s4.5209 1.65911 5.1318 3.88474zm33.2339-10.602096c-1.181 0-2.118.930716-2.118 2.104236 0 1.17351.937 2.10423 2.118 2.10423s2.118-.93072 2.118-2.10423c0-1.13305-.937-2.104236-2.118-2.104236zm1.752 4.936856v13.75844c0 .2023-.163.3642-.367.3642h-2.851c-.204 0-.366-.1619-.366-.3642v-13.75844zm-12.789 14.44634c3.462 0 6.394-2.3875 7.209-5.5843 0-.0405 0-.0405 0-.0809 0-.2023-.163-.3642-.367-.3642h-3.014c-.162 0-.285.0809-.325.2023-.611 1.3354-1.955 2.2661-3.544 2.2661-2.158 0-3.9097-1.74-3.9097-3.8847s1.7517-3.88476 3.9097-3.88476c1.589 0 2.933.93072 3.544 2.26606.04.1214.163.2024.325.2024h3.014c.204 0 .367-.1619.367-.3642 0-.0405 0-.0405 0-.081-.815-3.19677-3.747-5.58427-7.209-5.58427-4.1136 0-7.4533 3.31821-7.4533 7.40527 0 4.2085 3.3397 7.4862 7.4533 7.4862z" fill="currentColor"/></svg>
|
||
<span class="sr-only">CircleCI</span>
|
||
</a>
|
||
</div>
|
||
<div class="flex flex-col lg:flex-row justify-between gap-y-8 gap-x-4">
|
||
<div class="flex flex-col lg:flex-row gap-y-8 gap-x-4">
|
||
<span class="">© 2026 Circle Internet Services, Inc.</span>
|
||
<nav class="flex flex-col lg:flex-row gap-y-8 gap-x-4">
|
||
|
||
<a
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "footer", "category": "legal", "page_location": "footer - legal", "cta_text": "Terms of Use" }'
|
||
href="https://circleci.com/legal/terms-of-use/"
|
||
|
||
|
||
>Terms of Use</a>
|
||
|
||
<a
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "footer", "category": "legal", "page_location": "footer - legal", "cta_text": "Privacy Policy" }'
|
||
href="https://circleci.com/legal/privacy/"
|
||
|
||
|
||
>Privacy Policy</a>
|
||
|
||
<a
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "footer", "category": "legal", "page_location": "footer - legal", "cta_text": "Cookie Policy" }'
|
||
href="https://circleci.com/legal/cookie-policy/"
|
||
|
||
|
||
>Cookie Policy</a>
|
||
|
||
<a
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "footer", "category": "legal", "page_location": "footer - legal", "cta_text": "Cookie Preferences" }'
|
||
href="#cookie-preferences"
|
||
|
||
onclick="Cookiebot.renew(); return false;" data-proofer-ignore
|
||
>Cookie Preferences</a>
|
||
|
||
</nav>
|
||
</div>
|
||
<div class="flex gap-5">
|
||
<a
|
||
href="/blog/feed.xml"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "footer", "category": "icons", "cta_text": "blog-feed"}'
|
||
title="RSS"
|
||
class="rss"
|
||
>
|
||
<svg viewBox="0 0 448 512" width="24" height="24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="m25.57 176.1c-13.16-.7-24.6583 9.1-25.5177 22.3s9.173 24.65 22.39 25.5c120.1 7.875 225.7 112.7 233.6 233.6.8577 12.8 11.3577 22.5 23.0577 22.5.5313 0 1.062-.0313 1.594-.0625 13.22-.8438 23.25-12.28 22.39-25.5-8.484-144.1375-133.384-269.0375-277.514-278.3375zm6.43-144.1c-17.67 0-32 14.31-32 32s14.33 32 32 32c194.1 0 352 157.9 352 352 0 17.69 14.33 32 32 32s32-14.31 32-32c0-229.4-186.6-416-416-416zm31.1 319.9c-34.47 0-63.1 28.7-63.1 64.1s28.63 64 63.1 64 64.08-28.62 64.08-64-27.81-64.1-64.08-64.1z"/></svg>
|
||
<span class="sr-only">RSS</span>
|
||
</a>
|
||
<a
|
||
href="https://www.linkedin.com/company/circleci"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "footer", "category": "icons", "cta_text": "linkedin"}'
|
||
title="LinkedIn"
|
||
class="linkedin"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
>
|
||
<svg viewBox="0 0 448 512" width="24" height="24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="m416 32h-384.1c-17.6 0-31.9 14.5-31.9 32.3v383.4c0 17.8 14.3 32.3 31.9 32.3h384.1c17.6 0 32-14.5 32-32.3v-383.4c0-17.8-14.4-32.3-32-32.3zm-280.6 384h-66.4v-213.8h66.5v213.8zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5s17.2-38.5 38.5-38.5c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4v-104c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9v105.8h-66.4v-213.8h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg>
|
||
<span class="sr-only">LinkedIn</span>
|
||
</a>
|
||
<a
|
||
href="https://github.com/circleci"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "footer", "category": "icons", "cta_text": "github"}'
|
||
title="GitHub"
|
||
class="github"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
>
|
||
<svg viewBox="0 0 496 512" width="24" height="24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="m165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zm65.8-383.2c-138.7 0-244.8 105.3-244.8 244 0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1 100-33.2 167.8-128.1 167.8-239 0-138.7-112.5-244-251.2-244zm-147.6 344.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
|
||
<span class="sr-only">GitHub</span>
|
||
</a>
|
||
<a
|
||
href="https://twitter.com/circleci"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "footer", "category": "icons", "cta_text": "x"}'
|
||
title="X"
|
||
class="x"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
>
|
||
<svg width="24" height="24" viewBox="0 0 1200 1227" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||
<path d="M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z" fill="currentColor"/>
|
||
</svg>
|
||
|
||
<span class="sr-only">X</span>
|
||
</a>
|
||
<a
|
||
href="https://twitch.tv/circleci"
|
||
data-analytics-action="click-outer-cta"
|
||
data-analytics-properties='{ "location": "footer", "category": "icons", "cta_text": "twitch"}'
|
||
title="Twitch"
|
||
class="twitch"
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
>
|
||
<svg viewBox="0 0 512 512" width="24" height="24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="m391.17 103.47h-38.63v109.7h38.63zm-106.17-.47h-38.63v109.75h38.63zm-164.17-103-96.52 91.42v329.16h115.83v91.42l96.53-91.42h77.25l173.77-164.58v-256zm328.24 237.75-77.22 73.12h-77.24l-67.6 64v-64h-86.87v-274.29h308.93z"/></svg>
|
||
<span class="sr-only">Twitch</span>
|
||
</a>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
<div style="background-image: url('https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/blog/morph/sweater-2f179375ed5648fc3d539c56b335fa89.svg')" class="bg-repeat-x w-full h-[500px] bg-center"></div>
|
||
</footer>
|
||
|
||
</main>
|
||
|
||
<script type="text/javascript" src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/morph/utils-152e33f78de8ce6d099146884d724a6c.js" crossorigin="anonymous"></script>
|
||
|
||
<script
|
||
type="text/plain"
|
||
src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/morph/id-user-3f94e73e032c3a83a813c4b89c68da46.js"
|
||
crossorigin="anonymous"
|
||
data-cookieconsent="preferences">
|
||
</script>
|
||
<script type="text/javascript" src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/morph/track-events-1436e068c781a19d35069e60adfea223.js" crossorigin="anonymous"></script>
|
||
|
||
<script type="text/javascript" src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/morph/nav_search-9a224aee22403014905791b324a371de.js" crossorigin="anonymous"></script>
|
||
|
||
<script type="text/javascript" src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/morph/nav_mobile-menu-3e7b64916ad673015da00d575cae3aef.js" crossorigin="anonymous"></script>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<script type="text/javascript" src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/node_modules/infinite-scroll/dist/infinite-scroll.pkgd.min-624fadd4e13a43c1fc46d7dde8dd4766.js" crossorigin="anonymous"></script>
|
||
|
||
|
||
|
||
|
||
|
||
<script type="text/javascript" src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/node_modules/clipboard/dist/clipboard.min-15f52a1ee547f2bdd46e56747332ca2d.js" crossorigin="anonymous"></script>
|
||
|
||
|
||
|
||
|
||
|
||
<script type="text/javascript" src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/morph/post_social-popout-775b287fb1e5b9b6c29e6027ee6570a0.js" crossorigin="anonymous"></script>
|
||
|
||
|
||
|
||
|
||
|
||
<script type="text/javascript" src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/morph/post_clipboard-af5bab9661f2fc478d9249da92af1585.js" crossorigin="anonymous"></script>
|
||
|
||
|
||
|
||
|
||
|
||
<script type="text/javascript" src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/morph/post_infinite-scroll-6a8046e3514b0ab2307ecf8a1477ff9c.js" crossorigin="anonymous"></script>
|
||
|
||
|
||
|
||
|
||
|
||
<script type="text/javascript" src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/morph/post_zoomable-images-0fe7f7e6e9f3de9f80ab2c36ed608fc1.js" crossorigin="anonymous"></script>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<script
|
||
type="text/plain"
|
||
src="https://d2qm0z2kzhiwa.cloudfront.net/blog/assets/morph/analytics-d64105d54385d172de5da409e1a45f68.js"
|
||
crossorigin="anonymous"
|
||
data-cookieconsent="marketing">
|
||
</script>
|
||
|
||
|
||
<script src="https://unpkg.com/@highlightjs/cdn-assets@11.10.0/highlight.min.js"></script>
|
||
<script>hljs.highlightAll();</script>
|
||
|
||
</body>
|
||
</html>
|