CINXE.COM
Workflow orchestration - CircleCI
<!DOCTYPE html><html lang="en"><style data-emotion="css-global 1ccfmri">html{line-height:1.15;-webkit-text-size-adjust:100%;}body{margin:0;}main{display:block;}h1{font-size:2em;margin:0.67em 0;}hr{box-sizing:content-box;height:0;overflow:visible;}pre{font-family:monospace,monospace;font-size:1em;}a{background-color:transparent;}abbr[title]{border-bottom:none;-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;}b,strong{font-weight:bolder;}code,kbd,samp{font-family:monospace,monospace;font-size:1em;}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sub{bottom:-0.25em;}sup{top:-0.5em;}img{border-style:none;}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0;}button,input{overflow:visible;}button,select{text-transform:none;}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button;}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0;}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText;}fieldset{padding:0.35em 0.75em 0.625em;}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal;}progress{vertical-align:baseline;}textarea{overflow:auto;}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0;}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto;}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px;}[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit;}details{display:block;}summary{display:-webkit-box;display:-webkit-list-item;display:-ms-list-itembox;display:list-item;}template{display:none;}[hidden]{display:none;}*,*::after,*::before{box-sizing:border-box;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;}html{font-family:'Roboto',sans-serif;}html,body,#__next,#root{width:100%;min-height:100vh;scroll-padding-top:128px;}#__next,#root{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}</style><style data-emotion="css-global 1x25u27">pre.highlight{padding:1em;padding-left:3.8em;margin:0.5em 0;color:#ffffff;background-color:#2b2b2b;white-space:pre-wrap!important;border-radius:4px;word-wrap:break-word;}pre[class*='language-'],code[class*='language-']{color:#ffffff;font-size:14px;text-shadow:none;font-family:Menlo,Monaco,'Courier New',monospace;direction:ltr;text-align:left;white-space:normal;word-spacing:normal;word-break:normal;line-height:24px;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;font-weight:normal;font-feature-settings:'liga' 0,'calt' 0;letter-spacing:0px;}@media print{pre[class*='language-'],code[class*='language-']{text-shadow:none;}}pre[class*='language-']{padding:1em;margin:0.5em 0;overflow:auto;background:#2b2b2b;}:not(pre)>code{border-radius:0.3em;color:#555!important;background:#1b1f230d;word-wrap:anywhere;padding:2px;white-space:pre-wrap;font-size:14px;line-height:initial!important;}.namespace{opacity:0.7;}.token.doctype .token.doctype-tag{color:#569cd6;}.token.doctype .token.name{color:#9cdcfe;}.token.comment,.token.prolog{color:#959595;}.token.punctuation,.language-html .language-css .token.punctuation,.language-html .language-javascript .token.punctuation{color:#d4d4d4;}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.inserted,.token.unit{color:#ffffff;}.token.number{color:#b5cea8;}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.deleted{color:#ffffff;}.language-css .token.string.url{-webkit-text-decoration:underline;text-decoration:underline;}.token.operator,.token.entity{color:#d4d4d4;}.token.operator.arrow{color:#569cd6;}.token.atrule{color:#fff176;}.token.atrule .token.rule{color:#c586c0;}.token.atrule .token.url{color:#9cdcfe;}.token.atrule .token.url .token.function{color:#dcdcaa;}.token.atrule .token.url .token.punctuation{color:#d4d4d4;}.token.keyword{color:#569cd6;}.token.keyword.module,.token.keyword.control-flow{color:#c586c0;}.token.function,.token.function .token.maybe-class-name{color:#dcdcaa;}.token.regex{color:#d16969;}.token.important{color:#d4d4d4;font-weight:500;}.token.italic{font-style:italic;}.token.constant{color:#9cdcfe;}.token.class-name,.token.maybe-class-name{color:#4ec9b0;}.token.console{color:#9cdcfe;}.token.parameter{color:#9cdcfe;}.token.interpolation{color:#9cdcfe;}.token.punctuation.interpolation-punctuation{color:#569cd6;}.token.boolean{color:#569cd6;}.token.property,.token.variable,.token.imports .token.maybe-class-name,.token.exports .token.maybe-class-name{color:#fff176;}.token.selector{color:#d7ba7d;}.token.escape{color:#d7ba7d;}.token.tag{color:#569cd6;}.token.tag .token.punctuation{color:#808080;}.token.cdata{color:#808080;}.token.attr-name{color:#9cdcfe;}.token.attr-value,.token.attr-value .token.punctuation{color:#ce9178;}.token.attr-value .token.punctuation.attr-equals{color:#d4d4d4;}.token.entity{color:#569cd6;}.token.namespace{color:#4ec9b0;}pre[class*='language-javascript'],code[class*='language-javascript'],pre[class*='language-jsx'],code[class*='language-jsx'],pre[class*='language-typescript'],code[class*='language-typescript'],pre[class*='language-tsx'],code[class*='language-tsx']{color:#9cdcfe;}pre[class*='language-css'],code[class*='language-css']{color:#ce9178;}pre[class*='language-html'],code[class*='language-html']{color:#d4d4d4;}.language-regex .token.anchor{color:#dcdcaa;}.language-html .token.punctuation{color:#808080;}pre[class*='language-']>code[class*='language-']{position:relative;z-index:1;}.line-highlight.line-highlight{background:#f7ebc6;box-shadow:inset 5px 0 0 #f7d87c;z-index:0;}.line-numbers .line-numbers-rows{border-right:0px!important;top:-4px!important;}.line-numbers .line-numbers-rows span{min-height:24px!important;}.line-numbers .line-numbers-rows span:before{color:#858585!important;}</style><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Workflow orchestration - CircleCI</title><meta name="description" content="Learn about using CircleCI workflows to orchestrate jobs"/><meta property="og:title" content="Workflow orchestration - CircleCI"/><meta property="og:description" content="Learn about using CircleCI workflows to orchestrate jobs"/><meta property="og:url" content="https://circleci.com/docs/workflows/"/><meta property="og:image" content="https://circleci.com/docs/assets/meta/open-graph-cci-docs.jpg"/><link href="/docs/assets/meta/favicon.png" rel="icon" type="image/png"/><link rel="canonical" href="https://circleci.com/docs/workflows/"/><link rel="alternate" hrefLang="en" href="https://circleci.com/docs/workflows/"/><link rel="alternate" hrefLang="ja" href="https://circleci.com/docs/ja/workflows/"/><link rel="alternate" hrefLang="x-default" href="https://circleci.com/docs/workflows/"/><meta name="twitter:card" content="summary_large_image"/><meta property="twitter:domain" content="circleci.com"/><meta property="twitter:url" content="https://circleci.com/docs/workflows/"/><meta name="twitter:title" content="Workflow orchestration - CircleCI"/><meta name="twitter:description" content="Learn about using CircleCI workflows to orchestrate jobs"/><meta name="twitter:image" content="https://circleci.com/docs/assets/meta/open-graph-cci-docs.jpg"/><meta name="next-head-count" content="19"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous"/><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css"/><script data-cookieconsent="marketing">(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><script data-cookieconsent="statistics">!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","debug","page","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware"];analytics.factory=function(e){return function(){var t=Array.prototype.slice.call(arguments);t.unshift(e);analytics.push(t);return analytics}};for(var e=0;e<analytics.methods.length;e++){var key=analytics.methods[e];analytics[key]=analytics.factory(key)}analytics.load=function(key,e){var t=document.createElement("script");t.type="text/javascript";t.async=!0;t.src="https://cci-growth-utils.s3.us-east-2.amazonaws.com/segment/analytics.js/v1/" + key + "/analytics.min.js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(t,n);analytics._loadOptions=e};analytics._writeKey="AbgkrgN4cbRhAVEwlzMkHbwvrXnxHh35";;analytics.SNIPPET_VERSION="4.15.3"; }}();</script><script data-cookieconsent="statistics">window.analytics.load('AbgkrgN4cbRhAVEwlzMkHbwvrXnxHh35', { integrations: { All: false, Amplitude: true, Postgres: true, "Segment.io": true, Hotjar: true }, });</script><script defer="" src="https://widget.kapa.ai/kapa-widget.bundle.js" data-website-id="06cd008c-32ae-46d3-946b-211d1afd443c" data-project-name="CircleCI" data-project-color="#161616" data-project-logo="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTI7jLeuu2k66svJDmHxYKlP7Ysf7FvNbkuvzAhHEPCsvLbhcpVRnoJCm538OSv6o5uzlQ&usqp=CAU"></script><meta name="zd-site-verification" content="srxqwtrxsmb1bcawp5j3d1"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /><link rel="preload" href="https://assets-docs.circleci.com/docs/_next/static/css/95e8257575110deb.css" as="style"/><link rel="stylesheet" href="https://assets-docs.circleci.com/docs/_next/static/css/95e8257575110deb.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="https://assets-docs.circleci.com/docs/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="https://assets-docs.circleci.com/docs/_next/static/chunks/webpack-3ed24fe7b432eeb8.js" defer=""></script><script src="https://assets-docs.circleci.com/docs/_next/static/chunks/framework-9c679519b7b20335.js" defer=""></script><script src="https://assets-docs.circleci.com/docs/_next/static/chunks/main-4575c0bb82696f32.js" defer=""></script><script src="https://assets-docs.circleci.com/docs/_next/static/chunks/pages/_app-07319b956598f57c.js" defer=""></script><script src="https://assets-docs.circleci.com/docs/_next/static/chunks/103-386f95112f80b86b.js" defer=""></script><script src="https://assets-docs.circleci.com/docs/_next/static/chunks/365-1084b37a8a894cf6.js" defer=""></script><script src="https://assets-docs.circleci.com/docs/_next/static/chunks/137-74c9709c103ee7b5.js" defer=""></script><script src="https://assets-docs.circleci.com/docs/_next/static/chunks/pages/%5B...slug%5D-808ad58695d6efe0.js" defer=""></script><script src="https://assets-docs.circleci.com/docs/_next/static/9e2f0ef33c33cd80cc959c1747acd17d270b8bd8/_buildManifest.js" defer=""></script><script src="https://assets-docs.circleci.com/docs/_next/static/9e2f0ef33c33cd80cc959c1747acd17d270b8bd8/_ssgManifest.js" defer=""></script><style data-href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&display=swap">@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5vAA.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Me5g.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmEU9vAA.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlvAA.woff) format('woff')}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fABc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCBc4AMP6lbBP.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fBxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fCxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fChc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:300;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2) format('woff2');unicode-range:U+1F00-1FFF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Roboto';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/s/roboto/v32/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}</style></head><script type="text/javascript">var circleci = {config: {"exceptionLoggerClientToken":"ca1befe4db724589813fc4a2a9642d4d","analyticsKey":"AbgkrgN4cbRhAVEwlzMkHbwvrXnxHh35","datadogRumApplicationId":"2a3e19ca-297e-4a53-a2cf-082e827d13d3","datadogRumClientToken":"pubdffb4b4dd07f1f43b42276901d58da91"}};</script><body><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-W9HDVK" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="__next"><style data-emotion-css="1vs42if">.css-1vs42if{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:linear-gradient(to right,#F7F7F7 0%,#F7F7F7 calc(50% - 860px),#fff calc(50% - 860px),#fff 100%);}</style><style data-emotion-css="quiohg">.css-quiohg{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:linear-gradient(to right,#F7F7F7 0%,#F7F7F7 calc(50% - 860px),#fff calc(50% - 860px),#fff 100%);}</style><div class="layout css-quiohg"><style data-emotion-css="w4sqhj">.css-w4sqhj{width:100%;box-shadow:0 -6px 18px -3px #000000bd;z-index:100;background-color:#FFFFFF;position:-webkit-sticky;position:sticky;top:0px;}</style><style data-emotion-css="g79ewj">.css-g79ewj{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;width:100%;box-shadow:0 -6px 18px -3px #000000bd;z-index:100;background-color:#FFFFFF;position:-webkit-sticky;position:sticky;top:0px;}</style><div class="css-g79ewj"><style data-emotion-css="1l8dtod">.css-1l8dtod{margin:0 auto;width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:-webkit-sticky;position:sticky;padding:1rem 1rem 0.5rem 1rem;}@media (min-width:1200px){.css-1l8dtod{padding:1rem 1.5rem 0.5rem 1.5rem;}}</style><style data-emotion-css="1sjxx8s">.css-1sjxx8s{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin:0 auto;width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:-webkit-sticky;position:sticky;padding:1rem 1rem 0.5rem 1rem;}@media (min-width:1200px){.css-1sjxx8s{padding:1rem 1.5rem 0.5rem 1.5rem;}}</style><div data-testid="header" class="css-1sjxx8s"><style data-emotion-css="6irssd">.css-6irssd{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><style data-emotion-css="1lovh0t">.css-1lovh0t{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><div class="css-1lovh0t"><style data-emotion-css="1q9np79">.css-1q9np79{display:block;margin-right:0.5rem;}</style><div data-testid="header-circle-logo" class="css-1q9np79"><style data-emotion-css="si22pm">.css-si22pm{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-text-decoration:none;text-decoration:none;}</style><a href="https://circleci.com/docs/" data-testid="footer-circleci-logo" class="css-si22pm"><style data-emotion-css="1yqyrw2">.css-1yqyrw2{width:126;}</style><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 100" width="126" class="css-1yqyrw2"><circle fill="#161616" cx="30.44" cy="52.5" r="7.471"></circle><path fill="#161616" d="M30.44 21.124c-14.619 0-26.903 10-30.388 23.532-.03.119-.052.244-.052.373 0 .825.669 1.494 1.494 1.494h12.651c.603 0 1.118-.358 1.354-.873 0 0 .019-.035.025-.052 2.608-5.628 8.304-9.533 14.914-9.533 9.077 0 16.436 7.357 16.436 16.435S39.517 68.935 30.44 68.935c-6.61 0-12.305-3.905-14.914-9.532-.007-.018-.026-.053-.026-.053a1.489 1.489 0 0 0-1.354-.873H1.495c-.826 0-1.495.669-1.495 1.494 0 .129.021.254.052.373C3.537 73.876 15.821 83.876 30.44 83.876c17.329 0 31.376-14.048 31.376-31.376S47.769 21.124 30.44 21.124zM112.482 59.855h-4.268a.919.919 0 0 0-.729.361c-2.479 3.664-6.671 6.074-11.428 6.074-7.617 0-13.791-6.175-13.791-13.791 0-7.617 6.174-13.792 13.791-13.792 4.758 0 8.949 2.412 11.429 6.075a.916.916 0 0 0 .728.361h4.268a.92.92 0 0 0 .921-.919.91.91 0 0 0-.101-.413c-3.18-6.299-9.706-10.621-17.244-10.621-10.663 0-19.309 8.645-19.309 19.309 0 10.663 8.646 19.309 19.309 19.309 7.538 0 14.064-4.322 17.243-10.621a.914.914 0 0 0 .102-.413.92.92 0 0 0-.921-.919zM125.355 26.756a3.678 3.678 0 1 1-7.357 0 3.678 3.678 0 0 1 7.357 0zm-.919 43.213V34.11h-5.517v35.858a.92.92 0 0 0 .919.919h3.679a.918.918 0 0 0 .919-.918zM148.355 33.214c-5.564.262-10.008 2.921-12.887 6.981v-5.166a.92.92 0 0 0-.919-.919h-3.678a.92.92 0 0 0-.919.919v34.939c0 .508.41.919.919.919h3.678a.918.918 0 0 0 .919-.919V52.5c0-7.308 5.686-13.286 12.871-13.76a.921.921 0 0 0 .921-.922v-3.686a.92.92 0 0 0-.905-.918zM184.992 59.855h-4.268a.916.916 0 0 0-.729.361c-2.479 3.664-6.671 6.074-11.427 6.074-7.618 0-13.792-6.175-13.792-13.791 0-7.617 6.174-13.792 13.792-13.792 4.756 0 8.948 2.412 11.427 6.075a.917.917 0 0 0 .729.361h4.268a.92.92 0 0 0 .921-.919.898.898 0 0 0-.102-.413c-3.179-6.299-9.705-10.621-17.242-10.621-10.664 0-19.309 8.645-19.309 19.309 0 10.663 8.645 19.309 19.309 19.309 7.537 0 14.063-4.322 17.242-10.621a.914.914 0 0 0 .102-.413.92.92 0 0 0-.921-.919zM196.025 22.158h-3.678a.92.92 0 0 0-.919.919v46.892c0 .508.411.919.919.919h3.678a.92.92 0 0 0 .92-.919V23.077a.92.92 0 0 0-.92-.919zM221.771 33.191c-10.664 0-19.309 8.645-19.309 19.309 0 10.663 8.645 19.309 19.309 19.309 7.538 0 14.062-4.322 17.242-10.621a.913.913 0 0 0-.819-1.332h-4.267a.913.913 0 0 0-.741.379c-2.48 3.653-6.666 6.057-11.415 6.057-6.993 0-12.767-5.206-13.667-11.952h32.031a.92.92 0 0 0 .917-.873c.016-.32.026-.643.026-.966 0-10.665-8.644-19.31-19.307-19.31zm-13.292 15.631c1.61-5.83 6.949-10.114 13.292-10.114s11.681 4.284 13.292 10.114h-26.584zM294.483 21.239a5.517 5.517 0 1 0 0 11.034 5.517 5.517 0 0 0 0-11.034zm4.598 12.871v35.858a.92.92 0 0 1-.919.919h-7.356a.918.918 0 0 1-.919-.919V34.11h9.194zM265.902 71.809c9.014 0 16.576-6.176 18.706-14.524a.832.832 0 0 0 .023-.187.92.92 0 0 0-.919-.92h-7.782a.919.919 0 0 0-.834.537l-.002-.001c-1.599 3.48-5.11 5.899-9.192 5.899-5.584 0-10.113-4.527-10.113-10.113s4.529-10.113 10.113-10.113a10.11 10.11 0 0 1 9.192 5.899l.002-.002a.92.92 0 0 0 .834.538h7.782a.92.92 0 0 0 .919-.92.944.944 0 0 0-.022-.184c-2.128-8.35-9.693-14.527-18.707-14.527-10.661 0-19.308 8.646-19.308 19.309.001 10.664 8.647 19.309 19.308 19.309z"></path></svg><style data-emotion-css="mcrnfh">.css-mcrnfh{color:#161616;font-size:1.5rem;font-weight:300;-webkit-letter-spacing:0.01em;-moz-letter-spacing:0.01em;-ms-letter-spacing:0.01em;letter-spacing:0.01em;line-height:1.50;margin-left:0.5rem;text-align:center;-webkit-text-decoration:none;text-decoration:none;}@media (max-width:768px){.css-mcrnfh{display:none;}}</style><div color="#161616" class="css-mcrnfh">Docs</div></a></div><style data-emotion-css="1m3tj04">.css-1m3tj04{display:none;}@media (min-width:1200px){.css-1m3tj04{display:block;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0px 80px;}}</style><style data-emotion-css="tki8r1">.css-tki8r1{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;display:none;}@media (min-width:1200px){.css-tki8r1{display:block;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0px 80px;}}</style><div data-testid="header-search-bar" class="css-tki8r1"><style data-emotion-css="cssveg">.css-cssveg{position:relative;}</style><form novalidate="" action="" role="search" class="css-cssveg"><style data-emotion-css="409epr">.css-409epr{height:100%;position:absolute;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;left:0;}@media (min-width:1200px){.css-409epr{padding-left:1rem;}}</style><div class="css-409epr"><style data-emotion-css="19wtgi5">.css-19wtgi5{width:24px;height:24px;min-width:24px;color:currentColor;}</style><div size="24" color="currentColor" class="css-19wtgi5"><style data-emotion-css="bleycz">.css-bleycz{display:block;width:100%;}</style><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Search" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path fill-rule="evenodd" clip-rule="evenodd" d="M14 9C14 11.7614 11.7614 14 9 14C6.23858 14 4 11.7614 4 9C4 6.23858 6.23858 4 9 4C11.7614 4 14 6.23858 14 9ZM13.1922 14.6064C12.0236 15.4816 10.5723 16 9 16C5.13401 16 2 12.866 2 9C2 5.13401 5.13401 2 9 2C12.866 2 16 5.13401 16 9C16 10.5723 15.4816 12.0236 14.6064 13.1922L21.7019 20.2877C22.0924 20.6782 22.0924 21.3114 21.7019 21.7019C21.3114 22.0924 20.6782 22.0924 20.2877 21.7019L13.1922 14.6064Z"></path></svg></div></div><style data-emotion-css="xxqz7m">.css-xxqz7m{height:100%;position:absolute;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;right:0;}@media (min-width:1200px){.css-xxqz7m{display:none;padding-right:0.75rem;}}</style><div data-testid="search-documentation-reset" class="css-xxqz7m"><style data-emotion-css="1pgy7j">.css-1pgy7j{width:28px;height:28px;min-width:28px;color:currentColor;}</style><div size="28" color="currentColor" class="css-1pgy7j"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Cancel" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M17.9865 7.45711C18.3771 7.06658 18.3771 6.43342 17.9865 6.04289C17.596 5.65237 16.9628 5.65237 16.5723 6.04289L12.0294 10.5858L7.48653 6.04289C7.096 5.65237 6.46284 5.65237 6.07231 6.04289C5.68179 6.43342 5.68179 7.06658 6.07231 7.45711L10.6152 12L6.07231 16.5429C5.68179 16.9334 5.68179 17.5666 6.07231 17.9571C6.46284 18.3476 7.096 18.3476 7.48653 17.9571L12.0294 13.4142L16.5723 17.9571C16.9628 18.3476 17.596 18.3476 17.9865 17.9571C18.377 17.5666 18.377 16.9334 17.9865 16.5429L13.4436 12L17.9865 7.45711Z"></path></svg></div></div><style data-emotion-css="th0ig7">.css-th0ig7{width:100%;border-color:#BFBFBF;border-style:solid;border-width:0px;border-radius:0.25rem;padding:0 2rem;background-color:#FFFFFF;color:#161616;font-size:1rem;line-height:1.50;outline:0;}@media (min-width:1200px){.css-th0ig7{padding:0.5rem 3rem;border-width:1px;}}.css-th0ig7::-webkit-input-placeholder{color:#6A6A6A;}.css-th0ig7::-moz-placeholder{color:#6A6A6A;}.css-th0ig7:-ms-input-placeholder{color:#6A6A6A;}.css-th0ig7::placeholder{color:#6A6A6A;}</style><style data-emotion-css="1cvkw1b">.css-1cvkw1b{height:auto;width:100%;padding:0.5rem 1rem;border:1px solid rgba(191,191,191,1);background-color:rgba(251,251,251,1);border-radius:4px;line-height:1.50;font-size:1rem;font-weight:400;color:rgba(22,22,22,1);box-sizing:border-box;width:100%;border-color:#BFBFBF;border-style:solid;border-width:0px;border-radius:0.25rem;padding:0 2rem;background-color:#FFFFFF;color:#161616;font-size:1rem;line-height:1.50;outline:0;}.css-1cvkw1b:not(:placeholder-shown){background-color:rgba(255,255,255,1);}.css-1cvkw1b:disabled{background-color:rgba(255,255,255,1);border-color:rgba(212,212,212,1);color:rgba(149,149,149,1);}.css-1cvkw1b:disabled::-webkit-input-placeholder{color:rgba(149,149,149,1);opacity:1;}.css-1cvkw1b:disabled::-moz-placeholder{color:rgba(149,149,149,1);opacity:1;}.css-1cvkw1b:disabled:-ms-input-placeholder{color:rgba(149,149,149,1);opacity:1;}.css-1cvkw1b:disabled::placeholder{color:rgba(149,149,149,1);opacity:1;}.css-1cvkw1b::-webkit-input-placeholder{color:rgba(106,106,106,1);opacity:1;}.css-1cvkw1b::-moz-placeholder{color:rgba(106,106,106,1);opacity:1;}.css-1cvkw1b:-ms-input-placeholder{color:rgba(106,106,106,1);opacity:1;}.css-1cvkw1b::placeholder{color:rgba(106,106,106,1);opacity:1;}.css-1cvkw1b:focus{border:2px solid rgba(26,102,247,1);outline-color:rgba(26,102,247,1);background-color:rgba(255,255,255,1);}.css-1cvkw1b:hover:enabled{border-color:rgba(52,52,52,1);background-color:rgba(255,255,255,1);}@media (min-width:1200px){.css-1cvkw1b{padding:0.5rem 3rem;border-width:1px;}}.css-1cvkw1b::-webkit-input-placeholder{color:#6A6A6A;}.css-1cvkw1b::-moz-placeholder{color:#6A6A6A;}.css-1cvkw1b:-ms-input-placeholder{color:#6A6A6A;}.css-1cvkw1b::placeholder{color:#6A6A6A;}</style><input type="text" placeholder="Search" data-testid="search-documentation-inputbox" class="css-1cvkw1b" value=""/></form></div></div><style data-emotion-css="11zozgc">.css-11zozgc{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:none;}@media (min-width:1200px){.css-11zozgc{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}</style><style data-emotion-css="1gf5w7k">.css-1gf5w7k{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:none;}@media (min-width:1200px){.css-1gf5w7k{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}</style><div data-testid="header-default-group" class="css-1gf5w7k"><div class="css-cssveg"><style data-emotion-css="dsh0zb">.css-dsh0zb{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#161616;background-color:transparent;background:none;border:none;margin-top:0.125rem;cursor:pointer;}.css-dsh0zb:hover{-webkit-filter:invert(39%) sepia(99%) saturate(634%) hue-rotate(105deg) brightness(83%) contrast(97%);filter:invert(39%) sepia(99%) saturate(634%) hue-rotate(105deg) brightness(83%) contrast(97%);}@media (max-width:768px){.css-dsh0zb:hover{-webkit-filter:none;filter:none;}}</style><button data-testid="globe-btn" class="css-dsh0zb"><style data-emotion-css="14mcfqm">.css-14mcfqm{height:1.5rem;width:1.5rem;background-color:transparent;color:#161616;}</style><div class="css-14mcfqm"><svg fill="none" aria-label="Globe" role="img" height="28px" width="28px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g stroke="currentColor" stroke-miterlimit="10" stroke-width="1.25"><path d="m9.00001 17.3077c4.58819 0 8.30769-3.7195 8.30769-8.30771s-3.7195-8.307693-8.30769-8.307693c-4.58821 0-8.307688 3.719483-8.307688 8.307693s3.719478 8.30771 8.307688 8.30771z"></path><path d="m9 17.3077c1.7639 0 3.1938-3.7195 3.1938-8.30771s-1.4299-8.307693-3.1938-8.307693c-1.76391 0-3.19385 3.719483-3.19385 8.307693s1.42994 8.30771 3.19385 8.30771z"></path><path d="m.692322 6.44307h16.615378"></path><path d="m.692322 11.5569h16.615378"></path></g></svg></div></button></div><style data-emotion-css="1syyx6e">.css-1syyx6e{padding-left:1.5rem;}@media (max-width:768px){.css-1syyx6e{margin:1.5rem 1rem;}}</style><div class="css-1syyx6e"><style data-emotion-css="h3y3qz">.css-h3y3qz{background-color:rgba(4,155,74,1) !important;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;height:48px;font-size:18px;line-height:1.5rem !important;font-weight:700;font-style:normal;border-radius:0.25rem;border:none;-webkit-transition:background-color 300ms;transition:background-color 300ms;-webkit-flex:auto 0 0;-ms-flex:auto 0 0;flex:auto 0 0;}.css-h3y3qz:hover:enabled{cursor:pointer;}.css-h3y3qz:disabled{opacity:0.5;cursor:not-allowed;}.css-h3y3qz:hover{background-color:rgba(4,140,67,1) !important;}.css-h3y3qz:active{background-color:#00701B !important;}</style><style data-emotion-css="1ylpp6l">.css-1ylpp6l{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.5rem 1rem;font-size:0.875rem;font-weight:500;line-height:1.7142857143;border-radius:4px;border:none;-webkit-transition:background-color 300ms;transition:background-color 300ms;-webkit-flex:auto 0 0;-ms-flex:auto 0 0;flex:auto 0 0;color:#FFFFFF;background-color:#1A66F7;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;cursor:pointer;-webkit-text-decoration:none;text-decoration:none;background-color:rgba(4,155,74,1) !important;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;height:48px;font-size:18px;line-height:1.5rem !important;font-weight:700;font-style:normal;border-radius:0.25rem;border:none;-webkit-transition:background-color 300ms;transition:background-color 300ms;-webkit-flex:auto 0 0;-ms-flex:auto 0 0;flex:auto 0 0;}.css-1ylpp6l:hover:enabled{cursor:pointer;}.css-1ylpp6l:disabled{opacity:0.5;cursor:not-allowed;}.css-1ylpp6l:focus{outline:none;box-shadow:0px 0px 0 1px #FFFFFF, 0px 0px 0px 0.125rem #3495db, 0px 0px 0.125rem 0.125rem #3495db;}.css-1ylpp6l:focus:disabled{box-shadow:none;}.css-1ylpp6l:hover:enabled{background-color:#2152E5;}.css-1ylpp6l:active{background-color:#003DB8;}.css-1ylpp6l:hover:enabled{cursor:pointer;}.css-1ylpp6l:disabled{opacity:0.5;cursor:not-allowed;}.css-1ylpp6l:hover{background-color:rgba(4,140,67,1) !important;}.css-1ylpp6l:active{background-color:#00701B !important;}</style><a href="https://circleci.com/signup/" class="css-1ylpp6l">Start Building for Free</a></div></div><style data-emotion-css="ml1eyx">.css-ml1eyx{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-height:1.5rem;height:1.5rem;}@media (min-width:1200px){.css-ml1eyx{display:none;}}</style><style data-emotion-css="qlr832">.css-qlr832{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-height:1.5rem;height:1.5rem;}@media (min-width:1200px){.css-qlr832{display:none;}}</style><div data-testid="header-mobile-group" class="css-qlr832"><style data-emotion-css="hmc50w">.css-hmc50w{display:inline-block;padding-right:0.5rem;cursor:pointer;width:2rem;-webkit-transition:opacity 0.25s ease;transition:opacity 0.25s ease;}</style><style data-emotion-css="1qtr1z7">.css-1qtr1z7{width:24px;height:24px;min-width:24px;color:currentColor;display:inline-block;padding-right:0.5rem;cursor:pointer;width:2rem;-webkit-transition:opacity 0.25s ease;transition:opacity 0.25s ease;}</style><div size="24" color="currentColor" class="css-1qtr1z7"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Search" data-testid="header-mobile-search-button" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path fill-rule="evenodd" clip-rule="evenodd" d="M14 9C14 11.7614 11.7614 14 9 14C6.23858 14 4 11.7614 4 9C4 6.23858 6.23858 4 9 4C11.7614 4 14 6.23858 14 9ZM13.1922 14.6064C12.0236 15.4816 10.5723 16 9 16C5.13401 16 2 12.866 2 9C2 5.13401 5.13401 2 9 2C12.866 2 16 5.13401 16 9C16 10.5723 15.4816 12.0236 14.6064 13.1922L21.7019 20.2877C22.0924 20.6782 22.0924 21.3114 21.7019 21.7019C21.3114 22.0924 20.6782 22.0924 20.2877 21.7019L13.1922 14.6064Z"></path></svg></div><style data-emotion-css="pdp0ok">.css-pdp0ok{height:24px;width:1px;background:#161616;}</style><div class="css-pdp0ok"></div><style data-emotion-css="1j3dzco">.css-1j3dzco{background:none;border:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:64px;width:40px;padding-right:0px;padding-left:0px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:-8px;cursor:pointer;color:#161616;}</style><button class="css-1j3dzco"><div size="24" color="currentColor" class="css-19wtgi5"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Menu" data-testid="header-mobile-menu-icon" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M3 7H21C21.5523 7 22 6.55228 22 6C22 5.44772 21.5523 5 21 5H3C2.44772 5 2 5.44772 2 6C2 6.55228 2.44772 7 3 7ZM3 13H21C21.5523 13 22 12.5523 22 12C22 11.4477 21.5523 11 21 11H3C2.44772 11 2 11.4477 2 12C2 12.5523 2.44772 13 3 13ZM21 19H3C2.44772 19 2 18.5523 2 18C2 17.4477 2.44772 17 3 17H21C21.5523 17 22 17.4477 22 18C22 18.5523 21.5523 19 21 19Z"></path></svg></div></button></div></div><style data-emotion-css="9496lj">.css-9496lj{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-height:50px;}</style><div data-testid="header-navbar" class="css-9496lj"><style data-emotion-css="acydq">.css-acydq{padding:0 1rem;}@media (min-width:1200px){.css-acydq{padding:0 1.5rem;}}</style><style data-emotion-css="wt4rcw">.css-wt4rcw{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:0 1rem;}@media (min-width:1200px){.css-wt4rcw{padding:0 1.5rem;}}</style><div class="css-wt4rcw"><style data-emotion-css="1666bo6">.css-1666bo6 > div{border-bottom-width:0;}</style><div id="navbar-tablist" role="tablist" aria-label="Navigation Tabs" class="css-1666bo6"><style data-emotion-css="1h7v07b">.css-1h7v07b{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;border-bottom-color:#D4D4D4;border-bottom-width:1px;border-bottom-style:solid;}</style><div class="css-1h7v07b"><style data-emotion-css="vu8356">.css-vu8356{-webkit-text-decoration:none;text-decoration:none;color:#6A6A6A;}.css-vu8356:hover{color:#161616;}.css-vu8356:active{color:#161616;}</style><a href="/developer/" class="css-vu8356"><style data-emotion-css="19fv6ph">.css-19fv6ph{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:56px;color:#6A6A6A;font-weight:500;font-size:0.875rem;border:none;margin:0;padding:1rem 0.75rem;background-color:#FFFFFF;line-height:1.50;text-transform:uppercase;cursor:pointer;}.css-19fv6ph:hover{color:#161616;}.css-19fv6ph[aria-selected='true']{color:#161616;font-weight:700;box-shadow:inset 0 -0.25rem #1A66F7;}.js-focus-visible .css-19fv6ph:focus{outline:none;z-index:1;box-shadow:0 0 0.25rem #1A66F7, -1px 1px 0 #1A66F7,1px -1px 0 #1A66F7, 1px 1px 0 #1A66F7,-1px -1px 0 #1A66F7;}.js-focus-visible .css-19fv6ph:focus.css-19fv6ph[aria-selected='true']{box-shadow:0 0 0.25rem #1A66F7, -1px 1px 0 #1A66F7,1px -1px 0 #1A66F7, 1px 1px 0 #1A66F7,-1px -1px 0 #1A66F7, inset 0 -0.25rem #1A66F7;}.js-focus-visible .css-19fv6ph:focus:not(.focus-visible),.js-focus-visible .css-19fv6ph:focus.css-19fv6ph[aria-selected='true']:not(.focus-visible){outline:none;box-shadow:inset 0 -0.25rem #1A66F7;}</style><button id="home" tabindex="0" aria-selected="false" role="tab" type="button" class="css-19fv6ph">Home</button></a><a href="/docs/" class="css-vu8356"><button id="docs" tabindex="0" aria-selected="true" role="tab" type="button" class="css-19fv6ph">Docs</button></a><a href="/developer/orbs/" class="css-vu8356"><button id="orbs" tabindex="0" aria-selected="false" role="tab" type="button" class="css-19fv6ph">Orbs</button></a><a href="/developer/images/" class="css-vu8356"><button id="images" tabindex="0" aria-selected="false" role="tab" type="button" class="css-19fv6ph">Images</button></a></div></div><style data-emotion-css="k9jl6u">.css-k9jl6u{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:none;}.css-k9jl6u span:last-of-type{padding-right:0;}@media (min-width:1200px){.css-k9jl6u{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}</style><style data-emotion-css="1chu1ls">.css-1chu1ls{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:none;}.css-1chu1ls span:last-of-type{padding-right:0;}@media (min-width:1200px){.css-1chu1ls{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}}</style><div class="css-1chu1ls"><style data-emotion-css="2wgwcz">.css-2wgwcz{padding-right:1.5rem;font-family:'Roboto';}.css-2wgwcz > a{color:#6A6A6A;}.css-2wgwcz > a:hover{color:#161616;}</style><span class="css-2wgwcz"><style data-emotion-css="x7gnkn">.css-x7gnkn{color:#0078CA;-webkit-text-decoration:none;text-decoration:none;font-size:1rem;line-height:1.50;font-weight:500;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-column-gap:3px;column-gap:3px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}.css-x7gnkn:hover{color:#0062B0;-webkit-text-decoration:underline;text-decoration:underline;}</style><a href="https://circleci.com/" target="_blank" rel="noopener noreferrer" data-testid="link" class="css-x7gnkn">CircleCI.com</a></span><span class="css-2wgwcz"><a href="https://circleci.com/training/" target="_blank" rel="noopener noreferrer" data-testid="link" class="css-x7gnkn">Academy</a></span><span class="css-2wgwcz"><a href="https://circleci.com/blog/" target="_blank" rel="noopener noreferrer" data-testid="link" class="css-x7gnkn">Blog</a></span><span class="css-2wgwcz"><a href="https://discuss.circleci.com/" target="_blank" rel="noopener noreferrer" data-testid="link" class="css-x7gnkn">Community</a></span><span class="css-2wgwcz"><a href="https://support.circleci.com/hc/en-us/" target="_blank" rel="noopener noreferrer" data-testid="link" class="css-x7gnkn">Support</a></span></div></div></div></div><style data-emotion-css="1alxkfq">.css-1alxkfq{background-color:#008647;height:2px;width:0%;margin:0;padding:0;-webkit-transition-property:width;transition-property:width;-webkit-transition-duration:0.1s;transition-duration:0.1s;-webkit-transition-timing-function:linear;transition-timing-function:linear;position:fixed;top:122px;left:0;z-index:45;}@media (min-width:1200px){.css-1alxkfq{top:128px;}}</style><div width="0" height="2" class="css-1alxkfq"></div><style data-emotion-css="1yce0ae">.css-1yce0ae{width:100%;top:128;}</style><style data-emotion-css="1cibq5g">.css-1cibq5g{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:100%;top:128;}</style><div class="css-1cibq5g"></div><style data-emotion-css="3giiur">.css-3giiur{width:100%;max-width:1920px;margin:auto;}</style><style data-emotion-css="dgbsjx">.css-dgbsjx{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:inherit;-webkit-flex-grow:inherit;-ms-flex-positive:inherit;flex-grow:inherit;top:128px;width:100%;max-width:1920px;margin:auto;}</style><div class="css-dgbsjx"><style data-emotion-css="1y2jjs3">.css-1y2jjs3{display:none;}@media (min-width:1200px){.css-1y2jjs3{display:block;}}</style><style data-emotion-css="klrqbz">.css-klrqbz{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex:1;-ms-flex:1;flex:1;display:none;}@media screen and (min-width:480px){.css-klrqbz{-webkit-flex:1;-ms-flex:1;flex:1;}}@media screen and (min-width:768px){.css-klrqbz{-webkit-flex:0 0 288px;-ms-flex:0 0 288px;flex:0 0 288px;}}@media (min-width:1200px){.css-klrqbz{display:block;}}</style><nav class="css-klrqbz"><style data-emotion-css="11fl4l6">.css-11fl4l6{width:100%;background:white;}.css-11fl4l6 ul{padding-left:0.75rem;}.css-11fl4l6 ul + subSection{margin-top:0.5rem;}.css-11fl4l6 li{list-style-type:none;}@media (min-width:1200px){.css-11fl4l6{background:#f7f7f7;border-right:1px solid #e2e0e0;height:calc(100vh - 128px);overflow-y:scroll;padding:0px 22px 0px 0px;position:fixed;width:288px;}}</style><div class="css-11fl4l6"><style data-emotion-css="hce1c">.css-hce1c{padding-left:0px !important;margin-top:-1.5rem;}@media (min-width:1200px){.css-hce1c{padding-left:1.5rem !important;margin-top:0px;}}</style><ul data-testid="sidebar-drawers" class="css-hce1c"><style data-emotion-css="13svt41">.css-13svt41{cursor:pointer;margin-top:1.5rem;position:relative;list-style-type:none;font-size:14px;font-weight:600;color:#555;}</style><li class="css-13svt41"><style data-emotion-css="1sg2lsz">.css-1sg2lsz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><div class="css-1sg2lsz"><style data-emotion-css="1m34rt5">.css-1m34rt5{margin-right:6px;width:24px;height:24px;}</style><img src="/docs/assets/img/icons/sidebar/circle-logo.svg" alt="About CircleCI icon" class="css-1m34rt5"/><style data-emotion-css="10tjyd0">.css-10tjyd0{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}</style><div class="css-10tjyd0">About CircleCI</div><style data-emotion-css="1tezdrc">.css-1tezdrc{padding:0.25rem;-webkit-transition:-webkit-transform 0.2s ease;-webkit-transition:transform 0.2s ease;transition:transform 0.2s ease;}</style><style data-emotion-css="1vlg0km">.css-1vlg0km{width:24px;height:24px;min-width:24px;color:#333;padding:0.25rem;-webkit-transition:-webkit-transform 0.2s ease;-webkit-transition:transform 0.2s ease;transition:transform 0.2s ease;}</style><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/continue.svg" alt="Getting started icon" class="css-1m34rt5"/><div class="css-10tjyd0">Getting started</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/changelog.svg" alt="Reference icon" class="css-1m34rt5"/><div class="css-10tjyd0">Reference</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/pipeline.svg" alt="Orchestrate and trigger icon" class="css-1m34rt5"/><div class="css-10tjyd0">Orchestrate and trigger</div><style data-emotion-css="nnsjfc">.css-nnsjfc{padding:0.25rem;-webkit-transition:-webkit-transform 0.2s ease;-webkit-transition:transform 0.2s ease;transition:transform 0.2s ease;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);}</style><style data-emotion-css="a2qlhg">.css-a2qlhg{width:24px;height:24px;min-width:24px;color:#333;padding:0.25rem;-webkit-transition:-webkit-transform 0.2s ease;-webkit-transition:transform 0.2s ease;transition:transform 0.2s ease;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);}</style><div size="24" color="#333" class="css-a2qlhg"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div><style data-emotion-css="i6zvb9">.css-i6zvb9{list-style-type:none;}</style><ul class="css-i6zvb9"><style data-emotion-css="1n64q0m">.css-1n64q0m{margin-top:16px;}</style><div class="subSection css-1n64q0m"><style data-emotion-css="4h1kga">.css-4h1kga{color:#555555;display:inline-block;font-size:13px;font-weight:500;-webkit-letter-spacing:0.5px;-moz-letter-spacing:0.5px;-ms-letter-spacing:0.5px;letter-spacing:0.5px;margin:0.5rem 0 0 1rem;text-transform:uppercase;}.css-4h1kga a{-webkit-text-decoration:none;text-decoration:none;color:#555555;font-size:12px;}.css-4h1kga a:hover{color:#27a0b6;}</style><div class="css-4h1kga">Orchestrate</div><ul class="css-i6zvb9"><style data-emotion-css="7cjp2v">.css-7cjp2v{margin-top:0.5rem;}.css-7cjp2v svg{fill:#555555;}.css-7cjp2v:hover svg{fill:#0062b0;}</style><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/pipelines/" class="css-x7gnkn"><style data-emotion-css="8bro8e">.css-8bro8e{color:#555555;margin:0 0 0 1rem;display:inline-block;margin-left:30px;font-weight:400;font-size:0.875rem;-webkit-text-decoration:none;text-decoration:none;}.css-8bro8e:hover{color:#0062b0;}</style><span class="css-8bro8e">Pipelines overview</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/jobs-steps/" class="css-x7gnkn"><span class="css-8bro8e">Jobs and steps</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/workflows/" class="css-x7gnkn"><style data-emotion-css="1ouqygm">.css-1ouqygm{color:inherit;margin:0 0 0 1rem;display:inline-block;margin-left:30px;font-weight:400;font-size:0.875rem;-webkit-text-decoration:none;text-decoration:none;}.css-1ouqygm:hover{color:#0062b0;}</style><span class="css-1ouqygm">Workflow orchestration</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/workspaces/" class="css-x7gnkn"><span class="css-8bro8e">Use workspaces to share data between jobs</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/dynamic-config/" class="css-x7gnkn"><span class="css-8bro8e">Dynamic configuration</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/skip-build/" class="css-x7gnkn"><span class="css-8bro8e">Skip CI and cancel workflows</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/pipeline-variables/" class="css-x7gnkn"><span class="css-8bro8e">Pipeline values and parameters</span></a></span></li></ul></div><div class="subSection css-1n64q0m"><div class="css-4h1kga">Schedule</div><ul class="css-i6zvb9"><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/scheduled-pipelines/" class="css-x7gnkn"><span class="css-8bro8e">Scheduled pipelines</span></a></span></li></ul></div><div class="subSection css-1n64q0m"><div class="css-4h1kga">Trigger</div><ul class="css-i6zvb9"><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/triggers-overview/" class="css-x7gnkn"><span class="css-8bro8e">Triggers overview</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/webhooks/" class="css-x7gnkn"><span class="css-8bro8e">Webhook integration</span></a></span></li></ul></div><div class="subSection css-1n64q0m"><div class="css-4h1kga">How-to guides</div><ul class="css-i6zvb9"><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/set-up-multiple-configuration-files-for-a-project/" class="css-x7gnkn"><span class="css-8bro8e">Set up multiple configuration files for a project</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/notify-a-slack-channel-of-a-paused-workflow/" class="css-x7gnkn"><span class="css-8bro8e">Notify a Slack channel of a paused workflow</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/using-branch-filters/" class="css-x7gnkn"><span class="css-8bro8e">Use branch filters</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/selecting-a-workflow-to-run-using-pipeline-parameters/" class="css-x7gnkn"><span class="css-8bro8e">Selecting a workflow to run</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/using-dynamic-configuration/" class="css-x7gnkn"><span class="css-8bro8e">Use dynamic configuration</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/migrate-scheduled-workflows-to-scheduled-pipelines/" class="css-x7gnkn"><span class="css-8bro8e">Migrate scheduled workflows to scheduled pipelines</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/schedule-pipelines-with-multiple-workflows/" class="css-x7gnkn"><span class="css-8bro8e">Schedule pipelines with multiple workflows</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/set-a-nightly-scheduled-pipeline/" class="css-x7gnkn"><span class="css-8bro8e">Set a nightly scheduled pipeline</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/using-dynamic-configuration/" class="css-x7gnkn"><span class="css-8bro8e">Use dynamic configuration</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/databases/" class="css-x7gnkn"><span class="css-8bro8e">Configure databases</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/migrate-from-deploy-to-run/" class="css-x7gnkn"><span class="css-8bro8e">Migrate from deploy to run</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/using-shell-scripts/" class="css-x7gnkn"><span class="css-8bro8e">Using shell scripts</span></a></span></li></ul></div><div class="subSection css-1n64q0m"><div class="css-4h1kga">Reference</div><ul class="css-i6zvb9"><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/variables/" class="css-x7gnkn"><span class="css-8bro8e">Project values and variables</span></a></span></li><li class="css-7cjp2v"><span><a data-testid="link" href="/docs/troubleshoot/" class="css-x7gnkn"><span class="css-8bro8e">Troubleshoot</span></a></span></li></ul></div></ul></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/builds.svg" alt="Execute jobs on managed compute resources icon" class="css-1m34rt5"/><div class="css-10tjyd0">Execute jobs on managed compute resources</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/build-agent.svg" alt="Execute jobs on self-hosted runners icon" class="css-1m34rt5"/><div class="css-10tjyd0">Execute jobs on self-hosted runners</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/passed.svg" alt="Test icon" class="css-1m34rt5"/><div class="css-10tjyd0">Test</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/getting-started-new.svg" alt="Deploy icon" class="css-1m34rt5"/><div class="css-10tjyd0">Deploy</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/release.svg" alt="Release icon" class="css-1m34rt5"/><div class="css-10tjyd0">Release</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/sparkle.svg" alt="Optimize icon" class="css-1m34rt5"/><div class="css-10tjyd0">Optimize</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/insights-new.svg" alt="Project Insights icon" class="css-1m34rt5"/><div class="css-10tjyd0">Project Insights</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/orb.svg" alt="Package and re-use config with orbs icon" class="css-1m34rt5"/><div class="css-10tjyd0">Package and re-use config with orbs</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/avatar.svg" alt="Manage roles, permissions, and authentication icon" class="css-1m34rt5"/><div class="css-10tjyd0">Manage roles, permissions, and authentication</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/key.svg" alt="Manage security and secrets icon" class="css-1m34rt5"/><div class="css-10tjyd0">Manage security and secrets</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/lock.svg" alt="Manage config policies icon" class="css-1m34rt5"/><div class="css-10tjyd0">Manage config policies</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/webhook.svg" alt="Integration icon" class="css-1m34rt5"/><div class="css-10tjyd0">Integration</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/code.svg" alt="Developer toolkit icon" class="css-1m34rt5"/><div class="css-10tjyd0">Developer toolkit</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/admin-new.svg" alt="Server administration v4.7 icon" class="css-1m34rt5"/><div class="css-10tjyd0">Server administration v4.7</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/admin-new.svg" alt="Server administration v4.6 icon" class="css-1m34rt5"/><div class="css-10tjyd0">Server administration v4.6</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/admin-new.svg" alt="Server administration v4.5 icon" class="css-1m34rt5"/><div class="css-10tjyd0">Server administration v4.5</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/admin-new.svg" alt="Server administration v4.4 icon" class="css-1m34rt5"/><div class="css-10tjyd0">Server administration v4.4</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/admin-new.svg" alt="Server administration v4.3 icon" class="css-1m34rt5"/><div class="css-10tjyd0">Server administration v4.3</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/admin-new.svg" alt="Server administration v4.2 icon" class="css-1m34rt5"/><div class="css-10tjyd0">Server administration v4.2</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/admin-new.svg" alt="Server administration v4.1 icon" class="css-1m34rt5"/><div class="css-10tjyd0">Server administration v4.1</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/plans-outline.svg" alt="Plans and pricing icon" class="css-1m34rt5"/><div class="css-10tjyd0">Plans and pricing</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li><li class="css-13svt41"><div class="css-1sg2lsz"><img src="/docs/assets/img/icons/sidebar/changelog.svg" alt="Contributing to CircleCI docs icon" class="css-1m34rt5"/><div class="css-10tjyd0">Contributing to CircleCI docs</div><div size="24" color="#333" class="css-1vlg0km"><svg role="img" focusable="false" viewBox="0 0 16 16" aria-label="Arrow Right" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M10.7071 7.29289C11.0976 7.68342 11.0976 8.31658 10.7071 8.70711L5.70711 13.7071C5.31658 14.0976 4.68342 14.0976 4.29289 13.7071C3.90237 13.3166 3.90237 12.6834 4.29289 12.2929L8.58579 8L4.29289 3.70711C3.90237 3.31658 3.90237 2.68342 4.29289 2.29289C4.68342 1.90237 5.31658 1.90237 5.70711 2.29289L10.7071 7.29289Z"></path></svg></div></div></li></ul></div></nav><style data-emotion-css="lfzoxb">.css-lfzoxb{padding:3rem 2.5rem 0 2.5rem;}@media (max-width:768px){.css-lfzoxb{padding:1.5rem 1rem;}}</style><style data-emotion-css="1xwsbgo">.css-1xwsbgo{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex:1;-ms-flex:1;flex:1;padding:3rem 2.5rem 0 2.5rem;}@media (max-width:768px){.css-1xwsbgo{padding:1.5rem 1rem;}}</style><main class="css-1xwsbgo"><article> <style data-emotion-css="ha3tto">.css-ha3tto{color:#555555;font-size:1rem;line-height:1.5rem;}.css-ha3tto .circle-green{color:#04aa4e;}.css-ha3tto .circle-red{color:#c13937;}.css-ha3tto p{margin-top:0px;margin-bottom:10px;}.css-ha3tto ol,.css-ha3tto ul{margin-bottom:10px;margin-top:0;}.css-ha3tto .table-striped{margin:1.5rem 0;}.css-ha3tto .table{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;table-layout:auto;}.css-ha3tto .table thead{background:#F7F7F7;}.css-ha3tto .table th,.css-ha3tto .table td{line-height:1.50;padding:0.5rem;text-align:left;vertical-align:top;}.css-ha3tto .table th{border-bottom:1px solid #E3E3E3;color:#555555;font-weight:500;font-size:1rem;}.css-ha3tto .table tr th:first-of-type code.language-plaintext,.css-ha3tto .table tr td:first-of-type code.language-plaintext{white-space:nowrap !important;}.css-ha3tto .table.table-striped > tbody > tr:nth-of-type(even){background-color:#F7F7F7;}.css-ha3tto .table.table-no-background > tbody > tr:nth-of-type(even){background:none;}.css-ha3tto .table.table-migrating-page tr > td:not(:only-child):first-of-type{padding-left:0;padding-right:0.25rem;}.css-ha3tto .table.table-migrating-page tr>td+td{padding-left:0.25rem;padding-right:0;}.css-ha3tto .table.table-migrating-page tbody > tr:nth-of-type(even){background:none;}.css-ha3tto .table td :not(pre)>code{word-wrap:normal;}.css-ha3tto hr{border:0;border-top:1px solid #E3E3E3;width:100%;margin:1.5rem 0;}.css-ha3tto .video-wrapper,.css-ha3tto .videoblock{height:0;padding-bottom:56.25%;padding-top:25px;position:relative;margin:1.25rem 0;}</style><div class="css-ha3tto"><style data-emotion-css="2va2ht">.css-2va2ht{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}</style><div class="css-2va2ht"><style data-emotion-css="qcooo9">.css-qcooo9{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}</style><div class="css-qcooo9"><style data-emotion-css="16173t9">.css-16173t9{max-width:calc( 960px - 48px - 48px );}@media (min-width:1300px){.css-16173t9{width:calc(100% - 400px);}}</style><div class="css-16173t9"><section data-testid="content-page-heading"><style data-emotion-css="1d5kwgy">.css-1d5kwgy{margin-bottom:1rem;margin-top:0;font-size:2.25rem;font-weight:500;color:#161616;line-height:52px;}</style><h1 class="css-1d5kwgy">Workflow orchestration</h1><style data-emotion-css="12ut1uv">.css-12ut1uv{background:#FFFFFF;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border:1px solid #D4D4D4;border-radius:4px;box-sizing:border-box;margin:1rem 0;font-size:15px;}@media (max-width:891px){.css-12ut1uv{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:0.5rem;}}</style><div class="css-12ut1uv"><style data-emotion-css="tkbaat">.css-tkbaat{padding:0.125rem;margin-left:0.5rem;margin-right:1rem;}@media (max-width:891px){.css-tkbaat{margin-left:0.2em;}}</style><style data-emotion-css="ib8kn6">.css-ib8kn6{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:0.125rem;margin-left:0.5rem;margin-right:1rem;}@media (max-width:891px){.css-ib8kn6{margin-left:0.2em;}}</style><div class="css-ib8kn6"><style data-emotion-css="2iw00g">.css-2iw00g{width:1.5rem;margin:0.5rem;}</style><div class="css-2iw00g"><div size="24" color="currentColor" class="css-19wtgi5"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Duration" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M12 20C15.866 20 19 16.866 19 13C19 9.13401 15.866 6 12 6C8.13401 6 5 9.13401 5 13C5 16.866 8.13401 20 12 20ZM12 22C7.02944 22 3 17.9706 3 13C3 8.02944 7.02944 4 12 4C16.9706 4 21 8.02944 21 13C21 17.9706 16.9706 22 12 22ZM11 1H13C13.5523 1 14 1.44772 14 2C14 2.55228 13.5523 3 13 3H11C10.4477 3 10 2.55228 10 2C10 1.44772 10.4477 1 11 1ZM19.7782 3.80761L21.1924 5.22183C21.5829 5.61235 21.5829 6.24551 21.1924 6.63604C20.8019 7.02656 20.1687 7.02656 19.7782 6.63604L18.364 5.22183C17.9734 4.8313 17.9734 4.19814 18.364 3.80761C18.7545 3.41709 19.3876 3.41709 19.7782 3.80761ZM13 9V12.5858L14.7071 14.2929C15.0976 14.6834 15.0976 15.3166 14.7071 15.7071C14.3166 16.0976 13.6834 16.0976 13.2929 15.7071L11.2929 13.7071C11.1054 13.5196 11 13.2652 11 13V9C11 8.44772 11.4477 8 12 8C12.5523 8 13 8.44772 13 9Z"></path></svg></div></div><style data-emotion-css="gw0ftn">.css-gw0ftn > span{line-height:1.5rem;}</style><div data-tip="true" data-for="readUpdateTime" class="css-gw0ftn"><span data-testid="git-file-link"><style data-emotion-css="qjll1l">.css-qjll1l a{font-size:15px;}</style><span class="css-qjll1l"><a href="https://github.com/circleci/circleci-docs/commits/master/jekyll/_cci2/workflows.adoc" target="_blank" rel="noopener noreferrer" data-testid="external-git-file-link" class="css-x7gnkn">5 days ago</a></span></span><style data-emotion-css="1sqa8jq">.css-1sqa8jq{line-height:1.5rem;}.css-1sqa8jq:before{background:#343434;border-radius:50%;content:"\a";display:inline-block;height:3px;margin:0 5px 3px 5px;width:3px;}</style><span data-testid="content-read-time" class="css-1sqa8jq">13<!-- --> min read</span></div><style data-emotion-css="1ioox4k">.css-1ioox4k{background-color:#2B2B2B;color:#FFFFFF;text-align:center;border-radius:5px;padding:0.25rem 0.5rem;font-size:0.8125rem;font-weight:700;z-index:1;}</style></div><style data-emotion-css="100omiu">.css-100omiu{border-left:1px solid #ddd;padding:0.125rem 0.25rem;}@media (max-width:891px){.css-100omiu{border-left:none;}}</style><style data-emotion-css="brpd47">.css-brpd47{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;border-left:1px solid #ddd;padding:0.125rem 0.25rem;}@media (max-width:891px){.css-brpd47{border-left:none;}}</style><div data-testid="FrontMatterTags" class="css-brpd47"><div class="css-2iw00g"><div size="24" color="currentColor" class="css-19wtgi5"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Tag" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M14.2929 2.29289C14.6834 1.90237 15.3166 1.90237 15.7071 2.29289L21.7071 8.29289C22.0977 8.68342 22.0977 9.31658 21.7071 9.70711L9.70714 21.7071C9.42114 21.9931 8.99102 22.0787 8.61735 21.9239C8.24367 21.7691 8.00003 21.4045 8.00003 21V16H3.00003C2.59557 16 2.23093 15.7564 2.07615 15.3827C1.92137 15.009 2.00692 14.5789 2.29292 14.2929L14.2929 2.29289ZM5.41424 14H9.00003C9.55231 14 10 14.4477 10 15V18.5858L19.5858 9L15 4.41421L5.41424 14Z"></path> </svg></div></div><div data-tip="true" data-for="Cloud"><style data-emotion-css="15alkjj">.css-15alkjj{line-height:1.5rem;}</style><span class="css-15alkjj">Cloud</span></div><div data-tip="true" data-for="Server v4.x"><span class="css-1sqa8jq">Server v4.x</span></div><div data-tip="true" data-for="Server v3.x"><span class="css-1sqa8jq">Server v3.x</span></div></div></div></section></div><style data-emotion-css="wurzvf">.css-wurzvf{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}@media (min-width:1300px){.css-wurzvf{-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;}}</style><style data-emotion-css="w4wk6o">.css-w4wk6o{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}@media (min-width:1300px){.css-w4wk6o{-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;}}</style><div class="css-w4wk6o"><style data-emotion-css="c06me2">.css-c06me2{max-height:auto;}</style><div class="css-c06me2"><style data-emotion-css="gjrqsi">@media (max-width:1300px){.css-gjrqsi{margin:1.5rem 0 2.5rem 0;}}@media (min-width:1300px){.css-gjrqsi{position:-webkit-sticky;position:sticky;top:100px;margin-top:-100px;padding-left:3rem;padding-right:0.5rem;max-height:calc(100vh - 140px);overflow-y:auto;width:400px;}}.css-gjrqsi ul{list-style-type:none;margin-bottom:0;}</style><div data-testid="right-bar" class="css-gjrqsi"><style data-emotion-css="1u486hm">.css-1u486hm{font-size:1rem;font-weight:500;margin:0;}</style><h5 data-testid="on-this-page" class="css-1u486hm">On This Page</h5><style data-emotion-css="7w93ns">.css-7w93ns{margin-left:0.25rem;padding-left:10px;border-left:2px solid #F1F1F1;}</style><ul data-testid="toc-list" class="css-7w93ns"><style data-emotion-css="15ss6d4">.css-15ss6d4{list-style-type:none;margin:0.5rem 0;margin-left:0rem;padding:0 8px;}</style><li data-testid="toc-entry" class="css-15ss6d4"><style data-emotion-css="rvafwm">.css-rvafwm a{color:#343434;font-weight:400;}.css-rvafwm a:hover{-webkit-text-decoration:underline;text-decoration:underline;}</style><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#overview" class="css-x7gnkn">Overview</a></span></li><li data-testid="toc-entry" class="css-15ss6d4"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#workflows-configuration-examples" class="css-x7gnkn">Workflows configuration examples</a></span></li><style data-emotion-css="1kc30t0">.css-1kc30t0{list-style-type:none;margin:0.5rem 0;margin-left:1rem;padding:0 8px;}</style><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#concurrent-job-execution" class="css-x7gnkn">Concurrent job execution</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#sequential-job-execution" class="css-x7gnkn">Sequential job execution</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#fan-outfan-in-workflow" class="css-x7gnkn">Fan-out/fan-in workflow</a></span></li><li data-testid="toc-entry" class="css-15ss6d4"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#holding-a-workflow-for-a-manual-approval" class="css-x7gnkn">Hold a workflow for a manual approval</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#configure-an-approval-job" class="css-x7gnkn">Configure an approval job</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#approve-a-job" class="css-x7gnkn">Approve a job</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#cancel-a-job" class="css-x7gnkn">Cancel a job</a></span></li><li data-testid="toc-entry" class="css-15ss6d4"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#scheduling-a-workflow" class="css-x7gnkn">Scheduling a workflow</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#nightly-example" class="css-x7gnkn">Build every night</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#specifying-a-valid-schedule" class="css-x7gnkn">Specifying a valid schedule</a></span></li><li data-testid="toc-entry" class="css-15ss6d4"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#using-job-contexts-to-share-environment-variables" class="css-x7gnkn">Using contexts to share and secure environment variables</a></span></li><li data-testid="toc-entry" class="css-15ss6d4"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#use-conditional-logic-in-workflows" class="css-x7gnkn">Use conditional logic in workflows</a></span></li><li data-testid="toc-entry" class="css-15ss6d4"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#using-filters-in-your-workflows" class="css-x7gnkn">Using filters in your workflows</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#branch-level-job-execution" class="css-x7gnkn">Branch-level job execution</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#executing-workflows-for-a-git-tag" class="css-x7gnkn">Executing workflows for a git tag</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#using-regular-expressions-to-filter-tags-and-branches" class="css-x7gnkn">Using regular expressions to filter tags and branches</a></span></li><li data-testid="toc-entry" class="css-15ss6d4"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#using-workspaces-to-share-data-between-jobs" class="css-x7gnkn">Using workspaces to share data between jobs</a></span></li><li data-testid="toc-entry" class="css-15ss6d4"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#rerunning-a-workflows-failed-jobs" class="css-x7gnkn">Rerunning a workflow’s failed jobs</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#states" class="css-x7gnkn">Workflow states</a></span></li><li data-testid="toc-entry" class="css-15ss6d4"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#troubleshooting" class="css-x7gnkn">Troubleshooting</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#workflow-and-subsequent-jobs-do-not-trigger" class="css-x7gnkn">Workflow and subsequent jobs do not trigger</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#rerunning-workflows-fails" class="css-x7gnkn">Rerunning workflows fails</a></span></li><li data-testid="toc-entry" class="css-1kc30t0"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#workflows-waiting-for-status-in-github" class="css-x7gnkn">Workflows waiting for status in GitHub</a></span></li><li data-testid="toc-entry" class="css-15ss6d4"><span class="styled-link css-rvafwm"><a data-testid="link" href="/docs/workflows/#see-also" class="css-x7gnkn">See also</a></span></li></ul></div></div><div class="css-16173t9"><style data-emotion-css="1d1hm3o">.css-1d1hm3o .toolbar{top:0.2em;right:0.2em !important;padding:6px;}.css-1d1hm3o .toolbar .copy-to-clipboard-button{cursor:pointer;-webkit-transition:opacity 0.3s ease-in-out;transition:opacity 0.3s ease-in-out;opacity:0;background-color:#EDEDED !important;background-position:50% !important;background-repeat:no-repeat !important;border-radius:4px !important;height:30px;width:46px;}.css-1d1hm3o .toolbar .copy-to-clipboard-button:hover{background-color:#E3E3E3 !important;}.css-1d1hm3o .toolbar .copy-to-clipboard-button:active{background-color:#D4D4D4 !important;}.css-1d1hm3o .toolbar .copy-to-clipboard-button span{display:none;}.css-1d1hm3o .toolbar .copy-to-clipboard-button[data-copy-state='copy']{background-image:url('/docs/icons/copy.svg') !important;}.css-1d1hm3o .toolbar .copy-to-clipboard-button[data-copy-state='copy-success']{background-color:#e3e3e3 !important;background-image:url('/docs/icons/check.svg') !important;}.css-1d1hm3o .code-toolbar:hover .copy-to-clipboard-button{opacity:1;}</style><div data-prismjs-copy-timeout="3000" class="line-numbers css-1d1hm3o"><div><div id="user-content-preamble"> <div class="sectionbody"> <div class="paragraph"> <p>Workflows in CircleCI are used to orchestrate jobs. Workflows have options to control run order, scheduling, and access to resources. This page explains how to configure workflows to suit your project. Optimizing your workflows can increase the speed of your software development through faster feedback, shorter reruns, and more efficient use of resources.</p> </div> </div> </div> <div class="sect1"> <div><style data-emotion-css="1gt1ibw">.css-1gt1ibw{color:#161616;line-height:1.50;}</style><div class="css-1gt1ibw"><style data-emotion-css="n6xkmh">.css-n6xkmh{margin-bottom:10px;margin-top:1.25rem;-webkit-scroll-margin-top:100px;-moz-scroll-margin-top:100px;-ms-scroll-margin-top:100px;scroll-margin-top:100px;}</style><style data-emotion-css="sycgw4">.css-sycgw4{box-sizing:border-box;min-width:0;margin:0;color:#161616;font-size:1.75rem;font-weight:700;line-height:1.25;margin-bottom:10px;margin-top:1.25rem;-webkit-scroll-margin-top:100px;-moz-scroll-margin-top:100px;-ms-scroll-margin-top:100px;scroll-margin-top:100px;}</style><h2 id="overview" data-testid="title-overview" class="css-sycgw4">Overview</h2></div></div> <div class="sectionbody"> <div class="paragraph"> <p>A <strong>workflow</strong> is a set of rules for defining a collection of jobs and their run order. Create workflows to orchestrate your jobs using the options described on this page.</p> </div> <div class="paragraph"> <p>With workflows, you can:</p> </div> <div class="ulist"> <ul> <li> <p>Run and troubleshoot jobs independently with real-time status feedback.</p> </li> <li> <p>Schedule workflows for jobs that should only run periodically.</p> </li> <li> <p>Fan-out to run multiple jobs concurrently for efficient version testing.</p> </li> <li> <p>Fan-in to deploy to multiple platforms.</p> </li> <li> <p>Catch failures in real-time and rerun only failed jobs.</p> </li> </ul> </div> </div> </div> <div class="sect1"> <div><div class="css-1gt1ibw"><h2 id="workflows-configuration-examples" data-testid="title-workflows-configuration-examples" class="css-sycgw4">Workflows configuration examples</h2></div></div> <div class="sectionbody"> <style data-emotion-css="bdwfpm">.css-bdwfpm{margin:1.5rem 0;}</style><div class="css-bdwfpm"><style data-emotion-css="rcrvz9">.css-rcrvz9{box-sizing:border-box;min-width:0;margin:0;border:1px solid #D4D4D4;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:60px;margin:0.25rem 0;border-left:4px solid #D4D4D4;}</style><div data-testid="compass-suggestion-alert" role="alert" aria-live="polite" class="css-rcrvz9"><style data-emotion-css="v7m42f">.css-v7m42f{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-column-gap:0.75rem;column-gap:0.75rem;margin:11px;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}@media (min-width:768px){.css-v7m42f{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}</style><style data-emotion-css="1i7vmqf">.css-1i7vmqf{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-column-gap:0.75rem;column-gap:0.75rem;margin:11px;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;}@media (min-width:768px){.css-1i7vmqf{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}</style><div class="css-1i7vmqf"><style data-emotion-css="3792lh">.css-3792lh{width:20px;height:20px;min-width:20px;color:#161616;}</style><div color="#161616" class="css-3792lh"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Suggestion Lightbulb" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.96 3C12.96 2.44772 12.5123 2 11.96 2C11.4077 2 10.96 2.44772 10.96 3V4.43C10.96 4.98228 11.4077 5.43 11.96 5.43C12.5123 5.43 12.96 4.98228 12.96 4.43V3ZM16.2341 14.5901C16.2572 14.5555 16.275 14.5291 16.2868 14.5118L16.3592 14.3965C16.4802 14.1732 16.584 13.9411 16.6697 13.7021C16.8716 13.1555 16.9733 12.577 16.97 11.9943L16.9698 11.9792C16.954 11.2218 16.7664 10.478 16.421 9.80378C16.0757 9.12958 15.5817 8.54266 14.9763 8.08734C14.3709 7.63202 13.67 7.3202 12.9264 7.17544C12.1829 7.03067 11.4162 7.05674 10.6842 7.25168C9.95218 7.44662 9.27405 7.80533 8.70099 8.30072C8.12793 8.79611 7.67492 9.41523 7.37617 10.1113C7.07742 10.8074 6.94074 11.5623 6.97645 12.319C7.01216 13.0756 7.21932 13.8143 7.5823 14.4792L7.65423 14.593C7.66538 14.6093 7.68239 14.6344 7.70443 14.6672C7.74853 14.7329 7.81255 14.8297 7.88981 14.9503C8.04494 15.1925 8.25052 15.5264 8.45469 15.896C8.66041 16.2684 8.85554 16.6607 8.99681 17.022C9.14607 17.4037 9.20002 17.6639 9.20002 17.8C9.20002 18.3478 9.64074 18.7936 10.1885 18.7999L13.6585 18.8399C13.9257 18.843 14.183 18.739 14.373 18.5512C14.5631 18.3633 14.67 18.1072 14.67 17.84C14.67 17.7085 14.7255 17.444 14.8826 17.0473C15.0306 16.6735 15.2349 16.2652 15.4499 15.8768C15.6633 15.4913 15.8781 15.1416 16.0402 14.8876C16.121 14.761 16.1879 14.6594 16.2341 14.5901ZM12.5442 9.13858C12.0981 9.05172 11.6381 9.06736 11.1989 9.18432C10.7597 9.30128 10.3528 9.51651 10.0089 9.81374C9.66511 10.111 9.39331 10.4825 9.21406 10.9001C9.03481 11.3178 8.9528 11.7707 8.97422 12.2247C8.9949 12.663 9.11145 13.0911 9.31542 13.4792C9.32861 13.4985 9.34532 13.5232 9.36514 13.5527C9.4162 13.6288 9.48812 13.7375 9.57398 13.8716C9.7451 14.1388 9.97452 14.5111 10.2054 14.929C10.4346 15.3441 10.6745 15.8206 10.8595 16.2937C10.923 16.4561 10.9848 16.6299 11.0379 16.8096L12.8402 16.8304C12.895 16.6494 12.9583 16.4744 13.0231 16.3108C13.2144 15.8278 13.4626 15.3373 13.7001 14.9082C13.9392 14.4762 14.1769 14.0896 14.3542 13.8118C14.4431 13.6724 14.5176 13.5592 14.5704 13.4801C14.5915 13.4484 14.6092 13.4222 14.623 13.4018C14.6867 13.2797 14.742 13.1533 14.7883 13.0236L14.7923 13.0124C14.9108 12.6926 14.9711 12.3542 14.9701 12.0132C14.9595 11.5614 14.847 11.1178 14.641 10.7156C14.4338 10.3111 14.1374 9.95891 13.7741 9.68572C13.4109 9.41252 12.9903 9.22543 12.5442 9.13858ZM9.22998 21C9.22998 20.4477 9.6777 20 10.23 20H13.69C14.2423 20 14.69 20.4477 14.69 21C14.69 21.5523 14.2423 22 13.69 22H10.23C9.6777 22 9.22998 21.5523 9.22998 21ZM19.0071 4.9129C19.3976 5.30342 19.3976 5.93658 19.0071 6.32711L17.9971 7.33711C17.6066 7.72763 16.9734 7.72763 16.5829 7.33711C16.1923 6.94659 16.1923 6.31342 16.5829 5.9229L17.5929 4.9129C17.9834 4.52237 18.6166 4.52237 19.0071 4.9129ZM19.5 10.96C18.9477 10.96 18.5 11.4077 18.5 11.96C18.5 12.5123 18.9477 12.96 19.5 12.96H20.92C21.4723 12.96 21.92 12.5123 21.92 11.96C21.92 11.4077 21.4723 10.96 20.92 10.96H19.5ZM4.91289 4.9129C5.30341 4.52237 5.93658 4.52237 6.3271 4.9129L7.3371 5.9229C7.72763 6.31342 7.72763 6.94659 7.3371 7.33711C6.94658 7.72763 6.31341 7.72763 5.92289 7.33711L4.91289 6.32711C4.52236 5.93659 4.52236 5.30342 4.91289 4.9129ZM3 10.96C2.44772 10.96 2 11.4077 2 11.96C2 12.5123 2.44772 12.96 3 12.96H4.43C4.98228 12.96 5.43 12.5123 5.43 11.96C5.43 11.4077 4.98228 10.96 4.43 10.96H3Z"></path></svg></div><style data-emotion-css="1aoesim">.css-1aoesim{-webkit-column-gap:0.75rem;column-gap:0.75rem;row-gap:0.75rem;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex:1;-ms-flex:1;flex:1;}</style><style data-emotion-css="45kv77">.css-45kv77{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:100%;-webkit-column-gap:0.75rem;column-gap:0.75rem;row-gap:0.75rem;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex:1;-ms-flex:1;flex:1;}</style><div id="collapsible-flex" class="css-45kv77"><style data-emotion-css="seohoz">.css-seohoz{box-sizing:border-box;min-width:0;margin:0;-webkit-flex:1;-ms-flex:1;flex:1;}</style><div class="css-seohoz"><style data-emotion-css="1c1tyii">.css-1c1tyii{box-sizing:border-box;min-width:0;margin:0;color:#161616;font-size:1rem;line-height:1.5;}</style><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td><td class="content"> For a full specification of the <code class="" data-testid="code-snippet-highlight">workflows</code> key, see the <span><a data-testid="link" href="/docs/configuration-reference/#workflows" class="css-x7gnkn"> <!-- -->Workflows</a></span> section of the configuration reference. </td></tr></tbody></table></div> </span></div><style data-emotion-css="1ng7dzp">.css-1ng7dzp{-webkit-column-gap:0.75rem;column-gap:0.75rem;min-height:36px;}</style><style data-emotion-css="1828gbe">.css-1828gbe{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-column-gap:0.75rem;column-gap:0.75rem;min-height:36px;}</style><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> <div class="sect2"> <div><div class="css-1gt1ibw"><style data-emotion-css="2s9iz">.css-2s9iz{margin-bottom:10px;margin-top:10px;-webkit-scroll-margin-top:100px;-moz-scroll-margin-top:100px;-ms-scroll-margin-top:100px;scroll-margin-top:100px;}</style><style data-emotion-css="ycntf9">.css-ycntf9{box-sizing:border-box;min-width:0;margin:0;color:#161616;font-size:1.5rem;font-weight:500;line-height:1.3333333;margin-bottom:10px;margin-top:10px;-webkit-scroll-margin-top:100px;-moz-scroll-margin-top:100px;-ms-scroll-margin-top:100px;scroll-margin-top:100px;}</style><h3 id="concurrent-job-execution" data-testid="title-concurrent-job-execution" class="css-ycntf9">Concurrent job execution</h3></div></div> <div class="paragraph"> <p>The example in this section shows the default workflow orchestration model of concurrent jobs. Concurrent jobs are defined as follows:</p> </div> <div class="ulist"> <ul> <li> <p>Use the <code class="" data-testid="code-snippet-highlight">workflows</code> key.</p> </li> <li> <p>Name the workflow, in this case, <code class="" data-testid="code-snippet-highlight">build_and_test</code>.</p> </li> <li> <p>Nest the <code class="" data-testid="code-snippet-highlight">jobs</code> key with a list of job names that are defined in the configuration file. In this example the jobs have no dependencies defined, so they run concurrently.</p> </li> </ul> </div> <div class="css-bdwfpm"><style data-emotion-css="l2fvwh">.css-l2fvwh{box-sizing:border-box;min-width:0;margin:0;border:1px solid #D4D4D4;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:60px;margin:0.25rem 0;border-left:4px solid #0078CA;}</style><div data-testid="compass-info-alert" role="alert" aria-live="polite" class="css-l2fvwh"><div class="css-1i7vmqf"><style data-emotion-css="15qiqgw">.css-15qiqgw{width:20px;height:20px;min-width:20px;color:#0078CA;}</style><div color="#0078CA" class="css-15qiqgw"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Info Circle" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M12 2C17.52 2 22 6.48 22 12C22 17.52 17.52 22 12 22C6.48 22 2 17.52 2 12C2 6.48 6.48 2 12 2ZM12 6C11.4477 6 11 6.44772 11 7C11 7.55228 11.4477 8 12 8C12.5523 8 13 7.55228 13 7C13 6.44772 12.5523 6 12 6ZM12 10C11.4477 10 11 10.4477 11 11V17C11 17.5523 11.4477 18 12 18C12.5523 18 13 17.5523 13 17V11C13 10.4477 12.5523 10 12 10Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-note" title="Note"></i> </td><td class="content"> <strong>Using Docker?</strong> Authenticating Docker pulls from image registries is recommended when using the Docker execution environment. Authenticated pulls allow access to private Docker images, and may also grant higher rate limits, depending on your registry provider. For further information see <span><a data-testid="link" href="/docs/private-images/" class="css-x7gnkn"> <!-- -->Using Docker authenticated pulls</a></span>. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">jobs: build: docker: - image: cimg/base:2023.06 steps: - checkout - run: <command> test: docker: - image: cimg/base:2023.06 steps: - checkout - run: <command> workflows: build_and_test: jobs: - build - test</code></pre> </div> </div> <div class="paragraph"> <p>See the <span><a href="https://github.com/CircleCI-Public/circleci-demo-workflows/blob/parallel-jobs/.circleci/config.yml" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->Sample concurrent workflow config<style data-emotion-css="1ie5e7y">.css-1ie5e7y{display:inline-block;width:1rem;height:1rem;margin-left:-5px;}</style><span color="currentColor" class="css-1ie5e7y"><style data-emotion-css="qzco2h">.css-qzco2h{display:block;width:100%;fill:#0078CA;}</style><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span> for a full example.</p> </div> <div class="paragraph"> <p>When using workflows, note the following best practices:</p> </div> <div class="ulist"> <ul> <li> <p>Move the quickest jobs up to the start of your workflow. For example, lint or syntax checking should happen before longer-running, more computationally expensive jobs.</p> </li> <li> <p>Using a "setup" job at the <em>start</em> of a workflow can be helpful to do some preflight checks and populate a workspace for all the following jobs.</p> </li> </ul> </div> <div class="css-bdwfpm"><div data-testid="compass-suggestion-alert" role="alert" aria-live="polite" class="css-rcrvz9"><div class="css-1i7vmqf"><div color="#161616" class="css-3792lh"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Suggestion Lightbulb" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.96 3C12.96 2.44772 12.5123 2 11.96 2C11.4077 2 10.96 2.44772 10.96 3V4.43C10.96 4.98228 11.4077 5.43 11.96 5.43C12.5123 5.43 12.96 4.98228 12.96 4.43V3ZM16.2341 14.5901C16.2572 14.5555 16.275 14.5291 16.2868 14.5118L16.3592 14.3965C16.4802 14.1732 16.584 13.9411 16.6697 13.7021C16.8716 13.1555 16.9733 12.577 16.97 11.9943L16.9698 11.9792C16.954 11.2218 16.7664 10.478 16.421 9.80378C16.0757 9.12958 15.5817 8.54266 14.9763 8.08734C14.3709 7.63202 13.67 7.3202 12.9264 7.17544C12.1829 7.03067 11.4162 7.05674 10.6842 7.25168C9.95218 7.44662 9.27405 7.80533 8.70099 8.30072C8.12793 8.79611 7.67492 9.41523 7.37617 10.1113C7.07742 10.8074 6.94074 11.5623 6.97645 12.319C7.01216 13.0756 7.21932 13.8143 7.5823 14.4792L7.65423 14.593C7.66538 14.6093 7.68239 14.6344 7.70443 14.6672C7.74853 14.7329 7.81255 14.8297 7.88981 14.9503C8.04494 15.1925 8.25052 15.5264 8.45469 15.896C8.66041 16.2684 8.85554 16.6607 8.99681 17.022C9.14607 17.4037 9.20002 17.6639 9.20002 17.8C9.20002 18.3478 9.64074 18.7936 10.1885 18.7999L13.6585 18.8399C13.9257 18.843 14.183 18.739 14.373 18.5512C14.5631 18.3633 14.67 18.1072 14.67 17.84C14.67 17.7085 14.7255 17.444 14.8826 17.0473C15.0306 16.6735 15.2349 16.2652 15.4499 15.8768C15.6633 15.4913 15.8781 15.1416 16.0402 14.8876C16.121 14.761 16.1879 14.6594 16.2341 14.5901ZM12.5442 9.13858C12.0981 9.05172 11.6381 9.06736 11.1989 9.18432C10.7597 9.30128 10.3528 9.51651 10.0089 9.81374C9.66511 10.111 9.39331 10.4825 9.21406 10.9001C9.03481 11.3178 8.9528 11.7707 8.97422 12.2247C8.9949 12.663 9.11145 13.0911 9.31542 13.4792C9.32861 13.4985 9.34532 13.5232 9.36514 13.5527C9.4162 13.6288 9.48812 13.7375 9.57398 13.8716C9.7451 14.1388 9.97452 14.5111 10.2054 14.929C10.4346 15.3441 10.6745 15.8206 10.8595 16.2937C10.923 16.4561 10.9848 16.6299 11.0379 16.8096L12.8402 16.8304C12.895 16.6494 12.9583 16.4744 13.0231 16.3108C13.2144 15.8278 13.4626 15.3373 13.7001 14.9082C13.9392 14.4762 14.1769 14.0896 14.3542 13.8118C14.4431 13.6724 14.5176 13.5592 14.5704 13.4801C14.5915 13.4484 14.6092 13.4222 14.623 13.4018C14.6867 13.2797 14.742 13.1533 14.7883 13.0236L14.7923 13.0124C14.9108 12.6926 14.9711 12.3542 14.9701 12.0132C14.9595 11.5614 14.847 11.1178 14.641 10.7156C14.4338 10.3111 14.1374 9.95891 13.7741 9.68572C13.4109 9.41252 12.9903 9.22543 12.5442 9.13858ZM9.22998 21C9.22998 20.4477 9.6777 20 10.23 20H13.69C14.2423 20 14.69 20.4477 14.69 21C14.69 21.5523 14.2423 22 13.69 22H10.23C9.6777 22 9.22998 21.5523 9.22998 21ZM19.0071 4.9129C19.3976 5.30342 19.3976 5.93658 19.0071 6.32711L17.9971 7.33711C17.6066 7.72763 16.9734 7.72763 16.5829 7.33711C16.1923 6.94659 16.1923 6.31342 16.5829 5.9229L17.5929 4.9129C17.9834 4.52237 18.6166 4.52237 19.0071 4.9129ZM19.5 10.96C18.9477 10.96 18.5 11.4077 18.5 11.96C18.5 12.5123 18.9477 12.96 19.5 12.96H20.92C21.4723 12.96 21.92 12.5123 21.92 11.96C21.92 11.4077 21.4723 10.96 20.92 10.96H19.5ZM4.91289 4.9129C5.30341 4.52237 5.93658 4.52237 6.3271 4.9129L7.3371 5.9229C7.72763 6.31342 7.72763 6.94659 7.3371 7.33711C6.94658 7.72763 6.31341 7.72763 5.92289 7.33711L4.91289 6.32711C4.52236 5.93659 4.52236 5.30342 4.91289 4.9129ZM3 10.96C2.44772 10.96 2 11.4077 2 11.96C2 12.5123 2.44772 12.96 3 12.96H4.43C4.98228 12.96 5.43 12.5123 5.43 11.96C5.43 11.4077 4.98228 10.96 4.43 10.96H3Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td><td class="content"> Refer to the <span><a data-testid="link" href="/docs/optimizations/" class="css-x7gnkn"> <!-- -->Optimization reference</a></span> for tips to improve your configuration. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> </div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="sequential-job-execution" data-testid="title-sequential-job-execution" class="css-ycntf9">Sequential job execution</h3></div></div> <div class="paragraph"> <p>This example shows a workflow with four sequential jobs. Each job waits to start until the "required" job finishes successfully, as illustrated in the following diagram:</p> </div> <style data-emotion-css="1anc138">.css-1anc138{text-align:center;font-style:italic;margin:1.5rem 0;}</style><div class="imageblock css-1anc138"> <div class="content"> <style data-emotion-css="105956i">.css-105956i{cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in;max-width:100%;margin:0 0 1rem 0;}</style><img src="/docs/assets/img/docs/sequential_workflow.png" alt="Sequential Job Execution Workflow" data-testid="image" loading="lazy" class="css-105956i"/> </div> </div> <div class="paragraph"> <p>This configuration snippet is an example of a workflow configured for sequential jobs:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">workflows: build-test-and-deploy: jobs: - build - test1: requires: - build - test2: requires: - test1 - deploy: requires: - test2</code></pre> </div> </div> <div class="paragraph"> <p>Define job dependencies using the <code class="" data-testid="code-snippet-highlight">requires</code> key. A job must wait until all upstream jobs in the dependency graph have run. In this example, the <code class="" data-testid="code-snippet-highlight">deploy</code> job runs when the <code class="" data-testid="code-snippet-highlight">build</code>, <code class="" data-testid="code-snippet-highlight">test1</code> and <code class="" data-testid="code-snippet-highlight">test2</code> jobs complete successfully:</p> </div> <div class="ulist"> <ul> <li> <p>The <code class="" data-testid="code-snippet-highlight">deploy</code> job waits for the <code class="" data-testid="code-snippet-highlight">test2</code> job</p> </li> <li> <p>The <code class="" data-testid="code-snippet-highlight">test2</code> job waits for the <code class="" data-testid="code-snippet-highlight">test1</code> job</p> </li> <li> <p>The <code class="" data-testid="code-snippet-highlight">test1</code> job waits for the <code class="" data-testid="code-snippet-highlight">build</code> job</p> </li> </ul> </div> <div class="paragraph"> <p>See the <span><a href="https://github.com/CircleCI-Public/circleci-demo-workflows/blob/sequential-branch-filter/.circleci/config.yml" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->Sample Sequential Workflow config<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span> for a full example.</p> </div> </div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="fan-outfan-in-workflow" data-testid="title-fan-outfan-in-workflow" class="css-ycntf9">Fan-out/fan-in workflow</h3></div></div> <div class="paragraph"> <p>This example workflow has a fan-out/fan-in structure, as follows:</p> </div> <div class="ulist"> <ul> <li> <p>A common build job is run.</p> </li> <li> <p>The workflow fans-out to run a set of acceptance test jobs concurrently.</p> </li> <li> <p>The workflow fans-in to run a common deploy job.</p> </li> </ul> </div> <div class="imageblock css-1anc138"> <div class="content"> <img src="/docs/assets/img/docs/fan-out-in.png" alt="Fan-out and Fan-in Workflow" data-testid="image" loading="lazy" class="css-105956i"/> </div> </div> <div class="paragraph"> <p>This configuration snippet is an example of a workflow configured for fan-out/fan-in job execution:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">workflows: build_accept_deploy: jobs: - build - acceptance_test_1: requires: - build - acceptance_test_2: requires: - build - acceptance_test_3: requires: - build - acceptance_test_4: requires: - build - deploy: requires: - acceptance_test_1 - acceptance_test_2 - acceptance_test_3 - acceptance_test_4</code></pre> </div> </div> <div class="paragraph"> <p>In this example, as soon as the <code class="" data-testid="code-snippet-highlight">build</code> job finishes successfully, all four acceptance test jobs start. The <code class="" data-testid="code-snippet-highlight">deploy</code> job waits for all four acceptance test jobs to succeed before it starts.</p> </div> <div class="paragraph"> <p>See the <span><a href="https://github.com/CircleCI-Public/circleci-demo-workflows/tree/fan-in-fan-out" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->Sample Fan-in/Fan-out Workflow config<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span> for a full example.</p> </div> </div> </div> </div> <div class="sect1"> <div><div class="css-1gt1ibw"><h2 id="holding-a-workflow-for-a-manual-approval" data-testid="title-holding-a-workflow-for-a-manual-approval" class="css-sycgw4">Hold a workflow for a manual approval</h2></div></div> <div class="sectionbody"> <div class="paragraph"> <p>Use an <code class="" data-testid="code-snippet-highlight">approval</code> job to configure a workflow to wait for manual approval before continuing. Anyone who has push access to the repository can approve the job to continue the workflow or cancel to end the workflow. Approve or Cancel either by using the buttons in the CircleCI web app, or via the API.</p> </div> <div class="paragraph"> <p>Some things to keep in mind when using manual approval in a workflow:</p> </div> <div class="ulist"> <ul> <li> <p><code class="" data-testid="code-snippet-highlight">approval</code> is a special job type that is configured when listing jobs under the <code class="" data-testid="code-snippet-highlight">workflows</code> key. You do not need to define an <code class="" data-testid="code-snippet-highlight">approval</code> type job in the <code class="" data-testid="code-snippet-highlight">jobs</code> section of your configuration. If you do configure steps for a job that is given the <code class="" data-testid="code-snippet-highlight">approval</code> type in the workflows section, the steps for that job will not be run. An <code class="" data-testid="code-snippet-highlight">approval</code> job is <em>only</em> used to <em>hold</em> the workflow for approval, not to run any work.</p> </li> <li> <p>The <code class="" data-testid="code-snippet-highlight">approval</code> job name must be unique and not used by any other job in your configuration.</p> </li> <li> <p>The name of the approval job is arbitrary. For example, an approval job can be named <code class="" data-testid="code-snippet-highlight">hold</code>, <code class="" data-testid="code-snippet-highlight">wait</code>, <code class="" data-testid="code-snippet-highlight">pause</code>, etc.</p> </li> <li> <p>All jobs that run <em>after</em> a manual approval job <strong>must</strong> <code class="" data-testid="code-snippet-highlight">require</code> the name of the <code class="" data-testid="code-snippet-highlight">approval</code> job.</p> </li> <li> <p>Jobs run in the order defined in the workflow.</p> </li> <li> <p>When the workflow encounters a job with <code class="" data-testid="code-snippet-highlight">type: approval</code>, the workflow pauses until action is taken to approve or cancel.</p> </li> <li> <p>If approval is granted the workflow continues to process jobs in the order defined in the configuration file.</p> </li> <li> <p>If cancel is granted the downstream jobs are not run.</p> </li> <li> <p>Jobs downstream of an <code class="" data-testid="code-snippet-highlight">approval</code> job can be restricted by adding a <span><a data-testid="link" href="/docs/contexts/#approve-jobs-that-use-restricted-contexts" class="css-x7gnkn"> <!-- -->restricted context</a></span> to those downstream jobs.</p> </li> </ul> </div> <div class="paragraph"> <p>The following screenshot demonstrates:</p> </div> <div class="ulist"> <ul> <li> <p>A workflow that needs approval.</p> </li> <li> <p>The approval popup.</p> </li> <li> <p>The workflow graph after approval.</p> </li> </ul> </div> <div class="imageblock css-1anc138"> <div class="content"> <img src="/docs/assets/img/docs/approval-workflow-map.png" alt="A three section image showing workflow graph with "Needs approval" job" data-testid="image" loading="lazy" class="css-105956i"/> </div> </div> <div class="paragraph"> <p>By clicking on the <code class="" data-testid="code-snippet-highlight">approval</code> job’s name (<code class="" data-testid="code-snippet-highlight">hold</code>, in the screenshot above), an approval dialog box appears. You can approve, cancel, or close the popup without approving.</p> </div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="configure-an-approval-job" data-testid="title-configure-an-approval-job" class="css-ycntf9">Configure an approval job</h3></div></div> <div class="paragraph"> <p>To set up a manual approval workflow, add a job to the <code class="" data-testid="code-snippet-highlight">jobs</code> list in your workflow with <code class="" data-testid="code-snippet-highlight">type: approval</code>. For example:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight"># ... # << your config for the build, test1, test2, and deploy jobs >> # ... workflows: build-test-and-approval-deploy: jobs: - build # your custom job from your config, that builds your code - test1: # your custom job; runs test suite 1 requires: # test1 will not run until the `build` job is completed. - build - test2: # another custom job; runs test suite 2, requires: # test2 is dependent on the success of job `test1` - test1 - hold: # <<< A job that will require manual approval in the CircleCI web application. type: approval # This key-value pair will set your workflow to a status of "Needs Approval" requires: # We only run the "hold" job when test2 has succeeded - test2 # On approval of the `hold` job, any successive job that requires the `hold` job will run. # In this case, a user is manually triggering the deploy job. - deploy: requires: - hold</code></pre> </div> </div> <div class="paragraph"> <p>In this example, the <code class="" data-testid="code-snippet-highlight">deploy</code> job will not run until the <code class="" data-testid="code-snippet-highlight">hold</code> job is approved.</p> </div> </div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="approve-a-job" data-testid="title-approve-a-job" class="css-ycntf9">Approve a job</h3></div></div> <div class="paragraph"> <p>To approve a job follow these steps:</p> </div> <div data-testid="compass-tabs" class="css-bdwfpm"><div class="css-bdwfpm"><style data-emotion-css="1utggbq">.css-1utggbq{padding:0 0 1.5rem 0;}@media (max-width:768px){.css-1utggbq > div{overflow-x:scroll;ms-overflow-style:none;-webkit-scrollbar-width:none;-moz-scrollbar-width:none;-ms-scrollbar-width:none;scrollbar-width:none;display:-webkit-box;}.css-1utggbq > div::-webkit-scrollbar{display:none;}}</style><div id="groupName-approve-tabs" role="tablist" aria-label="Tabs" class="css-1utggbq"><div class="css-1h7v07b"><style data-emotion-css="1h2mcfj">.css-1h2mcfj{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:56px;color:#6A6A6A;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;font-size:0.875rem;border:none;margin:0;padding:1rem 0.75rem;background-color:#FFFFFF;line-height:1.50;text-transform:uppercase;cursor:pointer;}.css-1h2mcfj:hover{color:#161616;}.css-1h2mcfj[aria-selected='true']{color:#161616;font-weight:700;box-shadow:inset 0 -0.25rem #0078CA;}.js-focus-visible .css-1h2mcfj:focus{outline:none;z-index:1;box-shadow:0 0 0.25rem #0078CA, -1px 1px 0 #0078CA,1px -1px 0 #0078CA, 1px 1px 0 #0078CA,-1px -1px 0 #0078CA;}.js-focus-visible .css-1h2mcfj:focus.css-1h2mcfj[aria-selected='true']{box-shadow:0 0 0.25rem #0078CA, -1px 1px 0 #0078CA,1px -1px 0 #0078CA, 1px 1px 0 #0078CA,-1px -1px 0 #0078CA, inset 0 -0.25rem #0078CA;}.js-focus-visible .css-1h2mcfj:focus:not(.focus-visible),.js-focus-visible .css-1h2mcfj:focus.css-1h2mcfj[aria-selected='true']:not(.focus-visible){outline:none;box-shadow:inset 0 -0.25rem #0078CA;}</style><button id="groupName-approve-CircleCI-web app" tabindex="0" aria-selected="false" role="tab" type="button" class="css-1h2mcfj">CircleCI web app</button><button id="groupName-approve-API" tabindex="0" aria-selected="false" role="tab" type="button" class="css-1h2mcfj">API</button></div></div><style data-emotion-css="c4at1j">.css-c4at1j{width:100%;}</style><div id="groupName-approve-CircleCI-web app-panel" hidden="" style="display:none" role="tabpanel" tabindex="0" aria-labelledby="groupName-approve-CircleCI-web app" class="css-c4at1j"><div class="groupName-approve tabName-CircleCI_web_app openblock"> <div class="content"> <div class="olist arabic"> <ol class="arabic"> <li> <p>Select the <code class="" data-testid="code-snippet-highlight">hold</code> job in the <strong>Workflows</strong> page of the CircleCI web app.</p> </li> <li> <p>Select <b class="button">Approve</b>.</p> </li> </ol> </div> </div> </div></div><div id="groupName-approve-API-panel" hidden="" style="display:none" role="tabpanel" tabindex="0" aria-labelledby="groupName-approve-API" class="css-c4at1j"><div class="groupName-approve tabName-API openblock"> <div class="content"> <div class="olist arabic"> <ol class="arabic"> <li> <p>Set up your API authentication. Steps are available in the <span><a data-testid="link" href="/docs/api-developers-guide/#add-an-api-token" class="css-x7gnkn"> <!-- -->API developers guide</a></span>.</p> </li> <li> <p>You need your workflow ID and the <code class="" data-testid="code-snippet-highlight">approval_request_id</code> (which is the job ID for the job requiring approval) to make the API POST request. Depending on your use case, you might be configuring an approval job in a pipeline, or using an external service to approve a job. You can get the required parameters using <span><a data-testid="link" href="/docs/variables/" class="css-x7gnkn"> <!-- -->pipeline values or environment variables</a></span>, or by <span><a data-testid="link" href="/docs/webhooks/" class="css-x7gnkn"> <!-- -->receiving webhooks</a></span> or polling the API. To approve a job, use the <span><a href="https://circleci.com/docs/api/v2/index.html#operation/approvePendingApprovalJobById" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->approve a job<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span> endpoint, for example:</p> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-shell" data-testid="code-snippet-highlight">curl --request POST \ --url https://circleci.com/api/v2/workflow/<workflow-ID>/approve/<approval_request_id> \ --header "Circle-Token: ${CIRCLE_TOKEN}" \ --header 'content-type: application/json' \</code></pre> </div> </div> </li> </ol> </div> </div> </div></div></div></div> <!-- --> </div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="cancel-a-job" data-testid="title-cancel-a-job" class="css-ycntf9">Cancel a job</h3></div></div> <div class="paragraph"> <p>To Cancel a job follow these steps:</p> </div> <div data-testid="compass-tabs" class="css-bdwfpm"><div class="css-bdwfpm"><div id="groupName-cancel-tabs" role="tablist" aria-label="Tabs" class="css-1utggbq"><div class="css-1h7v07b"><button id="groupName-cancel-CircleCI-web app" tabindex="0" aria-selected="false" role="tab" type="button" class="css-1h2mcfj">CircleCI web app</button><button id="groupName-cancel-API" tabindex="0" aria-selected="false" role="tab" type="button" class="css-1h2mcfj">API</button></div></div><div id="groupName-cancel-CircleCI-web app-panel" hidden="" style="display:none" role="tabpanel" tabindex="0" aria-labelledby="groupName-cancel-CircleCI-web app" class="css-c4at1j"><div class="groupName-cancel tabName-CircleCI_web_app openblock"> <div class="content"> <div class="olist arabic"> <ol class="arabic"> <li> <p>Select the <code class="" data-testid="code-snippet-highlight">hold</code> job in the <strong>Workflows</strong> page of the CircleCI web app.</p> </li> <li> <p>Select <b class="button">Cancel</b>.</p> </li> </ol> </div> </div> </div></div><div id="groupName-cancel-API-panel" hidden="" style="display:none" role="tabpanel" tabindex="0" aria-labelledby="groupName-cancel-API" class="css-c4at1j"><div class="groupName-cancel tabName-API openblock"> <div class="content"> <div class="olist arabic"> <ol class="arabic"> <li> <p>Set up your API authentication. Steps are available in the <span><a data-testid="link" href="/docs/api-developers-guide/#add-an-api-token" class="css-x7gnkn"> <!-- -->API developers guide</a></span>.</p> </li> <li> <p>You need your job ID (which is the job ID for the job requiring approval) to make the API POST request. Depending on your use case, you might be configuring an approval job in a pipeline, or using an external service to approve a job. You can get the required parameters using <span><a data-testid="link" href="/docs/variables/" class="css-x7gnkn"> <!-- -->pipeline values or environment variables</a></span>, or by <span><a data-testid="link" href="/docs/webhooks/" class="css-x7gnkn"> <!-- -->receiving webhooks</a></span> or polling the API. To cancel a job, use the <span><a href="https://circleci.com/docs/api/v2/index.html#operation/cancelJobByJobID" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->cancel a job<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span> endpoint, for example:</p> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-shell" data-testid="code-snippet-highlight">curl --request POST \ --url https://circleci.com/api/v2/jobs/<job-ID>/cancel \ --header "Circle-Token: ${CIRCLE_TOKEN}" \ --header 'content-type: application/json' \</code></pre> </div> </div> </li> </ol> </div> </div> </div></div></div></div> <!-- --> <div class="paragraph"> <p>In this example, the purpose of the <code class="" data-testid="code-snippet-highlight">hold</code> job is to wait for approval to begin deployment. A job can be approved for up to 90 days after it starts.</p> </div> </div> </div> </div> <div class="sect1"> <div><div class="css-1gt1ibw"><h2 id="scheduling-a-workflow" data-testid="title-scheduling-a-workflow" class="css-sycgw4">Scheduling a workflow</h2></div></div> <div class="sectionbody"> <div class="css-bdwfpm"><div data-testid="compass-info-alert" role="alert" aria-live="polite" class="css-l2fvwh"><div class="css-1i7vmqf"><div color="#0078CA" class="css-15qiqgw"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Info Circle" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M12 2C17.52 2 22 6.48 22 12C22 17.52 17.52 22 12 22C6.48 22 2 17.52 2 12C2 6.48 6.48 2 12 2ZM12 6C11.4477 6 11 6.44772 11 7C11 7.55228 11.4477 8 12 8C12.5523 8 13 7.55228 13 7C13 6.44772 12.5523 6 12 6ZM12 10C11.4477 10 11 10.4477 11 11V17C11 17.5523 11.4477 18 12 18C12.5523 18 13 17.5523 13 17V11C13 10.4477 12.5523 10 12 10Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-note" title="Note"></i> </td><td class="content"> Scheduled workflows are not available for projects integrated through the GitHub App, GitLab or Bitbucket Data Center. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> <div class="css-bdwfpm"><div data-testid="compass-info-alert" role="alert" aria-live="polite" class="css-l2fvwh"><div class="css-1i7vmqf"><div color="#0078CA" class="css-15qiqgw"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Info Circle" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M12 2C17.52 2 22 6.48 22 12C22 17.52 17.52 22 12 22C6.48 22 2 17.52 2 12C2 6.48 6.48 2 12 2ZM12 6C11.4477 6 11 6.44772 11 7C11 7.55228 11.4477 8 12 8C12.5523 8 13 7.55228 13 7C13 6.44772 12.5523 6 12 6ZM12 10C11.4477 10 11 10.4477 11 11V17C11 17.5523 11.4477 18 12 18C12.5523 18 13 17.5523 13 17V11C13 10.4477 12.5523 10 12 10Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-note" title="Note"></i> </td><td class="content"> <strong>The deprecation of the scheduled workflows feature is postponed</strong>. Since the deprecation announcement went live, your feedback and feature requests have been monitored and it is clear there is more work for us to do to improve the existing scheduled pipelines experience, and also make migration easier for all. Updates on a new deprecation timeline will be announced here and on <span><a href="https://discuss.circleci.com/" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->CircleCI Discuss<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span>. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> <div class="css-bdwfpm"><style data-emotion-css="1wj9qpq">.css-1wj9qpq{box-sizing:border-box;min-width:0;margin:0;border:1px solid #D4D4D4;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:60px;margin:0.25rem 0;border-left:4px solid #BF8532;}</style><div data-testid="compass-warning-alert" role="alert" aria-live="polite" class="css-1wj9qpq"><div class="css-1i7vmqf"><style data-emotion-css="1xk4zua">.css-1xk4zua{width:20px;height:20px;min-width:20px;color:#BF8532;}</style><div color="#BF8532" class="css-1xk4zua"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Warning" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M21.7961 18.7493C21.9297 18.9776 22 19.2367 22 19.5006C22 20.3287 21.3215 21 20.4846 21H3.51564C3.24902 21 2.98712 20.9304 2.75638 20.7982C2.03208 20.3833 1.78485 19.466 2.20418 18.7493L10.6887 4.24842C10.8213 4.02168 11.0117 3.8333 11.2409 3.70203C11.9652 3.28712 12.8923 3.53174 13.3116 4.24842L21.7961 18.7493ZM12 18C12.5523 18 13 17.5523 13 17C13 16.4477 12.5523 16 12 16C11.4477 16 11 16.4477 11 17C11 17.5523 11.4477 18 12 18ZM11 13C11 13.5523 11.4477 14 12 14C12.5523 14 13 13.5523 13 13V8.9957C13 8.44341 12.5523 7.9957 12 7.9957C11.4477 7.9957 11 8.44341 11 8.9957V13Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-caution" title="Caution"></i> </td><td class="content"> The scheduled workflows feature does not support <span><a data-testid="link" href="/docs/dynamic-config/" class="css-x7gnkn"> <!-- -->Dynamic configuration</a></span>. If you use dynamic configuration you will need to use <span><a data-testid="link" href="/docs/scheduled-pipelines/" class="css-x7gnkn"> <!-- -->Scheduled pipelines</a></span> for scheduling. More information can be found in this <span><a href="https://support.circleci.com/hc/en-us/articles/360060833331-Support-for-Scheduled-Workflows-in-Dynamic-Configurations-Setup-Workflows" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->support article<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span>. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> <div class="paragraph"> <p>By default, a workflow runs on every <code class="" data-testid="code-snippet-highlight">git push</code>. To trigger a workflow on a schedule, add the <code class="" data-testid="code-snippet-highlight">triggers</code> key to the workflow and specify a <code class="" data-testid="code-snippet-highlight">schedule</code>. Scheduled workflows use the <code class="" data-testid="code-snippet-highlight">cron</code> syntax to represent Coordinated Universal Time (UTC).</p> </div> <div class="paragraph"> <p>Running a workflow for every commit for every branch can be inefficient and expensive. Scheduling a workflow is an alternative to building on every commit. You can <em>schedule</em> a workflow to run at a certain time for a specific branch or branches. Consider scheduling workflows that are resource-intensive or that generate reports on a schedule rather than on every commit.</p> </div> <div class="css-bdwfpm"><div data-testid="compass-warning-alert" role="alert" aria-live="polite" class="css-1wj9qpq"><div class="css-1i7vmqf"><div color="#BF8532" class="css-1xk4zua"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Warning" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M21.7961 18.7493C21.9297 18.9776 22 19.2367 22 19.5006C22 20.3287 21.3215 21 20.4846 21H3.51564C3.24902 21 2.98712 20.9304 2.75638 20.7982C2.03208 20.3833 1.78485 19.466 2.20418 18.7493L10.6887 4.24842C10.8213 4.02168 11.0117 3.8333 11.2409 3.70203C11.9652 3.28712 12.8923 3.53174 13.3116 4.24842L21.7961 18.7493ZM12 18C12.5523 18 13 17.5523 13 17C13 16.4477 12.5523 16 12 16C11.4477 16 11 16.4477 11 17C11 17.5523 11.4477 18 12 18ZM11 13C11 13.5523 11.4477 14 12 14C12.5523 14 13 13.5523 13 13V8.9957C13 8.44341 12.5523 7.9957 12 7.9957C11.4477 7.9957 11 8.44341 11 8.9957V13Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-caution" title="Caution"></i> </td><td class="content"> A scheduled workflow will run on a schedule only. A scheduled workflow will <strong>not</strong> be run on commits to your code. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> <div class="paragraph"> <p>If you do not configure any workflows in your <code class="" data-testid="code-snippet-highlight">.circleci/config.yml</code>, an implicit workflow is used. If you configure a scheduled workflow the implicit workflow is no longer run. If you want to build on every commit you must add your workflow to your configuration file.</p> </div> <div class="css-bdwfpm"><div data-testid="compass-info-alert" role="alert" aria-live="polite" class="css-l2fvwh"><div class="css-1i7vmqf"><div color="#0078CA" class="css-15qiqgw"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Info Circle" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M12 2C17.52 2 22 6.48 22 12C22 17.52 17.52 22 12 22C6.48 22 2 17.52 2 12C2 6.48 6.48 2 12 2ZM12 6C11.4477 6 11 6.44772 11 7C11 7.55228 11.4477 8 12 8C12.5523 8 13 7.55228 13 7C13 6.44772 12.5523 6 12 6ZM12 10C11.4477 10 11 10.4477 11 11V17C11 17.5523 11.4477 18 12 18C12.5523 18 13 17.5523 13 17V11C13 10.4477 12.5523 10 12 10Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-note" title="Note"></i> </td><td class="content"> When you schedule a workflow, the workflow will be counted as an individual user seat. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="nightly-example" data-testid="title-nightly-example" class="css-ycntf9">Build every night</h3></div></div> <div class="paragraph"> <p>In the example below, the <code class="" data-testid="code-snippet-highlight">nightly</code> workflow is configured to run every day at 12:00am UTC. The <code class="" data-testid="code-snippet-highlight">cron</code> key is specified using POSIX <code class="" data-testid="code-snippet-highlight">crontab</code> syntax. See the <span><a href="https://www.unix.com/man-page/POSIX/1posix/crontab/" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->crontab man page<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span> for <code class="" data-testid="code-snippet-highlight">cron</code> syntax basics. The workflow runs on the <code class="" data-testid="code-snippet-highlight">main</code> and <code class="" data-testid="code-snippet-highlight">beta</code> branches.</p> </div> <div class="css-bdwfpm"><div data-testid="compass-info-alert" role="alert" aria-live="polite" class="css-l2fvwh"><div class="css-1i7vmqf"><div color="#0078CA" class="css-15qiqgw"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Info Circle" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M12 2C17.52 2 22 6.48 22 12C22 17.52 17.52 22 12 22C6.48 22 2 17.52 2 12C2 6.48 6.48 2 12 2ZM12 6C11.4477 6 11 6.44772 11 7C11 7.55228 11.4477 8 12 8C12.5523 8 13 7.55228 13 7C13 6.44772 12.5523 6 12 6ZM12 10C11.4477 10 11 10.4477 11 11V17C11 17.5523 11.4477 18 12 18C12.5523 18 13 17.5523 13 17V11C13 10.4477 12.5523 10 12 10Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-note" title="Note"></i> </td><td class="content"> Scheduled workflows may be delayed by up to 15 minutes. This delay is to maintain reliability during busy times, such as 12:00am UTC. Do not assume that scheduled workflows start with to-the-minute accuracy. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">workflows: commit: jobs: - test - deploy nightly: triggers: - schedule: cron: "0 0 * * *" filters: branches: only: - main - /^release\/.*/ jobs: - coverage</code></pre> </div> </div> <div class="paragraph"> <p>In the above example:</p> </div> <div class="ulist"> <ul> <li> <p>The <code class="" data-testid="code-snippet-highlight">commit</code> workflow has no <code class="" data-testid="code-snippet-highlight">triggers</code> key and runs on every <code class="" data-testid="code-snippet-highlight">git push</code>.</p> </li> <li> <p>The <code class="" data-testid="code-snippet-highlight">nightly</code> workflow has a <code class="" data-testid="code-snippet-highlight">triggers</code> key and runs on the specified <code class="" data-testid="code-snippet-highlight">schedule</code>, which is daily, and only runs on the <code class="" data-testid="code-snippet-highlight">main</code> branch, as well as any branch that starts <code class="" data-testid="code-snippet-highlight">release/</code>.</p> </li> </ul> </div> </div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="specifying-a-valid-schedule" data-testid="title-specifying-a-valid-schedule" class="css-ycntf9">Specifying a valid schedule</h3></div></div> <div class="paragraph"> <p>A valid <code class="" data-testid="code-snippet-highlight">schedule</code> requires:</p> </div> <div class="ulist"> <ul> <li> <p>A <code class="" data-testid="code-snippet-highlight">cron</code> key</p> </li> <li> <p>A <code class="" data-testid="code-snippet-highlight">filters</code> key</p> </li> <li> <p>The <code class="" data-testid="code-snippet-highlight">branches</code> filter must be present</p> </li> </ul> </div> <div class="paragraph"> <p>The value of the <code class="" data-testid="code-snippet-highlight">cron</code> key must be a <span><a href="https://crontab.guru/" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->valid crontab entry<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span>.</p> </div> <div class="paragraph"> <p>The following are <strong>not</strong> supported:</p> </div> <div class="ulist"> <ul> <li> <p>Cron step syntax (for example, <code class="" data-testid="code-snippet-highlight">*/1</code>, <code class="" data-testid="code-snippet-highlight">*/20</code>).</p> </li> <li> <p>Range elements within comma-separated lists of elements.</p> </li> <li> <p>Range elements for days (for example, <code class="" data-testid="code-snippet-highlight">Tue-Sat</code>).</p> </li> </ul> </div> <div class="paragraph"> <p>Use comma-separated digits instead.</p> </div> <div class="paragraph"> <p>Example <strong>invalid</strong> cron range syntax:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight"> triggers: - schedule: cron: "5 4 * * 1,3-5,6" # < the range separator with `-` is invalid filters: branches: only: - main</code></pre> </div> </div> <div class="paragraph"> <p>Example <strong>valid</strong> cron range syntax:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight"> triggers: - schedule: cron: "5 4 * * 1,3,4,5,6" filters: branches: only: - main</code></pre> </div> </div> <div class="paragraph"> <p>The value of the <code class="" data-testid="code-snippet-highlight">filters</code> key must be a map that defines rules for execution on specific branches.</p> </div> <div class="paragraph"> <p>For more details, see the <code class="" data-testid="code-snippet-highlight">branches</code> section of the <span><a data-testid="link" href="/docs/configuration-reference/#schedule-branches" class="css-x7gnkn"> <!-- -->CircleCI configuration reference</a></span>.</p> </div> <div class="paragraph"> <p>For a full configuration example, see the <span><a href="https://github.com/CircleCI-Public/circleci-demo-workflows/blob/try-schedule-workflow/.circleci/config.yml" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->Sample Scheduled Workflows configuration<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span>.</p> </div> </div> </div> </div> <div class="sect1"> <div><div class="css-1gt1ibw"><h2 id="using-job-contexts-to-share-environment-variables" data-testid="title-using-job-contexts-to-share-environment-variables" class="css-sycgw4">Using contexts to share and secure environment variables</h2></div></div> <div class="sectionbody"> <div class="paragraph"> <p>In a workflow, you can use a context to securely provide environment variables to specific jobs. Contexts allow you to define environment variables at the organization level and control access to them through security restrictions. Using contexts, sensitive data like API keys or credentials are securely shared with only the jobs that require them. Sensitive data in contexts will not be exposed in your config file.</p> </div> <div class="paragraph"> <p>The following example shows a workflow with four sequential jobs that each use a context to access environment variables. See the <span><a data-testid="link" href="/docs/contexts/" class="css-x7gnkn"> <!-- -->Contexts</a></span> page for detailed instructions on this setting in the application.</p> </div> <div class="paragraph"> <p>The following <code class="" data-testid="code-snippet-highlight">config.yml</code> snippet is an example of a sequential job workflow configured to use the environment variables defined in the <code class="" data-testid="code-snippet-highlight">org-global</code> context:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">workflows: build-test-and-deploy: jobs: - build - test1: requires: - build context: org-global - test2: requires: - test1 context: org-global - deploy: requires: - test2</code></pre> </div> </div> <div class="paragraph"> <p>The <code class="" data-testid="code-snippet-highlight">test1</code> and <code class="" data-testid="code-snippet-highlight">test2</code> jobs have access to environment variables stored in the <code class="" data-testid="code-snippet-highlight">org-global</code> context if the pipeline meets the restrictions set for the context, for example:</p> </div> <div class="ulist"> <ul> <li> <p>Was the pipeline triggered by a user who <span><a data-testid="link" href="/docs/contexts/#security-goup-restrictions" class="css-x7gnkn"> <!-- -->has access</a></span> (is in the relevant org/security group etc.)?</p> </li> <li> <p>Does the <span><a data-testid="link" href="/docs/contexts/#project-restrictions" class="css-x7gnkn"> <!-- -->project have access</a></span> to the context? By default all projects in an organization have access to contexts set for that organization, but restrictions on project access can be configured.</p> </li> <li> <p>Does the pipeline meet the requirements of any <span><a data-testid="link" href="/docs/contexts/#expression-restrictions" class="css-x7gnkn"> <!-- -->expression restrictions</a></span> set up for the context?</p> </li> </ul> </div> </div> </div> <div class="sect1"> <div><div class="css-1gt1ibw"><h2 id="use-conditional-logic-in-workflows" data-testid="title-use-conditional-logic-in-workflows" class="css-sycgw4">Use conditional logic in workflows</h2></div></div> <div class="sectionbody"> <div class="paragraph"> <p>You may use a <code class="" data-testid="code-snippet-highlight">when</code> clause (the inverse clause <code class="" data-testid="code-snippet-highlight">unless</code> is also supported) under a workflow declaration with a <span><a data-testid="link" href="/docs/configuration-reference/#logic-statements" class="css-x7gnkn"> <!-- -->logic statement</a></span> to determine whether or not to run that workflow.</p> </div> <div class="paragraph"> <p>Workflows are always run unless there is a <code class="" data-testid="code-snippet-highlight">when</code> or <code class="" data-testid="code-snippet-highlight">unless</code> filter that prevents the workflow from being run. If you want a workflow to run in <strong>every</strong> pipeline, do <strong>not</strong> add a when or unless filter.</p> </div> <div class="paragraph"> <p>The example configuration below uses a pipeline parameter, <code class="" data-testid="code-snippet-highlight">run_integration_tests</code> to drive the <code class="" data-testid="code-snippet-highlight">integration_tests</code> workflow.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">version: 2.1 parameters: run_integration_tests: type: boolean default: false workflows: integration_tests: when: << pipeline.parameters.run_integration_tests >> jobs: - mytestjob jobs:</code></pre> </div> </div> <div class="paragraph"> <p>This example prevents the workflow <code class="" data-testid="code-snippet-highlight">integration_tests</code> from running unless the <code class="" data-testid="code-snippet-highlight">run_integration_tests</code> pipeline parameter is <code class="" data-testid="code-snippet-highlight">true</code>. For example, when the pipeline is triggered with the following in the <code class="" data-testid="code-snippet-highlight">POST</code> body:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-json" data-testid="code-snippet-highlight">{ "parameters": { "run_integration_tests": true } }</code></pre> </div> </div> </div> </div> <div class="sect1"> <div><div class="css-1gt1ibw"><h2 id="using-filters-in-your-workflows" data-testid="title-using-filters-in-your-workflows" class="css-sycgw4">Using filters in your workflows</h2></div></div> <div class="sectionbody"> <div class="paragraph"> <p>The following sections provide examples for using filters in your workflows to manage job execution.</p> </div> <div class="paragraph"> <p>You can filter workflows by branch, git tag, or neither. Workflow filters for branches and tags have the keys <code class="" data-testid="code-snippet-highlight">only</code> and <code class="" data-testid="code-snippet-highlight">ignore</code>:</p> </div> <div class="ulist"> <ul> <li> <p>Any branches/tags that match <code class="" data-testid="code-snippet-highlight">only</code> will run the job.</p> </li> <li> <p>Any branches/tags that match <code class="" data-testid="code-snippet-highlight">ignore</code> will not run the job.</p> </li> <li> <p>If neither <code class="" data-testid="code-snippet-highlight">only</code> nor <code class="" data-testid="code-snippet-highlight">ignore</code> are specified then the job is skipped for all branches/tags.</p> </li> <li> <p>If both <code class="" data-testid="code-snippet-highlight">only</code> and <code class="" data-testid="code-snippet-highlight">ignore</code> are specified the <code class="" data-testid="code-snippet-highlight">only</code> is considered before <code class="" data-testid="code-snippet-highlight">ignore</code>.</p> </li> </ul> </div> <div class="paragraph"> <p>If <strong>both branch and tag</strong> filtering is configured and a push to your code includes both branch and tag information, the <strong>branch</strong> filters take precedence. In this scenario, if there are no branch filters configured, tag <code class="" data-testid="code-snippet-highlight">ignore</code> filters are used, if they exist.</p> </div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="branch-level-job-execution" data-testid="title-branch-level-job-execution" class="css-ycntf9">Branch-level job execution</h3></div></div> <div class="paragraph"> <p>The following example has one workflow that is configured to run different sets of jobs for different branches:</p> </div> <div class="ulist"> <ul> <li> <p>The <code class="" data-testid="code-snippet-highlight">test_dev</code> job is run on the <code class="" data-testid="code-snippet-highlight">dev</code> branch and any branch that begins <code class="" data-testid="code-snippet-highlight">user-</code></p> </li> <li> <p>The <code class="" data-testid="code-snippet-highlight">test_stage</code> job is run on the <code class="" data-testid="code-snippet-highlight">stage</code> branch</p> </li> <li> <p>The <code class="" data-testid="code-snippet-highlight">test_pre-prod</code> job is run on any branch starting <code class="" data-testid="code-snippet-highlight">pre-prod</code> including any suffix added to the branch name using a hyphen.</p> </li> </ul> </div> <div class="css-bdwfpm"><div data-testid="compass-info-alert" role="alert" aria-live="polite" class="css-l2fvwh"><div class="css-1i7vmqf"><div color="#0078CA" class="css-15qiqgw"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Info Circle" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M12 2C17.52 2 22 6.48 22 12C22 17.52 17.52 22 12 22C6.48 22 2 17.52 2 12C2 6.48 6.48 2 12 2ZM12 6C11.4477 6 11 6.44772 11 7C11 7.55228 11.4477 8 12 8C12.5523 8 13 7.55228 13 7C13 6.44772 12.5523 6 12 6ZM12 10C11.4477 10 11 10.4477 11 11V17C11 17.5523 11.4477 18 12 18C12.5523 18 13 17.5523 13 17V11C13 10.4477 12.5523 10 12 10Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-note" title="Note"></i> </td><td class="content"> Workflows ignore <code class="" data-testid="code-snippet-highlight">branches</code> keys used in the <code class="" data-testid="code-snippet-highlight">jobs</code> declaration. If you use the <span><a data-testid="link" href="/docs/configuration-reference/#branches" class="css-x7gnkn"> <!-- -->deprecated job-level branches key</a></span>, replace them with workflow filters. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> <div class="css-bdwfpm"><div data-testid="compass-suggestion-alert" role="alert" aria-live="polite" class="css-rcrvz9"><div class="css-1i7vmqf"><div color="#161616" class="css-3792lh"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Suggestion Lightbulb" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.96 3C12.96 2.44772 12.5123 2 11.96 2C11.4077 2 10.96 2.44772 10.96 3V4.43C10.96 4.98228 11.4077 5.43 11.96 5.43C12.5123 5.43 12.96 4.98228 12.96 4.43V3ZM16.2341 14.5901C16.2572 14.5555 16.275 14.5291 16.2868 14.5118L16.3592 14.3965C16.4802 14.1732 16.584 13.9411 16.6697 13.7021C16.8716 13.1555 16.9733 12.577 16.97 11.9943L16.9698 11.9792C16.954 11.2218 16.7664 10.478 16.421 9.80378C16.0757 9.12958 15.5817 8.54266 14.9763 8.08734C14.3709 7.63202 13.67 7.3202 12.9264 7.17544C12.1829 7.03067 11.4162 7.05674 10.6842 7.25168C9.95218 7.44662 9.27405 7.80533 8.70099 8.30072C8.12793 8.79611 7.67492 9.41523 7.37617 10.1113C7.07742 10.8074 6.94074 11.5623 6.97645 12.319C7.01216 13.0756 7.21932 13.8143 7.5823 14.4792L7.65423 14.593C7.66538 14.6093 7.68239 14.6344 7.70443 14.6672C7.74853 14.7329 7.81255 14.8297 7.88981 14.9503C8.04494 15.1925 8.25052 15.5264 8.45469 15.896C8.66041 16.2684 8.85554 16.6607 8.99681 17.022C9.14607 17.4037 9.20002 17.6639 9.20002 17.8C9.20002 18.3478 9.64074 18.7936 10.1885 18.7999L13.6585 18.8399C13.9257 18.843 14.183 18.739 14.373 18.5512C14.5631 18.3633 14.67 18.1072 14.67 17.84C14.67 17.7085 14.7255 17.444 14.8826 17.0473C15.0306 16.6735 15.2349 16.2652 15.4499 15.8768C15.6633 15.4913 15.8781 15.1416 16.0402 14.8876C16.121 14.761 16.1879 14.6594 16.2341 14.5901ZM12.5442 9.13858C12.0981 9.05172 11.6381 9.06736 11.1989 9.18432C10.7597 9.30128 10.3528 9.51651 10.0089 9.81374C9.66511 10.111 9.39331 10.4825 9.21406 10.9001C9.03481 11.3178 8.9528 11.7707 8.97422 12.2247C8.9949 12.663 9.11145 13.0911 9.31542 13.4792C9.32861 13.4985 9.34532 13.5232 9.36514 13.5527C9.4162 13.6288 9.48812 13.7375 9.57398 13.8716C9.7451 14.1388 9.97452 14.5111 10.2054 14.929C10.4346 15.3441 10.6745 15.8206 10.8595 16.2937C10.923 16.4561 10.9848 16.6299 11.0379 16.8096L12.8402 16.8304C12.895 16.6494 12.9583 16.4744 13.0231 16.3108C13.2144 15.8278 13.4626 15.3373 13.7001 14.9082C13.9392 14.4762 14.1769 14.0896 14.3542 13.8118C14.4431 13.6724 14.5176 13.5592 14.5704 13.4801C14.5915 13.4484 14.6092 13.4222 14.623 13.4018C14.6867 13.2797 14.742 13.1533 14.7883 13.0236L14.7923 13.0124C14.9108 12.6926 14.9711 12.3542 14.9701 12.0132C14.9595 11.5614 14.847 11.1178 14.641 10.7156C14.4338 10.3111 14.1374 9.95891 13.7741 9.68572C13.4109 9.41252 12.9903 9.22543 12.5442 9.13858ZM9.22998 21C9.22998 20.4477 9.6777 20 10.23 20H13.69C14.2423 20 14.69 20.4477 14.69 21C14.69 21.5523 14.2423 22 13.69 22H10.23C9.6777 22 9.22998 21.5523 9.22998 21ZM19.0071 4.9129C19.3976 5.30342 19.3976 5.93658 19.0071 6.32711L17.9971 7.33711C17.6066 7.72763 16.9734 7.72763 16.5829 7.33711C16.1923 6.94659 16.1923 6.31342 16.5829 5.9229L17.5929 4.9129C17.9834 4.52237 18.6166 4.52237 19.0071 4.9129ZM19.5 10.96C18.9477 10.96 18.5 11.4077 18.5 11.96C18.5 12.5123 18.9477 12.96 19.5 12.96H20.92C21.4723 12.96 21.92 12.5123 21.92 11.96C21.92 11.4077 21.4723 10.96 20.92 10.96H19.5ZM4.91289 4.9129C5.30341 4.52237 5.93658 4.52237 6.3271 4.9129L7.3371 5.9229C7.72763 6.31342 7.72763 6.94659 7.3371 7.33711C6.94658 7.72763 6.31341 7.72763 5.92289 7.33711L4.91289 6.32711C4.52236 5.93659 4.52236 5.30342 4.91289 4.9129ZM3 10.96C2.44772 10.96 2 11.4077 2 11.96C2 12.5123 2.44772 12.96 3 12.96H4.43C4.98228 12.96 5.43 12.5123 5.43 11.96C5.43 11.4077 4.98228 10.96 4.43 10.96H3Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td><td class="content"> This example shows how to provide strings and lists of strings when configuring workflow filters. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">workflows: dev_stage_pre-prod: jobs: - test_dev: filters: # using regex filters requires the entire branch to match branches: only: # only branches matching the below regex filters will run - dev - /user-.*/ - test_stage: filters: branches: only: stage - test_pre-prod: filters: branches: only: /pre-prod(?:-.+)?$/</code></pre> </div> </div> <div class="paragraph"> <p>This setup can be illustrated as follows:</p> </div> <div class="imageblock css-1anc138"> <div class="content"> <img src="/docs/assets/img/docs/branch_level.png" alt="Branch-Level Job Execution" data-testid="image" loading="lazy" class="css-105956i"/> </div> </div> <div class="paragraph"> <p>For more information on regular expressions, see the <span><a data-testid="link" href="/docs/workflows/#using-regular-expressions-to-filter-tags-and-branches" class="css-x7gnkn"> <!-- -->Using Regular Expressions to Filter Tags And Branches</a></span> section below.</p> </div> <div class="paragraph"> <p>For a full example of workflows, see the <span><a href="https://github.com/CircleCI-Public/circleci-demo-workflows/blob/sequential-branch-filter/.circleci/config.yml" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->configuration file<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span> for the Sample Sequential Workflow With Branching project.</p> </div> </div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="executing-workflows-for-a-git-tag" data-testid="title-executing-workflows-for-a-git-tag" class="css-ycntf9">Executing workflows for a git tag</h3></div></div> <div class="css-bdwfpm"><div data-testid="compass-info-alert" role="alert" aria-live="polite" class="css-l2fvwh"><div class="css-1i7vmqf"><div color="#0078CA" class="css-15qiqgw"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Info Circle" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M12 2C17.52 2 22 6.48 22 12C22 17.52 17.52 22 12 22C6.48 22 2 17.52 2 12C2 6.48 6.48 2 12 2ZM12 6C11.4477 6 11 6.44772 11 7C11 7.55228 11.4477 8 12 8C12.5523 8 13 7.55228 13 7C13 6.44772 12.5523 6 12 6ZM12 10C11.4477 10 11 10.4477 11 11V17C11 17.5523 11.4477 18 12 18C12.5523 18 13 17.5523 13 17V11C13 10.4477 12.5523 10 12 10Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-note" title="Note"></i> </td><td class="content"> Webhook payloads are capped at 25 MB and for some events a maximum of 3 tags. If you push several tags at once, CircleCI may not receive them all. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> <div class="paragraph"> <p>CircleCI does not run workflows for tags unless you explicitly specify tag filters using regular expressions. Both lightweight and annotated tags are supported.</p> </div> <div class="paragraph"> <p>If you have configured a job to run on a git tag you must also specify tag filters for any dependent jobs. Use <span><a data-testid="link" href="/docs/workflows/#using-regular-expressions-to-filter-tags-and-branches" class="css-x7gnkn"> <!-- -->regular expressions</a></span> to specify tag filters for a job.</p> </div> <hr/> <div class="paragraph"> <p>In the example below, two workflows are defined:</p> </div> <div class="ulist"> <ul> <li> <p><code class="" data-testid="code-snippet-highlight">untagged-build</code> runs the <code class="" data-testid="code-snippet-highlight">build</code> job for all branches.</p> </li> <li> <p><code class="" data-testid="code-snippet-highlight">tagged-build</code> runs <code class="" data-testid="code-snippet-highlight">build</code> for all branches <strong>and</strong> all tags starting with <code class="" data-testid="code-snippet-highlight">v</code>.</p> </li> </ul> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">workflows: untagged-build: jobs: - build tagged-build: jobs: - build: filters: tags: only: /^v.*/</code></pre> </div> </div> <hr/> <div class="paragraph"> <p>In the example below, two jobs are configured within the <code class="" data-testid="code-snippet-highlight">build-deploy</code> workflow:</p> </div> <div class="ulist"> <ul> <li> <p>The <code class="" data-testid="code-snippet-highlight">build</code> job runs for all branches and all tags.</p> </li> <li> <p>The <code class="" data-testid="code-snippet-highlight">deploy</code> job runs for all branches and only for tags starting with 'v'.</p> </li> </ul> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">workflows: build-deploy: jobs: - build: filters: # required since `deploy` has tag filters AND requires `build` tags: only: /.*/ - deploy: requires: - build filters: tags: only: /^v.*/</code></pre> </div> </div> <hr/> <div class="paragraph"> <p>In the example below, three jobs are configured for the <code class="" data-testid="code-snippet-highlight">build-test-deploy</code> workflow:</p> </div> <div class="ulist"> <ul> <li> <p>The <code class="" data-testid="code-snippet-highlight">build</code> job runs for all branches and only tags starting with 'config-test'.</p> </li> <li> <p>The <code class="" data-testid="code-snippet-highlight">test</code> job runs once the <code class="" data-testid="code-snippet-highlight">build</code> job completes for all branches and only tags starting with 'config-test'.</p> </li> <li> <p>The <code class="" data-testid="code-snippet-highlight">deploy</code> job runs once the <code class="" data-testid="code-snippet-highlight">test</code> job completes for no branches and only tags starting with 'config-test'.</p> </li> </ul> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">workflows: build-test-deploy: jobs: - build: filters: # required since `test` has tag filters AND requires `build` tags: only: /^config-test.*/ - test: requires: - build filters: # required since `deploy` has tag filters AND requires `test` tags: only: /^config-test.*/ - deploy: requires: - test filters: tags: only: /^config-test.*/ branches: ignore: /.*/</code></pre> </div> </div> <hr/> <div class="paragraph"> <p>In the example below, two jobs are defined (<code class="" data-testid="code-snippet-highlight">test</code> and <code class="" data-testid="code-snippet-highlight">deploy</code>) and three workflows use those jobs:</p> </div> <div class="ulist"> <ul> <li> <p>The <code class="" data-testid="code-snippet-highlight">build</code> workflow runs for all branches except <code class="" data-testid="code-snippet-highlight">main</code> and is not run on tags.</p> </li> <li> <p>The <code class="" data-testid="code-snippet-highlight">staging</code> workflow will only run on the <code class="" data-testid="code-snippet-highlight">main</code> branch and is not run on tags.</p> </li> <li> <p>The <code class="" data-testid="code-snippet-highlight">production</code> workflow runs for no branches and only for tags starting with <code class="" data-testid="code-snippet-highlight">v.</code>.</p> </li> </ul> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">workflows: build: # This workflow will run on all branches except 'main' and will not run on tags jobs: - test: filters: branches: ignore: main staging: # This workflow will only run on 'main' and will not run on tags jobs: - test: filters: &filters-staging # this yaml anchor is setting these values to "filters-staging" branches: only: main - deploy: requires: - test filters: <<: *filters-staging # this is calling the previously set yaml anchor production: # This workflow will only run on tags (specifically starting with 'v.') and will not run on branches jobs: - test: filters: &filters-production # this yaml anchor is setting these values to "filters-production" branches: ignore: /.*/ tags: only: /^v.*/ - deploy: requires: - test filters: <<: *filters-production # this is calling the previously set yaml anchor</code></pre> </div> </div> </div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="using-regular-expressions-to-filter-tags-and-branches" data-testid="title-using-regular-expressions-to-filter-tags-and-branches" class="css-ycntf9">Using regular expressions to filter tags and branches</h3></div></div> <div class="paragraph"> <p>CircleCI branch and tag filters support the Java variant of regex pattern matching. When writing filters, CircleCI matches exact regular expressions.</p> </div> <div class="paragraph"> <p>For example, <code class="" data-testid="code-snippet-highlight">only: /^config-test/</code> only matches the <code class="" data-testid="code-snippet-highlight">config-test</code> tag. To match all tags starting with <code class="" data-testid="code-snippet-highlight">config-test</code>, use <code class="" data-testid="code-snippet-highlight">only: /^config-test.*/</code> instead.</p> </div> <div class="paragraph"> <p>Using tags for semantic versioning is a common use case. To match patch versions 3-7 of a 2.1 release, you can write <code class="" data-testid="code-snippet-highlight">/^version-2\.1\.[3-7]/</code>.</p> </div> <div class="paragraph"> <p>For full details on pattern-matching rules, see the <span><a href="https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <code class="" data-testid="code-snippet-highlight">java.util.regex</code> documentation<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span>.</p> </div> </div> </div> </div> <div class="sect1"> <div><div class="css-1gt1ibw"><h2 id="using-workspaces-to-share-data-between-jobs" data-testid="title-using-workspaces-to-share-data-between-jobs" class="css-sycgw4">Using workspaces to share data between jobs</h2></div></div> <div class="sectionbody"> <div class="paragraph"> <p>Each workflow has an associated <span><a data-testid="link" href="/docs/configuration-reference/#persisttoworkspace" class="css-x7gnkn"> <!-- -->workspace</a></span> for transferring files to downstream jobs as a workflow progresses.</p> </div> <div class="paragraph"> <p>Configuration options are available to:</p> </div> <div class="ulist"> <ul> <li> <p><span><a data-testid="link" href="/docs/configuration-reference/#persisttoworkspace" class="css-x7gnkn"> <!-- -->persist files to the workspace</a></span></p> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">- persist_to_workspace: root: /tmp/workspace paths: - target/application.jar - build/*</code></pre> </div> </div> </li> <li> <p><span><a data-testid="link" href="/docs/configuration-reference/#attachworkspace" class="css-x7gnkn"> <!-- -->attach a workflow’s workspace</a></span> to a container.</p> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-yaml" data-testid="code-snippet-highlight">- attach_workspace: at: /tmp/workspace</code></pre> </div> </div> </li> </ul> </div> <div class="paragraph"> <p>For further information on workspaces and their configuration see the <span><a data-testid="link" href="/docs/workspaces/" class="css-x7gnkn"> <!-- -->Using Workspaces to Share Data Between Jobs</a></span> doc.</p> </div> </div> </div> <div class="sect1"> <div><div class="css-1gt1ibw"><h2 id="rerunning-a-workflows-failed-jobs" data-testid="title-rerunning-a-workflows-failed-jobs" class="css-sycgw4">Rerunning a workflow’s failed jobs</h2></div></div> <div class="sectionbody"> <div class="paragraph"> <p>Workflows help to speed up your ability to respond to failures. One way to do this is to only rerun failed jobs rather than a whole workflow. To rerun only a workflow’s <em>failed</em> jobs, follow these steps:</p> </div> <div class="olist arabic"> <ol class="arabic"> <li> <p>In the <span><a href="https://app.circleci.com/home/" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->CircleCI web app<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span> select your organization.</p> </li> <li> <p>Select <strong>Pipelines</strong> in the sidebar.</p> </li> <li> <p>Use the filters to find your project and pipeline.</p> </li> <li> <p>Find the row in the pipeline view for the workflow you would like to rerun from failed and select the <strong>Rerun from failed</strong> icon. This option is also available in the workflow view using the rerun dropdown menu, which you can access by clicking on the workflow name or badge.</p> </li> </ol> </div> <div data-testid="compass-tabs" class="css-bdwfpm"><div class="css-bdwfpm"><div id="groupName-rerun-screenshot-tabs" role="tablist" aria-label="Tabs" class="css-1utggbq"><div class="css-1h7v07b"><button id="groupName-rerun-screenshot-Rerun-from the pipelines page" tabindex="0" aria-selected="false" role="tab" type="button" class="css-1h2mcfj">Rerun from the pipelines page</button><button id="groupName-rerun-screenshot-Rerun-from the workflows page" tabindex="0" aria-selected="false" role="tab" type="button" class="css-1h2mcfj">Rerun from the workflows page</button></div></div><div id="groupName-rerun-screenshot-Rerun-from the pipelines page-panel" hidden="" style="display:none" role="tabpanel" tabindex="0" aria-labelledby="groupName-rerun-screenshot-Rerun-from the pipelines page" class="css-c4at1j"><div class="groupName-rerun-screenshot tabName-Rerun_from_the_pipelines_page openblock"> <div class="content"> <div class="imageblock css-1anc138"> <div class="content"> <img src="/docs/assets/img/docs/orchestrate-and-trigger/rerun-from-failed-pipelines-page.png" alt="Rerun a workflow from failed from the pipelines page" data-testid="image" loading="lazy" class="css-105956i"/> </div> </div> </div> </div></div><div id="groupName-rerun-screenshot-Rerun-from the workflows page-panel" hidden="" style="display:none" role="tabpanel" tabindex="0" aria-labelledby="groupName-rerun-screenshot-Rerun-from the workflows page" class="css-c4at1j"><div class="groupName-rerun-screenshot tabName-Rerun_from_the_workflows_page openblock"> <div class="content"> <div class="imageblock css-1anc138"> <div class="content"> <img src="/docs/assets/img/docs/orchestrate-and-trigger/rerun-from-failed-workflows-page.png" alt="Rerun a workflow from failed from the workflows page" data-testid="image" loading="lazy" class="css-105956i"/> </div> </div> </div> </div></div></div></div> <!-- --> <div class="css-bdwfpm"><div data-testid="compass-info-alert" role="alert" aria-live="polite" class="css-l2fvwh"><div class="css-1i7vmqf"><div color="#0078CA" class="css-15qiqgw"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Info Circle" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M12 2C17.52 2 22 6.48 22 12C22 17.52 17.52 22 12 22C6.48 22 2 17.52 2 12C2 6.48 6.48 2 12 2ZM12 6C11.4477 6 11 6.44772 11 7C11 7.55228 11.4477 8 12 8C12.5523 8 13 7.55228 13 7C13 6.44772 12.5523 6 12 6ZM12 10C11.4477 10 11 10.4477 11 11V17C11 17.5523 11.4477 18 12 18C12.5523 18 13 17.5523 13 17V11C13 10.4477 12.5523 10 12 10Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-note" title="Note"></i> </td><td class="content"> If you rerun a workflow containing a job that was previously re-run with SSH, the new workflow runs with SSH enabled for that job, even after SSH capability is disabled at the project level. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="states" data-testid="title-states" class="css-ycntf9">Workflow states</h3></div></div> <div class="paragraph"> <p>Workflows may have one of the following states:</p> </div> <div style="overflow:auto"><table class="tableblock frame-all grid-all stripes-even stretch table table-striped"><thead><tr><th class="tableblock halign-left valign-top">State</th><th class="tableblock halign-left valign-top">Description</th><th class="tableblock halign-left valign-top">Terminal state</th></tr></thead><tbody><tr><td class="tableblock halign-left valign-top"><p class="tableblock">RUNNING</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Workflow is in progress</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">No</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">NOT RUN</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Workflow never started</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Yes</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">CANCELED</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Workflow canceled before it finished</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Yes</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">FAILING</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">A job in the workflow failed, but others are still running or yet to be approved</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">No</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">FAILED</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">One or more jobs in the workflow failed</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Yes</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">SUCCESS</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">All jobs in the workflow completed successfully</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Yes</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">NEEDS APPROVAL (UI) / ON HOLD</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">A job in the workflow is waiting for approval</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">No</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">ERROR</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">We experienced an internal error starting a job in the workflow</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Yes</p></td></tr><tr><td class="tableblock halign-left valign-top"><p class="tableblock">UNAUTHORIZED</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">One or more of the jobs terminated with a <code class="" data-testid="code-snippet-highlight">unauthorized</code> job status. The user who triggered the pipeline or approved an approval job does not have access to a required restricted context.</p></td><td class="tableblock halign-left valign-top"><p class="tableblock">Yes</p></td></tr></tbody></table></div> <div class="css-bdwfpm"><div data-testid="compass-info-alert" role="alert" aria-live="polite" class="css-l2fvwh"><div class="css-1i7vmqf"><div color="#0078CA" class="css-15qiqgw"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Info Circle" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M12 2C17.52 2 22 6.48 22 12C22 17.52 17.52 22 12 22C6.48 22 2 17.52 2 12C2 6.48 6.48 2 12 2ZM12 6C11.4477 6 11 6.44772 11 7C11 7.55228 11.4477 8 12 8C12.5523 8 13 7.55228 13 7C13 6.44772 12.5523 6 12 6ZM12 10C11.4477 10 11 10.4477 11 11V17C11 17.5523 11.4477 18 12 18C12.5523 18 13 17.5523 13 17V11C13 10.4477 12.5523 10 12 10Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-note" title="Note"></i> </td><td class="content"> After 90 days non-terminal workflows are automatically by CircleCI. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> </div> </div> </div> <div class="sect1"> <div><div class="css-1gt1ibw"><h2 id="troubleshooting" data-testid="title-troubleshooting" class="css-sycgw4">Troubleshooting</h2></div></div> <div class="sectionbody"> <div class="paragraph"> <p>This section describes common problems and solutions for workflows.</p> </div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="workflow-and-subsequent-jobs-do-not-trigger" data-testid="title-workflow-and-subsequent-jobs-do-not-trigger" class="css-ycntf9">Workflow and subsequent jobs do not trigger</h3></div></div> <div class="paragraph"> <p>If you do not see your workflows running, check for configuration errors that may be preventing the workflow from starting. Navigate to your <span><a href="https://app.circleci.com/pipelines/" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->project’s pipelines<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span> and find your workflow name to locate the failure.</p> </div> </div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="rerunning-workflows-fails" data-testid="title-rerunning-workflows-fails" class="css-ycntf9">Rerunning workflows fails</h3></div></div> <div class="paragraph"> <p>Failures may happen before a workflow runs during pipeline processing. Re-running the in this case workflow will fail. Push a change to the project repository or use the trigger pipeline option to rerun the pipeline.</p> </div> <div class="css-bdwfpm"><div data-testid="compass-info-alert" role="alert" aria-live="polite" class="css-l2fvwh"><div class="css-1i7vmqf"><div color="#0078CA" class="css-15qiqgw"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Info Circle" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M12 2C17.52 2 22 6.48 22 12C22 17.52 17.52 22 12 22C6.48 22 2 17.52 2 12C2 6.48 6.48 2 12 2ZM12 6C11.4477 6 11 6.44772 11 7C11 7.55228 11.4477 8 12 8C12.5523 8 13 7.55228 13 7C13 6.44772 12.5523 6 12 6ZM12 10C11.4477 10 11 10.4477 11 11V17C11 17.5523 11.4477 18 12 18C12.5523 18 13 17.5523 13 17V11C13 10.4477 12.5523 10 12 10Z"></path></svg></div><div id="collapsible-flex" class="css-45kv77"><div class="css-seohoz"><span class="css-1c1tyii"> <div style="overflow:auto"><table><tbody><tr><td class="icon"> <i class="fa icon-note" title="Note"></i> </td><td class="content"> You cannot rerun jobs and workflows that are >= 90 days. </td></tr></tbody></table></div> </span></div><div class="css-1828gbe"> <!-- --> </div><div class="css-1828gbe"> <!-- --> </div></div></div></div></div> </div> <div class="sect2"> <div><div class="css-1gt1ibw"><h3 id="workflows-waiting-for-status-in-github" data-testid="title-workflows-waiting-for-status-in-github" class="css-ycntf9">Workflows waiting for status in GitHub</h3></div></div> <div class="paragraph"> <p>If you have workflows configured on a protected branch and the status check never completes, check the <code class="" data-testid="code-snippet-highlight">ci/circleci</code> status key. <code class="" data-testid="code-snippet-highlight">ci/circleci</code> is related to a deprecated check and should be and deselected.</p> </div> <div class="imageblock css-1anc138"> <div class="content"> <img src="/docs/assets/img/docs/github_branches_status.png" alt="Uncheck GitHub Status Keys" data-testid="image" loading="lazy" class="css-105956i"/> </div> </div> <div class="paragraph"> <p>Go to <span class="menuseq"><b class="menu">Settings</b> <i class="fa fa-angle-right caret"></i> <b class="menuitem">Branches</b></span> in GitHub and select <b class="button">Edit</b> on the protected branch to deselect the settings, for example: <code class="" data-testid="code-snippet-highlight">https://github.com/your-org/project/settings/branches</code>.</p> </div> </div> </div> </div> <div class="sect1"> <div><div class="css-1gt1ibw"><h2 id="see-also" data-testid="title-see-also" class="css-sycgw4">See also</h2></div></div> <div class="sectionbody"> <div class="ulist"> <ul> <li> <p>See the <span><a data-testid="link" href="/docs/faq/#workflows" class="css-x7gnkn"> <!-- -->workflows</a></span> section of the FAQ.</p> </li> <li> <p>For workflow configuration examples, see the <span><a href="https://github.com/CircleCI-Public/circleci-demo-workflows" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"> <!-- -->CircleCI Demo Workflows<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span> page on GitHub.</p> </li> </ul> </div> </div> </div></div><style data-emotion-css="7hkygd">.css-7hkygd{margin:1.25rem 0;}</style><section class="css-7hkygd"><hr/><style data-emotion-css="19dgxp1">.css-19dgxp1{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;gap:4rem;}</style><div class="css-19dgxp1"><div class="css-qcooo9"><style data-emotion-css="2xshll">.css-2xshll{margin-bottom:1.25rem;margin-top:10px;}</style><style data-emotion-css="xvmmyz">.css-xvmmyz{box-sizing:border-box;min-width:0;margin:0;color:#161616;font-size:1.25rem;font-weight:500;line-height:1.4;margin-bottom:1.25rem;margin-top:10px;}</style><h4 class="css-xvmmyz">Suggest an edit to this page</h4><span><a href="https://github.com/circleci/circleci-docs/blob/master/jekyll/_cci2/workflows.adoc" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"><style data-emotion-css="v3gaol">.css-v3gaol{width:20px;height:20px;min-width:20px;color:currentColor;}</style><div size="20" color="currentColor" class="css-v3gaol"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Git Pull Request" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path fill-rule="evenodd" clip-rule="evenodd" d="M11.2929 5.29289C10.9024 5.68342 10.9024 6.31658 11.2929 6.70711L14.2929 9.70711C14.6834 10.0976 15.3166 10.0976 15.7071 9.70711C16.0976 9.31658 16.0976 8.68342 15.7071 8.29289L14.4142 7H16C16.5523 7 17 7.44772 17 8V15.1449C15.5543 15.5752 14.5 16.9145 14.5 18.5C14.5 20.433 16.067 22 18 22C19.933 22 21.5 20.433 21.5 18.5C21.5 16.9145 20.4457 15.5752 19 15.1449V8C19 6.34315 17.6569 5 16 5H14.4142L15.7071 3.70711C16.0976 3.31658 16.0976 2.68342 15.7071 2.29289C15.3166 1.90237 14.6834 1.90237 14.2929 2.29289L11.2929 5.29289ZM5 6.5C5 5.67157 5.67157 5 6.5 5C7.32843 5 8 5.67157 8 6.5C8 7.32843 7.32843 8 6.5 8C5.67157 8 5 7.32843 5 6.5ZM7.5 9.85506C8.94574 9.42479 10 8.08551 10 6.5C10 4.567 8.433 3 6.5 3C4.567 3 3 4.567 3 6.5C3 8.08551 4.05426 9.42479 5.5 9.85506V15.1449C4.05426 15.5752 3 16.9145 3 18.5C3 20.433 4.567 22 6.5 22C8.433 22 10 20.433 10 18.5C10 16.9145 8.94574 15.5752 7.5 15.1449V9.85506ZM6.5 17C5.67157 17 5 17.6716 5 18.5C5 19.3284 5.67157 20 6.5 20C7.32843 20 8 19.3284 8 18.5C8 17.6716 7.32843 17 6.5 17ZM18 17C17.1716 17 16.5 17.6716 16.5 18.5C16.5 19.3284 17.1716 20 18 20C18.8284 20 19.5 19.3284 19.5 18.5C19.5 17.6716 18.8284 17 18 17Z"></path></svg></div>Make a contribution<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span><span><a href="https://github.com/circleci/circleci-docs/blob/master/docs/CONTRIBUTING.md#contributing-to-circleci-docs" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"><div size="20" color="currentColor" class="css-v3gaol"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Approve" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M11.6386 8.85709C12.8363 7.34424 13.4053 5.22606 13.646 4.06665L13.7732 4.07643C14.4084 4.17391 14.8302 4.7616 14.7024 5.41633C14.4483 6.60149 13.9857 8.63287 13.3427 9.78242C12.6912 10.8929 13.5638 12.1818 14.7 12.1818H19.7728C19.8058 12.1818 19.8657 12.1981 19.9247 12.2571C19.9838 12.3162 20 12.3761 20 12.4091C20 12.4421 19.9838 12.5021 19.9247 12.5611C19.8657 12.6201 19.8058 12.6364 19.7728 12.6364H18.9546C18.4023 12.6364 17.9546 13.0841 17.9546 13.6364C17.9546 14.1887 18.4023 14.6364 18.9546 14.6364C18.9876 14.6364 19.0475 14.6526 19.1066 14.7117C19.1656 14.7707 19.1819 14.8306 19.1819 14.8637C19.1819 14.8967 19.1656 14.9566 19.1066 15.0156C19.0475 15.0747 18.9876 15.0909 18.9546 15.0909H18.1364C17.5841 15.0909 17.1364 15.5386 17.1364 16.0909C17.1364 16.6432 17.5841 17.0909 18.1364 17.0909C18.1694 17.0909 18.2293 17.1072 18.2884 17.1662C18.3474 17.2253 18.3637 17.2852 18.3637 17.3182C18.3637 17.3512 18.3474 17.4111 18.2884 17.4702C18.2293 17.5292 18.1694 17.5455 18.1364 17.5455H17.3182C16.7659 17.5455 16.3182 17.9932 16.3182 18.5455C16.3182 19.0978 16.7659 19.5455 17.3182 19.5455C17.3512 19.5455 17.4112 19.5617 17.4702 19.6208C17.5292 19.6798 17.5455 19.7397 17.5455 19.7727C17.5455 19.8058 17.5292 19.8657 17.4702 19.9247C17.4112 19.9838 17.3512 20 17.3182 20H11.5091C10.2295 20 9.29059 19.6463 8.68113 19.3077C8.42899 19.1676 8.23214 19.0294 8.09094 18.9187V12.225L8.16104 12.1662C8.42917 11.941 8.79898 11.6259 9.20579 11.2661C10.0043 10.5597 10.9987 9.63447 11.6265 8.87209L11.6386 8.85709ZM21.1819 14.8637C21.1819 14.6341 21.1449 14.4113 21.0768 14.2009C21.6321 13.7912 22 13.1338 22 12.4091C22 11.2023 20.9796 10.1818 19.7728 10.1818H15.3766C16.0315 8.72943 16.4529 6.79313 16.6597 5.82775L16.6624 5.81432C17.0203 4.02485 15.8184 2.33119 14.014 2.09061C13.9956 2.08815 13.9771 2.08621 13.9585 2.08478L13.3703 2.03953C12.5717 1.9781 11.8938 2.5452 11.7592 3.29181C11.5854 4.25625 11.0994 6.31052 10.0764 7.60821C9.55796 8.23586 8.67438 9.06591 7.88064 9.76807C7.83197 9.81112 7.78384 9.85352 7.73636 9.89519C7.46121 9.5701 7.05016 9.36371 6.59091 9.36371H3.5C2.67157 9.36371 2 10.0353 2 10.8637V20.5001C2 21.3285 2.67157 22.0001 3.5 22.0001H6.59091C7.177 22.0001 7.68459 21.6639 7.93139 21.1739C8.785 21.6089 9.98048 22 11.5091 22H17.3182C18.525 22 19.5455 20.9796 19.5455 19.7727C19.5455 19.5432 19.5086 19.3203 19.4404 19.11C19.9957 18.7003 20.3637 18.0429 20.3637 17.3182C20.3637 17.0886 20.3267 16.8658 20.2586 16.6555C20.8139 16.2458 21.1819 15.5883 21.1819 14.8637ZM4 20.0001V11.3637H6.09091V20.0001H4Z"></path></svg></div> <!-- -->Learn how to contribute<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span></div><div class="css-qcooo9"><h4 class="css-xvmmyz">Still need help?</h4><span><a href="https://discuss.circleci.com/" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"><div size="24" color="currentColor" class="css-19wtgi5"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Organization" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path d="M22 15.5417V16C22 16.5523 21.5523 17 21 17H18.5V15.5417C18.5 14.6783 18.045 14.0192 17.39 13.5292C18.5364 13.4276 22 13.9336 22 15.5417ZM18.4576 11.75C17.4498 11.75 16.6364 10.9683 16.6364 10C16.6364 9.03167 17.4498 8.25 18.4576 8.25C19.4653 8.25 20.2727 9.03167 20.2727 10C20.2727 10.9683 19.4653 11.75 18.4576 11.75ZM6.61 13.5292C5.95504 14.0192 5.5 14.6783 5.5 15.5417V17H3C2.44772 17 2 16.5523 2 16V15.5417C2 13.8811 5.33594 13.4163 6.61 13.5292ZM5.54242 11.75C4.53468 11.75 3.72727 10.9683 3.72727 10C3.72727 9.03167 4.53468 8.25 5.54242 8.25C6.55016 8.25 7.36364 9.03167 7.36364 10C7.36364 10.9683 6.55016 11.75 5.54242 11.75ZM12 12.625C13.8156 12.625 16.5 13.5756 16.5 15.4688V16.5C16.5 17.0523 16.0523 17.5 15.5 17.5H8.49998C7.9477 17.5 7.49998 17.0523 7.49998 16.5V15.4688C7.49998 13.5756 10.1844 12.625 12 12.625ZM12.0042 11.3563C10.6185 11.3563 9.5 10.2717 9.5 8.92813C9.5 7.58456 10.6185 6.5 12.0042 6.5C13.3898 6.5 14.5 7.58456 14.5 8.92813C14.5 10.2717 13.3898 11.3563 12.0042 11.3563Z"></path></svg></div> <!-- -->Ask the CircleCI community<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span><span><a data-testid="link" href="https://circleci.com/research" class="css-x7gnkn"><div size="24" color="currentColor" class="css-19wtgi5"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Suggestion Lightbulb" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.96 3C12.96 2.44772 12.5123 2 11.96 2C11.4077 2 10.96 2.44772 10.96 3V4.43C10.96 4.98228 11.4077 5.43 11.96 5.43C12.5123 5.43 12.96 4.98228 12.96 4.43V3ZM16.2341 14.5901C16.2572 14.5555 16.275 14.5291 16.2868 14.5118L16.3592 14.3965C16.4802 14.1732 16.584 13.9411 16.6697 13.7021C16.8716 13.1555 16.9733 12.577 16.97 11.9943L16.9698 11.9792C16.954 11.2218 16.7664 10.478 16.421 9.80378C16.0757 9.12958 15.5817 8.54266 14.9763 8.08734C14.3709 7.63202 13.67 7.3202 12.9264 7.17544C12.1829 7.03067 11.4162 7.05674 10.6842 7.25168C9.95218 7.44662 9.27405 7.80533 8.70099 8.30072C8.12793 8.79611 7.67492 9.41523 7.37617 10.1113C7.07742 10.8074 6.94074 11.5623 6.97645 12.319C7.01216 13.0756 7.21932 13.8143 7.5823 14.4792L7.65423 14.593C7.66538 14.6093 7.68239 14.6344 7.70443 14.6672C7.74853 14.7329 7.81255 14.8297 7.88981 14.9503C8.04494 15.1925 8.25052 15.5264 8.45469 15.896C8.66041 16.2684 8.85554 16.6607 8.99681 17.022C9.14607 17.4037 9.20002 17.6639 9.20002 17.8C9.20002 18.3478 9.64074 18.7936 10.1885 18.7999L13.6585 18.8399C13.9257 18.843 14.183 18.739 14.373 18.5512C14.5631 18.3633 14.67 18.1072 14.67 17.84C14.67 17.7085 14.7255 17.444 14.8826 17.0473C15.0306 16.6735 15.2349 16.2652 15.4499 15.8768C15.6633 15.4913 15.8781 15.1416 16.0402 14.8876C16.121 14.761 16.1879 14.6594 16.2341 14.5901ZM12.5442 9.13858C12.0981 9.05172 11.6381 9.06736 11.1989 9.18432C10.7597 9.30128 10.3528 9.51651 10.0089 9.81374C9.66511 10.111 9.39331 10.4825 9.21406 10.9001C9.03481 11.3178 8.9528 11.7707 8.97422 12.2247C8.9949 12.663 9.11145 13.0911 9.31542 13.4792C9.32861 13.4985 9.34532 13.5232 9.36514 13.5527C9.4162 13.6288 9.48812 13.7375 9.57398 13.8716C9.7451 14.1388 9.97452 14.5111 10.2054 14.929C10.4346 15.3441 10.6745 15.8206 10.8595 16.2937C10.923 16.4561 10.9848 16.6299 11.0379 16.8096L12.8402 16.8304C12.895 16.6494 12.9583 16.4744 13.0231 16.3108C13.2144 15.8278 13.4626 15.3373 13.7001 14.9082C13.9392 14.4762 14.1769 14.0896 14.3542 13.8118C14.4431 13.6724 14.5176 13.5592 14.5704 13.4801C14.5915 13.4484 14.6092 13.4222 14.623 13.4018C14.6867 13.2797 14.742 13.1533 14.7883 13.0236L14.7923 13.0124C14.9108 12.6926 14.9711 12.3542 14.9701 12.0132C14.9595 11.5614 14.847 11.1178 14.641 10.7156C14.4338 10.3111 14.1374 9.95891 13.7741 9.68572C13.4109 9.41252 12.9903 9.22543 12.5442 9.13858ZM9.22998 21C9.22998 20.4477 9.6777 20 10.23 20H13.69C14.2423 20 14.69 20.4477 14.69 21C14.69 21.5523 14.2423 22 13.69 22H10.23C9.6777 22 9.22998 21.5523 9.22998 21ZM19.0071 4.9129C19.3976 5.30342 19.3976 5.93658 19.0071 6.32711L17.9971 7.33711C17.6066 7.72763 16.9734 7.72763 16.5829 7.33711C16.1923 6.94659 16.1923 6.31342 16.5829 5.9229L17.5929 4.9129C17.9834 4.52237 18.6166 4.52237 19.0071 4.9129ZM19.5 10.96C18.9477 10.96 18.5 11.4077 18.5 11.96C18.5 12.5123 18.9477 12.96 19.5 12.96H20.92C21.4723 12.96 21.92 12.5123 21.92 11.96C21.92 11.4077 21.4723 10.96 20.92 10.96H19.5ZM4.91289 4.9129C5.30341 4.52237 5.93658 4.52237 6.3271 4.9129L7.3371 5.9229C7.72763 6.31342 7.72763 6.94659 7.3371 7.33711C6.94658 7.72763 6.31341 7.72763 5.92289 7.33711L4.91289 6.32711C4.52236 5.93659 4.52236 5.30342 4.91289 4.9129ZM3 10.96C2.44772 10.96 2 11.4077 2 11.96C2 12.5123 2.44772 12.96 3 12.96H4.43C4.98228 12.96 5.43 12.5123 5.43 11.96C5.43 11.4077 4.98228 10.96 4.43 10.96H3Z"></path></svg></div> <!-- -->Join the research community</a></span><span><a href="https://support.circleci.com/" target="_blank" rel="noopener noreferrer" data-testid="external-link" class="css-x7gnkn"><div size="24" color="currentColor" class="css-19wtgi5"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="Support" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-bleycz"><path fill-rule="evenodd" clip-rule="evenodd" d="M3 7C3 5.89543 3.89543 5 5 5H20C21.1046 5 22 5.89543 22 7V15C22 16.1046 21.1046 17 20 17H6.70588L3.88597 20.4242C3.58776 20.7863 3 20.5754 3 20.1063V15V10.7583V7ZM7.5 13C8.32843 13 9 12.3284 9 11.5C9 10.6716 8.32843 10 7.5 10C6.67157 10 6 10.6716 6 11.5C6 12.3284 6.67157 13 7.5 13ZM14 11.5C14 12.3284 13.3284 13 12.5 13C11.6716 13 11 12.3284 11 11.5C11 10.6716 11.6716 10 12.5 10C13.3284 10 14 10.6716 14 11.5ZM17.5 13C18.3284 13 19 12.3284 19 11.5C19 10.6716 18.3284 10 17.5 10C16.6716 10 16 10.6716 16 11.5C16 12.3284 16.6716 13 17.5 13Z"></path></svg></div> <!-- -->Visit our Support site<span color="currentColor" class="css-1ie5e7y"><svg role="img" focusable="false" viewBox="0 0 24 24" aria-label="New Window Link" data-testid="external-icon" class="css-qzco2h"><path fill-rule="evenodd" d="M9,4 L15,4 L15.0752385,4.00278786 L15.2007255,4.02024007 L15.3121422,4.04973808 L15.4232213,4.09367335 L15.5207085,4.14599544 L15.6170221,4.21292768 L15.7071408,4.29291093 C15.7425006,4.32828725 15.7746868,4.3656744 15.8036651,4.40469337 L15.8753285,4.51593788 L15.9287742,4.62866395 L15.9641546,4.73400701 L15.9932723,4.88337887 L16,5 L16,11 C16,11.5522847 15.5522847,12 15,12 C14.4871642,12 14.0644928,11.6139598 14.0067277,11.1166211 L14,11 L14,7.414 L10.0502525,11.363961 C9.65972827,11.7544853 9.02656329,11.7544853 8.63603899,11.363961 C8.27555502,11.0034771 8.24782547,10.436246 8.55285035,10.0439548 L8.63603895,9.94974748 L12.585,5.999 L9,6 C8.48716416,6 8.06449284,5.61395981 8.00672773,5.11662113 L8,5 C8,4.48716416 8.38604019,4.06449284 8.88337887,4.00672773 L9,4 Z"></path></svg></span></a></span></div></div></section></div></div></div></div></div></div> </article><style data-emotion-css="18c0lxf">.css-18c0lxf{padding:3rem 0;}</style><style data-emotion-css="1ccmuz">.css-1ccmuz{box-sizing:border-box;min-width:0;margin:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:3rem 0;}</style><footer class="css-1ccmuz"><style data-emotion-css="1s092o">.css-1s092o{width:100%;background:#FFFFFF;}@media (max-width:768px){.css-1s092o{margin-left:0;width:100%;}}</style><div class="css-1s092o"><style data-emotion-css="mrk95c">.css-mrk95c{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;border-top:2px solid #343434;padding:1.5rem 0 1.75rem;}@media (min-width:992px){.css-mrk95c{padding:1rem 0;}}.css-mrk95c:first-of-type{border-top:none;}@media (max-width:768px){.css-mrk95c:first-of-type{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}}</style><div class="css-mrk95c"><a href="https://circleci.com/docs/" data-testid="footer-circleci-logo" class="css-si22pm"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 100" width="126" class="css-1yqyrw2"><circle fill="#161616" cx="30.44" cy="52.5" r="7.471"></circle><path fill="#161616" d="M30.44 21.124c-14.619 0-26.903 10-30.388 23.532-.03.119-.052.244-.052.373 0 .825.669 1.494 1.494 1.494h12.651c.603 0 1.118-.358 1.354-.873 0 0 .019-.035.025-.052 2.608-5.628 8.304-9.533 14.914-9.533 9.077 0 16.436 7.357 16.436 16.435S39.517 68.935 30.44 68.935c-6.61 0-12.305-3.905-14.914-9.532-.007-.018-.026-.053-.026-.053a1.489 1.489 0 0 0-1.354-.873H1.495c-.826 0-1.495.669-1.495 1.494 0 .129.021.254.052.373C3.537 73.876 15.821 83.876 30.44 83.876c17.329 0 31.376-14.048 31.376-31.376S47.769 21.124 30.44 21.124zM112.482 59.855h-4.268a.919.919 0 0 0-.729.361c-2.479 3.664-6.671 6.074-11.428 6.074-7.617 0-13.791-6.175-13.791-13.791 0-7.617 6.174-13.792 13.791-13.792 4.758 0 8.949 2.412 11.429 6.075a.916.916 0 0 0 .728.361h4.268a.92.92 0 0 0 .921-.919.91.91 0 0 0-.101-.413c-3.18-6.299-9.706-10.621-17.244-10.621-10.663 0-19.309 8.645-19.309 19.309 0 10.663 8.646 19.309 19.309 19.309 7.538 0 14.064-4.322 17.243-10.621a.914.914 0 0 0 .102-.413.92.92 0 0 0-.921-.919zM125.355 26.756a3.678 3.678 0 1 1-7.357 0 3.678 3.678 0 0 1 7.357 0zm-.919 43.213V34.11h-5.517v35.858a.92.92 0 0 0 .919.919h3.679a.918.918 0 0 0 .919-.918zM148.355 33.214c-5.564.262-10.008 2.921-12.887 6.981v-5.166a.92.92 0 0 0-.919-.919h-3.678a.92.92 0 0 0-.919.919v34.939c0 .508.41.919.919.919h3.678a.918.918 0 0 0 .919-.919V52.5c0-7.308 5.686-13.286 12.871-13.76a.921.921 0 0 0 .921-.922v-3.686a.92.92 0 0 0-.905-.918zM184.992 59.855h-4.268a.916.916 0 0 0-.729.361c-2.479 3.664-6.671 6.074-11.427 6.074-7.618 0-13.792-6.175-13.792-13.791 0-7.617 6.174-13.792 13.792-13.792 4.756 0 8.948 2.412 11.427 6.075a.917.917 0 0 0 .729.361h4.268a.92.92 0 0 0 .921-.919.898.898 0 0 0-.102-.413c-3.179-6.299-9.705-10.621-17.242-10.621-10.664 0-19.309 8.645-19.309 19.309 0 10.663 8.645 19.309 19.309 19.309 7.537 0 14.063-4.322 17.242-10.621a.914.914 0 0 0 .102-.413.92.92 0 0 0-.921-.919zM196.025 22.158h-3.678a.92.92 0 0 0-.919.919v46.892c0 .508.411.919.919.919h3.678a.92.92 0 0 0 .92-.919V23.077a.92.92 0 0 0-.92-.919zM221.771 33.191c-10.664 0-19.309 8.645-19.309 19.309 0 10.663 8.645 19.309 19.309 19.309 7.538 0 14.062-4.322 17.242-10.621a.913.913 0 0 0-.819-1.332h-4.267a.913.913 0 0 0-.741.379c-2.48 3.653-6.666 6.057-11.415 6.057-6.993 0-12.767-5.206-13.667-11.952h32.031a.92.92 0 0 0 .917-.873c.016-.32.026-.643.026-.966 0-10.665-8.644-19.31-19.307-19.31zm-13.292 15.631c1.61-5.83 6.949-10.114 13.292-10.114s11.681 4.284 13.292 10.114h-26.584zM294.483 21.239a5.517 5.517 0 1 0 0 11.034 5.517 5.517 0 0 0 0-11.034zm4.598 12.871v35.858a.92.92 0 0 1-.919.919h-7.356a.918.918 0 0 1-.919-.919V34.11h9.194zM265.902 71.809c9.014 0 16.576-6.176 18.706-14.524a.832.832 0 0 0 .023-.187.92.92 0 0 0-.919-.92h-7.782a.919.919 0 0 0-.834.537l-.002-.001c-1.599 3.48-5.11 5.899-9.192 5.899-5.584 0-10.113-4.527-10.113-10.113s4.529-10.113 10.113-10.113a10.11 10.11 0 0 1 9.192 5.899l.002-.002a.92.92 0 0 0 .834.538h7.782a.92.92 0 0 0 .919-.92.944.944 0 0 0-.022-.184c-2.128-8.35-9.693-14.527-18.707-14.527-10.661 0-19.308 8.646-19.308 19.309.001 10.664 8.647 19.309 19.308 19.309z"></path></svg><style data-emotion-css="1hbtu16">.css-1hbtu16{color:#161616;font-size:1.5rem;font-weight:300;-webkit-letter-spacing:0.01em;-moz-letter-spacing:0.01em;-ms-letter-spacing:0.01em;letter-spacing:0.01em;line-height:1.50;margin-left:0.5rem;text-align:center;-webkit-text-decoration:none;text-decoration:none;}@media (max-width:768px){.css-1hbtu16{display:inline;}}</style><div color="#161616" class="css-1hbtu16">Docs</div></a><style data-emotion-css="1val13a">.css-1val13a{margin-left:-1rem;margin-right:-1rem;padding:0 1rem 0 1rem;}</style><div class="css-1val13a"><style data-emotion-css="6kxz8c">.css-6kxz8c{font-size:1.5rem;line-height:1.5rem;padding-top:0.5rem;}</style><div class="css-6kxz8c"><style data-emotion-css="1y68cb7">.css-1y68cb7{margin-left:20px;}.css-1y68cb7 a{color:#343434;}</style><span class="css-1y68cb7"><a href="https://circleci.com/blog/feed.xml" target="_blank" rel="noopener noreferrer" data-testid="footer-media-0" class="css-x7gnkn"><style data-emotion-css="6ahvz3">.css-6ahvz3{width:25px;height:auto;}</style><svg aria-labelledby="svg-inline--fa-title-4HeZ4kjNgZmM" data-prefix="fas" data-icon="rss" class="svg-inline--fa fa-rss css-6ahvz3" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" aria-hidden="true"><title id="svg-inline--fa-title-4HeZ4kjNgZmM">CircleCI RSS feed</title><path fill="currentColor" d="M25.57 176.1C12.41 175.4 .9117 185.2 .0523 198.4s9.173 24.65 22.39 25.5c120.1 7.875 225.7 112.7 233.6 233.6C256.9 470.3 267.4 480 279.1 480c.5313 0 1.062-.0313 1.594-.0625c13.22-.8438 23.25-12.28 22.39-25.5C294.6 310.3 169.7 185.4 25.57 176.1zM32 32C14.33 32 0 46.31 0 64s14.33 32 32 32c194.1 0 352 157.9 352 352c0 17.69 14.33 32 32 32s32-14.31 32-32C448 218.6 261.4 32 32 32zM63.1 351.9C28.63 351.9 0 380.6 0 416s28.63 64 63.1 64s64.08-28.62 64.08-64S99.37 351.9 63.1 351.9z"></path></svg></a></span><span class="css-1y68cb7"><a href="https://www.facebook.com/circleci" target="_blank" rel="noopener noreferrer" data-testid="footer-media-1" class="css-x7gnkn"><svg aria-labelledby="svg-inline--fa-title-QT3CTz9OKHdM" data-prefix="fab" data-icon="facebook-square" class="svg-inline--fa fa-facebook-square css-6ahvz3" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" aria-hidden="true"><title id="svg-inline--fa-title-QT3CTz9OKHdM">CircleCI Facebook</title><path fill="currentColor" d="M400 32H48A48 48 0 0 0 0 80v352a48 48 0 0 0 48 48h137.3V327.7h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.27c-30.81 0-40.42 19.12-40.42 38.73V256h68.78l-11 71.69h-57.78V480H400a48 48 0 0 0 48-48V80a48 48 0 0 0 -48-48z"></path></svg></a></span><span class="css-1y68cb7"><a href="https://twitter.com/circleci" target="_blank" rel="noopener noreferrer" data-testid="footer-media-2" class="css-x7gnkn"><svg aria-labelledby="svg-inline--fa-title-EU8W2NsT9ggn" data-prefix="fab" data-icon="twitter" class="svg-inline--fa fa-twitter css-6ahvz3" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" aria-hidden="true"><title id="svg-inline--fa-title-EU8W2NsT9ggn">CircleCI Twitter</title><path fill="currentColor" d="M459.4 151.7c.325 4.548 .325 9.097 .325 13.65 0 138.7-105.6 298.6-298.6 298.6-59.45 0-114.7-17.22-161.1-47.11 8.447 .974 16.57 1.299 25.34 1.299 49.06 0 94.21-16.57 130.3-44.83-46.13-.975-84.79-31.19-98.11-72.77 6.498 .974 12.99 1.624 19.82 1.624 9.421 0 18.84-1.3 27.61-3.573-48.08-9.747-84.14-51.98-84.14-102.1v-1.299c13.97 7.797 30.21 12.67 47.43 13.32-28.26-18.84-46.78-51.01-46.78-87.39 0-19.49 5.197-37.36 14.29-52.95 51.65 63.67 129.3 105.3 216.4 109.8-1.624-7.797-2.599-15.92-2.599-24.04 0-57.83 46.78-104.9 104.9-104.9 30.21 0 57.5 12.67 76.67 33.14 23.72-4.548 46.46-13.32 66.6-25.34-7.798 24.37-24.37 44.83-46.13 57.83 21.12-2.273 41.58-8.122 60.43-16.24-14.29 20.79-32.16 39.31-52.63 54.25z"></path></svg></a></span><span class="css-1y68cb7"><a href="https://github.com/circleci" target="_blank" rel="noopener noreferrer" data-testid="footer-media-3" class="css-x7gnkn"><svg aria-labelledby="svg-inline--fa-title-j9CrXlgGzBEw" data-prefix="fab" data-icon="github" class="svg-inline--fa fa-github css-6ahvz3" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512" aria-hidden="true"><title id="svg-inline--fa-title-j9CrXlgGzBEw">CircleCI GitHub</title><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.9zM244.8 8C106.1 8 0 113.3 0 252c0 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.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.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.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg></a></span><span class="css-1y68cb7"><a href="https://twitch.tv/circleci" target="_blank" rel="noopener noreferrer" data-testid="footer-media-4" class="css-x7gnkn"><svg aria-labelledby="svg-inline--fa-title-WjvRhDrHGLiG" data-prefix="fab" data-icon="twitch" class="svg-inline--fa fa-twitch css-6ahvz3" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" aria-hidden="true"><title id="svg-inline--fa-title-WjvRhDrHGLiG">CircleCI Twitch</title><path fill="currentColor" d="M391.2 103.5H352.5v109.7h38.63zM285 103H246.4V212.8H285zM120.8 0 24.31 91.42V420.6H140.1V512l96.53-91.42h77.25L487.7 256V0zM449.1 237.8l-77.22 73.12H294.6l-67.6 64v-64H140.1V36.58H449.1z"></path></svg></a></span><span class="css-1y68cb7"><a href="https://www.linkedin.com/company/circleci" target="_blank" rel="noopener noreferrer" data-testid="footer-media-5" class="css-x7gnkn"><svg aria-labelledby="svg-inline--fa-title-lwg0ZWdOUqrE" data-prefix="fab" data-icon="linkedin-in" class="svg-inline--fa fa-linkedin-in css-6ahvz3" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" aria-hidden="true"><title id="svg-inline--fa-title-lwg0ZWdOUqrE">CircleCI LinkedIn</title><path fill="currentColor" d="M100.3 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.6 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.3 61.9 111.3 142.3V448z"></path></svg></a></span></div></div></div><div class="css-mrk95c"><style data-emotion-css="181qfh3">@media (max-width:1200px){.css-181qfh3{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:center;}}</style><nav class="css-181qfh3"><style data-emotion-css="t24vho">.css-t24vho{margin:0 -0.75rem;padding:0;list-style:none;}@media (min-width:768px){.css-t24vho{margin-right:0;}}.css-t24vho li{display:inline-block;margin:0 0.75rem 0.25rem;}</style><ul class="css-t24vho"><li><style data-emotion-css="1eiuvq9">.css-1eiuvq9 a{color:#343434;font-weight:500;}</style><span class="css-1eiuvq9"><a href="https://circleci.com/terms-of-service/" target="_blank" rel="noopener noreferrer" data-testid="footer-policy-0" class="css-x7gnkn">Terms of Use</a></span></li><li><span class="css-1eiuvq9"><a href="https://circleci.com/legal/privacy/" target="_blank" rel="noopener noreferrer" data-testid="footer-policy-1" class="css-x7gnkn">Privacy Policy</a></span></li><li><span class="css-1eiuvq9"><a href="https://circleci.com/legal/cookie-policy/" target="_blank" rel="noopener noreferrer" data-testid="footer-policy-2" class="css-x7gnkn">Cookie Policy</a></span></li><li><span class="css-1eiuvq9"><a href="https://circleci.com/security/" target="_blank" rel="noopener noreferrer" data-testid="footer-policy-3" class="css-x7gnkn">Security</a></span></li></ul></nav><style data-emotion-css="1ra2zmg">.css-1ra2zmg{margin-bottom:0.25rem;color:#6A6A6A;}@media (max-width:1200px){.css-1ra2zmg{margin-top:1rem;text-align:center;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}</style><div data-testid="current-year" class="css-1ra2zmg">© 2024 Circle Internet Services, Inc., All Rights Reserved.</div></div></div></footer></main></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"error":null,"content":"\u003cdiv id=\"preamble\"\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eWorkflows in CircleCI are used to orchestrate jobs. Workflows have options to control run order, scheduling, and access to resources. This page explains how to configure workflows to suit your project. Optimizing your workflows can increase the speed of your software development through faster feedback, shorter reruns, and more efficient use of resources.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eA \u003cstrong\u003eworkflow\u003c/strong\u003e is a set of rules for defining a collection of jobs and their run order. Create workflows to orchestrate your jobs using the options described on this page.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eWith workflows, you can:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eRun and troubleshoot jobs independently with real-time status feedback.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eSchedule workflows for jobs that should only run periodically.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eFan-out to run multiple jobs concurrently for efficient version testing.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eFan-in to deploy to multiple platforms.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eCatch failures in real-time and rerun only failed jobs.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"workflows-configuration-examples\"\u003eWorkflows configuration examples\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"admonitionblock tip\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-tip\" title=\"Tip\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e For a full specification of the \u003ccode\u003eworkflows\u003c/code\u003e key, see the \u003ca href=\"../configuration-reference/#workflows\"\u003eWorkflows\u003c/a\u003e section of the configuration reference. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"concurrent-job-execution\"\u003eConcurrent job execution\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe example in this section shows the default workflow orchestration model of concurrent jobs. Concurrent jobs are defined as follows:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eUse the \u003ccode\u003eworkflows\u003c/code\u003e key.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eName the workflow, in this case, \u003ccode\u003ebuild_and_test\u003c/code\u003e.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eNest the \u003ccode\u003ejobs\u003c/code\u003e key with a list of job names that are defined in the configuration file. In this example the jobs have no dependencies defined, so they run concurrently.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e \u003cstrong\u003eUsing Docker?\u003c/strong\u003e Authenticating Docker pulls from image registries is recommended when using the Docker execution environment. Authenticated pulls allow access to private Docker images, and may also grant higher rate limits, depending on your registry provider. For further information see \u003ca href=\"/docs/private-images\"\u003eUsing Docker authenticated pulls\u003c/a\u003e. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003ejobs:\n build:\n docker:\n - image: cimg/base:2023.06\n steps:\n - checkout\n - run: \u0026lt;command\u0026gt;\n test:\n docker:\n - image: cimg/base:2023.06\n steps:\n - checkout\n - run: \u0026lt;command\u0026gt;\nworkflows:\n build_and_test:\n jobs:\n - build\n - test\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eSee the \u003ca href=\"https://github.com/CircleCI-Public/circleci-demo-workflows/blob/parallel-jobs/.circleci/config.yml\"\u003eSample concurrent workflow config\u003c/a\u003e for a full example.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eWhen using workflows, note the following best practices:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eMove the quickest jobs up to the start of your workflow. For example, lint or syntax checking should happen before longer-running, more computationally expensive jobs.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eUsing a \"setup\" job at the \u003cem\u003estart\u003c/em\u003e of a workflow can be helpful to do some preflight checks and populate a workspace for all the following jobs.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock tip\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-tip\" title=\"Tip\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e Refer to the \u003ca href=\"../optimizations/\"\u003eOptimization reference\u003c/a\u003e for tips to improve your configuration. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"sequential-job-execution\"\u003eSequential job execution\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis example shows a workflow with four sequential jobs. Each job waits to start until the \"required\" job finishes successfully, as illustrated in the following diagram:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/sequential_workflow.png\" alt=\"Sequential Job Execution Workflow\"\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis configuration snippet is an example of a workflow configured for sequential jobs:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n build-test-and-deploy:\n jobs:\n - build\n - test1:\n requires:\n - build\n - test2:\n requires:\n - test1\n - deploy:\n requires:\n - test2\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eDefine job dependencies using the \u003ccode\u003erequires\u003c/code\u003e key. A job must wait until all upstream jobs in the dependency graph have run. In this example, the \u003ccode\u003edeploy\u003c/code\u003e job runs when the \u003ccode\u003ebuild\u003c/code\u003e, \u003ccode\u003etest1\u003c/code\u003e and \u003ccode\u003etest2\u003c/code\u003e jobs complete successfully:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003edeploy\u003c/code\u003e job waits for the \u003ccode\u003etest2\u003c/code\u003e job\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003etest2\u003c/code\u003e job waits for the \u003ccode\u003etest1\u003c/code\u003e job\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003etest1\u003c/code\u003e job waits for the \u003ccode\u003ebuild\u003c/code\u003e job\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eSee the \u003ca href=\"https://github.com/CircleCI-Public/circleci-demo-workflows/blob/sequential-branch-filter/.circleci/config.yml\"\u003eSample Sequential Workflow config\u003c/a\u003e for a full example.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"fan-outfan-in-workflow\"\u003eFan-out/fan-in workflow\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis example workflow has a fan-out/fan-in structure, as follows:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eA common build job is run.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe workflow fans-out to run a set of acceptance test jobs concurrently.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe workflow fans-in to run a common deploy job.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/fan-out-in.png\" alt=\"Fan-out and Fan-in Workflow\"\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis configuration snippet is an example of a workflow configured for fan-out/fan-in job execution:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n build_accept_deploy:\n jobs:\n - build\n - acceptance_test_1:\n requires:\n - build\n - acceptance_test_2:\n requires:\n - build\n - acceptance_test_3:\n requires:\n - build\n - acceptance_test_4:\n requires:\n - build\n - deploy:\n requires:\n - acceptance_test_1\n - acceptance_test_2\n - acceptance_test_3\n - acceptance_test_4\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn this example, as soon as the \u003ccode\u003ebuild\u003c/code\u003e job finishes successfully, all four acceptance test jobs start. The \u003ccode\u003edeploy\u003c/code\u003e job waits for all four acceptance test jobs to succeed before it starts.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eSee the \u003ca href=\"https://github.com/CircleCI-Public/circleci-demo-workflows/tree/fan-in-fan-out\"\u003eSample Fan-in/Fan-out Workflow config\u003c/a\u003e for a full example.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"holding-a-workflow-for-a-manual-approval\"\u003eHold a workflow for a manual approval\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eUse an \u003ccode\u003eapproval\u003c/code\u003e job to configure a workflow to wait for manual approval before continuing. Anyone who has push access to the repository can approve the job to continue the workflow or cancel to end the workflow. Approve or Cancel either by using the buttons in the CircleCI web app, or via the API.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eSome things to keep in mind when using manual approval in a workflow:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003e\u003ccode\u003eapproval\u003c/code\u003e is a special job type that is configured when listing jobs under the \u003ccode\u003eworkflows\u003c/code\u003e key. You do not need to define an \u003ccode\u003eapproval\u003c/code\u003e type job in the \u003ccode\u003ejobs\u003c/code\u003e section of your configuration. If you do configure steps for a job that is given the \u003ccode\u003eapproval\u003c/code\u003e type in the workflows section, the steps for that job will not be run. An \u003ccode\u003eapproval\u003c/code\u003e job is \u003cem\u003eonly\u003c/em\u003e used to \u003cem\u003ehold\u003c/em\u003e the workflow for approval, not to run any work.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003eapproval\u003c/code\u003e job name must be unique and not used by any other job in your configuration.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe name of the approval job is arbitrary. For example, an approval job can be named \u003ccode\u003ehold\u003c/code\u003e, \u003ccode\u003ewait\u003c/code\u003e, \u003ccode\u003epause\u003c/code\u003e, etc.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eAll jobs that run \u003cem\u003eafter\u003c/em\u003e a manual approval job \u003cstrong\u003emust\u003c/strong\u003e \u003ccode\u003erequire\u003c/code\u003e the name of the \u003ccode\u003eapproval\u003c/code\u003e job.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eJobs run in the order defined in the workflow.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eWhen the workflow encounters a job with \u003ccode\u003etype: approval\u003c/code\u003e, the workflow pauses until action is taken to approve or cancel.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eIf approval is granted the workflow continues to process jobs in the order defined in the configuration file.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eIf cancel is granted the downstream jobs are not run.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eJobs downstream of an \u003ccode\u003eapproval\u003c/code\u003e job can be restricted by adding a \u003ca href=\"../contexts/#approve-jobs-that-use-restricted-contexts\"\u003erestricted context\u003c/a\u003e to those downstream jobs.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe following screenshot demonstrates:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eA workflow that needs approval.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe approval popup.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe workflow graph after approval.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/approval-workflow-map.png\" alt=\"A three section image showing workflow graph with \u0026quot;Needs approval\u0026quot; job\" width=\"the approval popup\" height=\"and the workflow graph\"\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eBy clicking on the \u003ccode\u003eapproval\u003c/code\u003e job\u0026#8217;s name (\u003ccode\u003ehold\u003c/code\u003e, in the screenshot above), an approval dialog box appears. You can approve, cancel, or close the popup without approving.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"configure-an-approval-job\"\u003eConfigure an approval job\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eTo set up a manual approval workflow, add a job to the \u003ccode\u003ejobs\u003c/code\u003e list in your workflow with \u003ccode\u003etype: approval\u003c/code\u003e. For example:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e# ...\n# \u0026lt;\u0026lt; your config for the build, test1, test2, and deploy jobs \u0026gt;\u0026gt;\n# ...\n\nworkflows:\n build-test-and-approval-deploy:\n jobs:\n - build # your custom job from your config, that builds your code\n - test1: # your custom job; runs test suite 1\n requires: # test1 will not run until the `build` job is completed.\n - build\n - test2: # another custom job; runs test suite 2,\n requires: # test2 is dependent on the success of job `test1`\n - test1\n - hold: # \u0026lt;\u0026lt;\u0026lt; A job that will require manual approval in the CircleCI web application.\n type: approval # This key-value pair will set your workflow to a status of \"Needs Approval\"\n requires: # We only run the \"hold\" job when test2 has succeeded\n - test2\n # On approval of the `hold` job, any successive job that requires the `hold` job will run.\n # In this case, a user is manually triggering the deploy job.\n - deploy:\n requires:\n - hold\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn this example, the \u003ccode\u003edeploy\u003c/code\u003e job will not run until the \u003ccode\u003ehold\u003c/code\u003e job is approved.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"approve-a-job\"\u003eApprove a job\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eTo approve a job follow these steps:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"openblock tab approve CircleCI_web_app\"\u003e \u003cdiv class=\"content\"\u003e \u003cdiv class=\"olist arabic\"\u003e \u003col class=\"arabic\"\u003e \u003cli\u003e \u003cp\u003eSelect the \u003ccode\u003ehold\u003c/code\u003e job in the \u003cstrong\u003eWorkflows\u003c/strong\u003e page of the CircleCI web app.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eSelect \u003cb class=\"button\"\u003eApprove\u003c/b\u003e.\u003c/p\u003e \u003c/li\u003e \u003c/ol\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"openblock tab approve API\"\u003e \u003cdiv class=\"content\"\u003e \u003cdiv class=\"olist arabic\"\u003e \u003col class=\"arabic\"\u003e \u003cli\u003e \u003cp\u003eSet up your API authentication. Steps are available in the \u003ca href=\"../api-developers-guide/#add-an-api-token\"\u003eAPI developers guide\u003c/a\u003e.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eYou need your workflow ID and the \u003ccode\u003eapproval_request_id\u003c/code\u003e (which is the job ID for the job requiring approval) to make the API POST request. Depending on your use case, you might be configuring an approval job in a pipeline, or using an external service to approve a job. You can get the required parameters using \u003ca href=\"../variables/\"\u003epipeline values or environment variables\u003c/a\u003e, or by \u003ca href=\"../webhooks/\"\u003ereceiving webhooks\u003c/a\u003e or polling the API. To approve a job, use the \u003ca href=\"https://circleci.com/docs/api/v2/index.html#operation/approvePendingApprovalJobById\"\u003eapprove a job\u003c/a\u003e endpoint, for example:\u003c/p\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003ecurl --request POST \\\n --url https://circleci.com/api/v2/workflow/\u0026lt;workflow-ID\u0026gt;/approve/\u0026lt;approval_request_id\u0026gt; \\\n --header \"Circle-Token: ${CIRCLE_TOKEN}\" \\\n --header 'content-type: application/json' \\\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003c/li\u003e \u003c/ol\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"cancel-a-job\"\u003eCancel a job\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eTo Cancel a job follow these steps:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"openblock tab cancel CircleCI_web_app\"\u003e \u003cdiv class=\"content\"\u003e \u003cdiv class=\"olist arabic\"\u003e \u003col class=\"arabic\"\u003e \u003cli\u003e \u003cp\u003eSelect the \u003ccode\u003ehold\u003c/code\u003e job in the \u003cstrong\u003eWorkflows\u003c/strong\u003e page of the CircleCI web app.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eSelect \u003cb class=\"button\"\u003eCancel\u003c/b\u003e.\u003c/p\u003e \u003c/li\u003e \u003c/ol\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"openblock tab cancel API\"\u003e \u003cdiv class=\"content\"\u003e \u003cdiv class=\"olist arabic\"\u003e \u003col class=\"arabic\"\u003e \u003cli\u003e \u003cp\u003eSet up your API authentication. Steps are available in the \u003ca href=\"../api-developers-guide/#add-an-api-token\"\u003eAPI developers guide\u003c/a\u003e.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eYou need your job ID (which is the job ID for the job requiring approval) to make the API POST request. Depending on your use case, you might be configuring an approval job in a pipeline, or using an external service to approve a job. You can get the required parameters using \u003ca href=\"../variables/\"\u003epipeline values or environment variables\u003c/a\u003e, or by \u003ca href=\"../webhooks/\"\u003ereceiving webhooks\u003c/a\u003e or polling the API. To cancel a job, use the \u003ca href=\"https://circleci.com/docs/api/v2/index.html#operation/cancelJobByJobID\"\u003ecancel a job\u003c/a\u003e endpoint, for example:\u003c/p\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003ecurl --request POST \\\n --url https://circleci.com/api/v2/jobs/\u0026lt;job-ID\u0026gt;/cancel \\\n --header \"Circle-Token: ${CIRCLE_TOKEN}\" \\\n --header 'content-type: application/json' \\\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003c/li\u003e \u003c/ol\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn this example, the purpose of the \u003ccode\u003ehold\u003c/code\u003e job is to wait for approval to begin deployment. A job can be approved for up to 90 days after it starts.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"scheduling-a-workflow\"\u003eScheduling a workflow\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e Scheduled workflows are not available for projects integrated through the GitHub App, GitLab or Bitbucket Data Center. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e \u003cstrong\u003eThe deprecation of the scheduled workflows feature is postponed\u003c/strong\u003e. Since the deprecation announcement went live, your feedback and feature requests have been monitored and it is clear there is more work for us to do to improve the existing scheduled pipelines experience, and also make migration easier for all. Updates on a new deprecation timeline will be announced here and on \u003ca href=\"https://discuss.circleci.com/\"\u003eCircleCI Discuss\u003c/a\u003e. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock caution\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-caution\" title=\"Caution\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e The scheduled workflows feature does not support \u003ca href=\"../dynamic-config/\"\u003eDynamic configuration\u003c/a\u003e. If you use dynamic configuration you will need to use \u003ca href=\"../scheduled-pipelines/\"\u003eScheduled pipelines\u003c/a\u003e for scheduling. More information can be found in this \u003ca href=\"https://support.circleci.com/hc/en-us/articles/360060833331-Support-for-Scheduled-Workflows-in-Dynamic-Configurations-Setup-Workflows\"\u003esupport article\u003c/a\u003e. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eBy default, a workflow runs on every \u003ccode\u003egit push\u003c/code\u003e. To trigger a workflow on a schedule, add the \u003ccode\u003etriggers\u003c/code\u003e key to the workflow and specify a \u003ccode\u003eschedule\u003c/code\u003e. Scheduled workflows use the \u003ccode\u003ecron\u003c/code\u003e syntax to represent Coordinated Universal Time (UTC).\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eRunning a workflow for every commit for every branch can be inefficient and expensive. Scheduling a workflow is an alternative to building on every commit. You can \u003cem\u003eschedule\u003c/em\u003e a workflow to run at a certain time for a specific branch or branches. Consider scheduling workflows that are resource-intensive or that generate reports on a schedule rather than on every commit.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock caution\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-caution\" title=\"Caution\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e A scheduled workflow will run on a schedule only. A scheduled workflow will \u003cstrong\u003enot\u003c/strong\u003e be run on commits to your code. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIf you do not configure any workflows in your \u003ccode\u003e.circleci/config.yml\u003c/code\u003e, an implicit workflow is used. If you configure a scheduled workflow the implicit workflow is no longer run. If you want to build on every commit you must add your workflow to your configuration file.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e When you schedule a workflow, the workflow will be counted as an individual user seat. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"nightly-example\"\u003eBuild every night\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn the example below, the \u003ccode\u003enightly\u003c/code\u003e workflow is configured to run every day at 12:00am UTC. The \u003ccode\u003ecron\u003c/code\u003e key is specified using POSIX \u003ccode\u003ecrontab\u003c/code\u003e syntax. See the \u003ca href=\"https://www.unix.com/man-page/POSIX/1posix/crontab/\"\u003ecrontab man page\u003c/a\u003e for \u003ccode\u003ecron\u003c/code\u003e syntax basics. The workflow runs on the \u003ccode\u003emain\u003c/code\u003e and \u003ccode\u003ebeta\u003c/code\u003e branches.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e Scheduled workflows may be delayed by up to 15 minutes. This delay is to maintain reliability during busy times, such as 12:00am UTC. Do not assume that scheduled workflows start with to-the-minute accuracy. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n commit:\n jobs:\n - test\n - deploy\n nightly:\n triggers:\n - schedule:\n cron: \"0 0 * * *\"\n filters:\n branches:\n only:\n - main\n - /^release\\/.*/\n jobs:\n - coverage\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn the above example:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003ecommit\u003c/code\u003e workflow has no \u003ccode\u003etriggers\u003c/code\u003e key and runs on every \u003ccode\u003egit push\u003c/code\u003e.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003enightly\u003c/code\u003e workflow has a \u003ccode\u003etriggers\u003c/code\u003e key and runs on the specified \u003ccode\u003eschedule\u003c/code\u003e, which is daily, and only runs on the \u003ccode\u003emain\u003c/code\u003e branch, as well as any branch that starts \u003ccode\u003erelease/\u003c/code\u003e.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"specifying-a-valid-schedule\"\u003eSpecifying a valid schedule\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eA valid \u003ccode\u003eschedule\u003c/code\u003e requires:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eA \u003ccode\u003ecron\u003c/code\u003e key\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eA \u003ccode\u003efilters\u003c/code\u003e key\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003ebranches\u003c/code\u003e filter must be present\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe value of the \u003ccode\u003ecron\u003c/code\u003e key must be a \u003ca href=\"https://crontab.guru/\"\u003evalid crontab entry\u003c/a\u003e.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe following are \u003cstrong\u003enot\u003c/strong\u003e supported:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eCron step syntax (for example, \u003ccode\u003e*/1\u003c/code\u003e, \u003ccode\u003e*/20\u003c/code\u003e).\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eRange elements within comma-separated lists of elements.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eRange elements for days (for example, \u003ccode\u003eTue-Sat\u003c/code\u003e).\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eUse comma-separated digits instead.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eExample \u003cstrong\u003einvalid\u003c/strong\u003e cron range syntax:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e triggers:\n - schedule:\n cron: \"5 4 * * 1,3-5,6\" # \u0026lt; the range separator with `-` is invalid\n filters:\n branches:\n only:\n - main\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eExample \u003cstrong\u003evalid\u003c/strong\u003e cron range syntax:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e triggers:\n - schedule:\n cron: \"5 4 * * 1,3,4,5,6\"\n filters:\n branches:\n only:\n - main\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe value of the \u003ccode\u003efilters\u003c/code\u003e key must be a map that defines rules for execution on specific branches.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor more details, see the \u003ccode\u003ebranches\u003c/code\u003e section of the \u003ca href=\"../configuration-reference/#schedule-branches\"\u003eCircleCI configuration reference\u003c/a\u003e.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor a full configuration example, see the \u003ca href=\"https://github.com/CircleCI-Public/circleci-demo-workflows/blob/try-schedule-workflow/.circleci/config.yml\"\u003eSample Scheduled Workflows configuration\u003c/a\u003e.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"using-job-contexts-to-share-environment-variables\"\u003eUsing contexts to share and secure environment variables\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn a workflow, you can use a context to securely provide environment variables to specific jobs. Contexts allow you to define environment variables at the organization level and control access to them through security restrictions. Using contexts, sensitive data like API keys or credentials are securely shared with only the jobs that require them. Sensitive data in contexts will not be exposed in your config file.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe following example shows a workflow with four sequential jobs that each use a context to access environment variables. See the \u003ca href=\"../contexts/\"\u003eContexts\u003c/a\u003e page for detailed instructions on this setting in the application.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe following \u003ccode\u003econfig.yml\u003c/code\u003e snippet is an example of a sequential job workflow configured to use the environment variables defined in the \u003ccode\u003eorg-global\u003c/code\u003e context:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n build-test-and-deploy:\n jobs:\n - build\n - test1:\n requires:\n - build\n context: org-global\n - test2:\n requires:\n - test1\n context: org-global\n - deploy:\n requires:\n - test2\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe \u003ccode\u003etest1\u003c/code\u003e and \u003ccode\u003etest2\u003c/code\u003e jobs have access to environment variables stored in the \u003ccode\u003eorg-global\u003c/code\u003e context if the pipeline meets the restrictions set for the context, for example:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eWas the pipeline triggered by a user who \u003ca href=\"../contexts/#security-goup-restrictions\"\u003ehas access\u003c/a\u003e (is in the relevant org/security group etc.)?\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eDoes the \u003ca href=\"../contexts/#project-restrictions\"\u003eproject have access\u003c/a\u003e to the context? By default all projects in an organization have access to contexts set for that organization, but restrictions on project access can be configured.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eDoes the pipeline meet the requirements of any \u003ca href=\"../contexts/#expression-restrictions\"\u003eexpression restrictions\u003c/a\u003e set up for the context?\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"use-conditional-logic-in-workflows\"\u003eUse conditional logic in workflows\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eYou may use a \u003ccode\u003ewhen\u003c/code\u003e clause (the inverse clause \u003ccode\u003eunless\u003c/code\u003e is also supported) under a workflow declaration with a \u003ca href=\"../configuration-reference/#logic-statements\"\u003elogic statement\u003c/a\u003e to determine whether or not to run that workflow.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eWorkflows are always run unless there is a \u003ccode\u003ewhen\u003c/code\u003e or \u003ccode\u003eunless\u003c/code\u003e filter that prevents the workflow from being run. If you want a workflow to run in \u003cstrong\u003eevery\u003c/strong\u003e pipeline, do \u003cstrong\u003enot\u003c/strong\u003e add a when or unless filter.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe example configuration below uses a pipeline parameter, \u003ccode\u003erun_integration_tests\u003c/code\u003e to drive the \u003ccode\u003eintegration_tests\u003c/code\u003e workflow.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eversion: 2.1\n\nparameters:\n run_integration_tests:\n type: boolean\n default: false\n\nworkflows:\n integration_tests:\n when: \u0026lt;\u0026lt; pipeline.parameters.run_integration_tests \u0026gt;\u0026gt;\n jobs:\n - mytestjob\n\njobs:\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis example prevents the workflow \u003ccode\u003eintegration_tests\u003c/code\u003e from running unless the \u003ccode\u003erun_integration_tests\u003c/code\u003e pipeline parameter is \u003ccode\u003etrue\u003c/code\u003e. For example, when the pipeline is triggered with the following in the \u003ccode\u003ePOST\u003c/code\u003e body:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e{\n \"parameters\": {\n \"run_integration_tests\": true\n }\n}\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"using-filters-in-your-workflows\"\u003eUsing filters in your workflows\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe following sections provide examples for using filters in your workflows to manage job execution.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eYou can filter workflows by branch, git tag, or neither. Workflow filters for branches and tags have the keys \u003ccode\u003eonly\u003c/code\u003e and \u003ccode\u003eignore\u003c/code\u003e:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eAny branches/tags that match \u003ccode\u003eonly\u003c/code\u003e will run the job.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eAny branches/tags that match \u003ccode\u003eignore\u003c/code\u003e will not run the job.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eIf neither \u003ccode\u003eonly\u003c/code\u003e nor \u003ccode\u003eignore\u003c/code\u003e are specified then the job is skipped for all branches/tags.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eIf both \u003ccode\u003eonly\u003c/code\u003e and \u003ccode\u003eignore\u003c/code\u003e are specified the \u003ccode\u003eonly\u003c/code\u003e is considered before \u003ccode\u003eignore\u003c/code\u003e.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIf \u003cstrong\u003eboth branch and tag\u003c/strong\u003e filtering is configured and a push to your code includes both branch and tag information, the \u003cstrong\u003ebranch\u003c/strong\u003e filters take precedence. In this scenario, if there are no branch filters configured, tag \u003ccode\u003eignore\u003c/code\u003e filters are used, if they exist.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"branch-level-job-execution\"\u003eBranch-level job execution\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe following example has one workflow that is configured to run different sets of jobs for different branches:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003etest_dev\u003c/code\u003e job is run on the \u003ccode\u003edev\u003c/code\u003e branch and any branch that begins \u003ccode\u003euser-\u003c/code\u003e\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003etest_stage\u003c/code\u003e job is run on the \u003ccode\u003estage\u003c/code\u003e branch\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003etest_pre-prod\u003c/code\u003e job is run on any branch starting \u003ccode\u003epre-prod\u003c/code\u003e including any suffix added to the branch name using a hyphen.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e Workflows ignore \u003ccode\u003ebranches\u003c/code\u003e keys used in the \u003ccode\u003ejobs\u003c/code\u003e declaration. If you use the \u003ca href=\"../configuration-reference/#branches\"\u003edeprecated job-level branches key\u003c/a\u003e, replace them with workflow filters. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock tip\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-tip\" title=\"Tip\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e This example shows how to provide strings and lists of strings when configuring workflow filters. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n dev_stage_pre-prod:\n jobs:\n - test_dev:\n filters: # using regex filters requires the entire branch to match\n branches:\n only: # only branches matching the below regex filters will run\n - dev\n - /user-.*/\n - test_stage:\n filters:\n branches:\n only: stage\n - test_pre-prod:\n filters:\n branches:\n only: /pre-prod(?:-.+)?$/\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis setup can be illustrated as follows:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/branch_level.png\" alt=\"Branch-Level Job Execution\"\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor more information on regular expressions, see the \u003ca href=\"#using-regular-expressions-to-filter-tags-and-branches\"\u003eUsing Regular Expressions to Filter Tags And Branches\u003c/a\u003e section below.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor a full example of workflows, see the \u003ca href=\"https://github.com/CircleCI-Public/circleci-demo-workflows/blob/sequential-branch-filter/.circleci/config.yml\"\u003econfiguration file\u003c/a\u003e for the Sample Sequential Workflow With Branching project.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"executing-workflows-for-a-git-tag\"\u003eExecuting workflows for a git tag\u003c/h3\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e Webhook payloads are capped at 25 MB and for some events a maximum of 3 tags. If you push several tags at once, CircleCI may not receive them all. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eCircleCI does not run workflows for tags unless you explicitly specify tag filters using regular expressions. Both lightweight and annotated tags are supported.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIf you have configured a job to run on a git tag you must also specify tag filters for any dependent jobs. Use \u003ca href=\"#using-regular-expressions-to-filter-tags-and-branches\"\u003eregular expressions\u003c/a\u003e to specify tag filters for a job.\u003c/p\u003e \u003c/div\u003e \u003chr\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn the example below, two workflows are defined:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003e\u003ccode\u003euntagged-build\u003c/code\u003e runs the \u003ccode\u003ebuild\u003c/code\u003e job for all branches.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003e\u003ccode\u003etagged-build\u003c/code\u003e runs \u003ccode\u003ebuild\u003c/code\u003e for all branches \u003cstrong\u003eand\u003c/strong\u003e all tags starting with \u003ccode\u003ev\u003c/code\u003e.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n untagged-build:\n jobs:\n - build\n tagged-build:\n jobs:\n - build:\n filters:\n tags:\n only: /^v.*/\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003chr\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn the example below, two jobs are configured within the \u003ccode\u003ebuild-deploy\u003c/code\u003e workflow:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003ebuild\u003c/code\u003e job runs for all branches and all tags.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003edeploy\u003c/code\u003e job runs for all branches and only for tags starting with 'v'.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n build-deploy:\n jobs:\n - build:\n filters: # required since `deploy` has tag filters AND requires `build`\n tags:\n only: /.*/\n - deploy:\n requires:\n - build\n filters:\n tags:\n only: /^v.*/\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003chr\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn the example below, three jobs are configured for the \u003ccode\u003ebuild-test-deploy\u003c/code\u003e workflow:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003ebuild\u003c/code\u003e job runs for all branches and only tags starting with 'config-test'.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003etest\u003c/code\u003e job runs once the \u003ccode\u003ebuild\u003c/code\u003e job completes for all branches and only tags starting with 'config-test'.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003edeploy\u003c/code\u003e job runs once the \u003ccode\u003etest\u003c/code\u003e job completes for no branches and only tags starting with 'config-test'.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n build-test-deploy:\n jobs:\n - build:\n filters: # required since `test` has tag filters AND requires `build`\n tags:\n only: /^config-test.*/\n - test:\n requires:\n - build\n filters: # required since `deploy` has tag filters AND requires `test`\n tags:\n only: /^config-test.*/\n - deploy:\n requires:\n - test\n filters:\n tags:\n only: /^config-test.*/\n branches:\n ignore: /.*/\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003chr\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn the example below, two jobs are defined (\u003ccode\u003etest\u003c/code\u003e and \u003ccode\u003edeploy\u003c/code\u003e) and three workflows use those jobs:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003ebuild\u003c/code\u003e workflow runs for all branches except \u003ccode\u003emain\u003c/code\u003e and is not run on tags.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003estaging\u003c/code\u003e workflow will only run on the \u003ccode\u003emain\u003c/code\u003e branch and is not run on tags.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003eproduction\u003c/code\u003e workflow runs for no branches and only for tags starting with \u003ccode\u003ev.\u003c/code\u003e.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n build: # This workflow will run on all branches except 'main' and will not run on tags\n jobs:\n - test:\n filters:\n branches:\n ignore: main\n staging: # This workflow will only run on 'main' and will not run on tags\n jobs:\n - test:\n filters: \u0026amp;filters-staging # this yaml anchor is setting these values to \"filters-staging\"\n branches:\n only: main\n - deploy:\n requires:\n - test\n filters:\n \u0026lt;\u0026lt;: *filters-staging # this is calling the previously set yaml anchor\n production: # This workflow will only run on tags (specifically starting with 'v.') and will not run on branches\n jobs:\n - test:\n filters: \u0026amp;filters-production # this yaml anchor is setting these values to \"filters-production\"\n branches:\n ignore: /.*/\n tags:\n only: /^v.*/\n - deploy:\n requires:\n - test\n filters:\n \u0026lt;\u0026lt;: *filters-production # this is calling the previously set yaml anchor\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"using-regular-expressions-to-filter-tags-and-branches\"\u003eUsing regular expressions to filter tags and branches\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eCircleCI branch and tag filters support the Java variant of regex pattern matching. When writing filters, CircleCI matches exact regular expressions.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor example, \u003ccode\u003eonly: /^config-test/\u003c/code\u003e only matches the \u003ccode\u003econfig-test\u003c/code\u003e tag. To match all tags starting with \u003ccode\u003econfig-test\u003c/code\u003e, use \u003ccode\u003eonly: /^config-test.*/\u003c/code\u003e instead.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eUsing tags for semantic versioning is a common use case. To match patch versions 3-7 of a 2.1 release, you can write \u003ccode\u003e/^version-2\\.1\\.[3-7]/\u003c/code\u003e.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor full details on pattern-matching rules, see the \u003ca href=\"https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html\"\u003e\u003ccode\u003ejava.util.regex\u003c/code\u003e documentation\u003c/a\u003e.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"using-workspaces-to-share-data-between-jobs\"\u003eUsing workspaces to share data between jobs\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eEach workflow has an associated \u003ca href=\"../configuration-reference/#persisttoworkspace\"\u003eworkspace\u003c/a\u003e for transferring files to downstream jobs as a workflow progresses.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eConfiguration options are available to:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003e\u003ca href=\"../configuration-reference/#persisttoworkspace\"\u003epersist files to the workspace\u003c/a\u003e\u003c/p\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e- persist_to_workspace:\n root: /tmp/workspace\n paths:\n - target/application.jar\n - build/*\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003e\u003ca href=\"../configuration-reference/#attachworkspace\"\u003eattach a workflow\u0026#8217;s workspace\u003c/a\u003e to a container.\u003c/p\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e- attach_workspace:\n at: /tmp/workspace\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor further information on workspaces and their configuration see the \u003ca href=\"../workspaces/\"\u003eUsing Workspaces to Share Data Between Jobs\u003c/a\u003e doc.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"rerunning-a-workflows-failed-jobs\"\u003eRerunning a workflow\u0026#8217;s failed jobs\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eWorkflows help to speed up your ability to respond to failures. One way to do this is to only rerun failed jobs rather than a whole workflow. To rerun only a workflow\u0026#8217;s \u003cem\u003efailed\u003c/em\u003e jobs, follow these steps:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"olist arabic\"\u003e \u003col class=\"arabic\"\u003e \u003cli\u003e \u003cp\u003eIn the \u003ca href=\"https://app.circleci.com/home/\"\u003eCircleCI web app\u003c/a\u003e select your organization.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eSelect \u003cstrong\u003ePipelines\u003c/strong\u003e in the sidebar.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eUse the filters to find your project and pipeline.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eFind the row in the pipeline view for the workflow you would like to rerun from failed and select the \u003cstrong\u003eRerun from failed\u003c/strong\u003e icon. This option is also available in the workflow view using the rerun dropdown menu, which you can access by clicking on the workflow name or badge.\u003c/p\u003e \u003c/li\u003e \u003c/ol\u003e \u003c/div\u003e \u003cdiv class=\"openblock tab rerun-screenshot Rerun_from_the_pipelines_page\"\u003e \u003cdiv class=\"content\"\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/orchestrate-and-trigger/rerun-from-failed-pipelines-page.png\" alt=\"Rerun a workflow from failed from the pipelines page\"\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"openblock tab rerun-screenshot Rerun_from_the_workflows_page\"\u003e \u003cdiv class=\"content\"\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/orchestrate-and-trigger/rerun-from-failed-workflows-page.png\" alt=\"Rerun a workflow from failed from the workflows page\"\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e If you rerun a workflow containing a job that was previously re-run with SSH, the new workflow runs with SSH enabled for that job, even after SSH capability is disabled at the project level. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"states\"\u003eWorkflow states\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eWorkflows may have one of the following states:\u003c/p\u003e \u003c/div\u003e \u003ctable class=\"tableblock frame-all grid-all stripes-even stretch table table-striped\"\u003e \u003ccolgroup\u003e \u003ccol style=\"width: 33.3333%;\"\u003e \u003ccol style=\"width: 33.3333%;\"\u003e \u003ccol style=\"width: 33.3334%;\"\u003e \u003c/colgroup\u003e \u003cthead\u003e \u003ctr\u003e \u003cth class=\"tableblock halign-left valign-top\"\u003eState\u003c/th\u003e \u003cth class=\"tableblock halign-left valign-top\"\u003eDescription\u003c/th\u003e \u003cth class=\"tableblock halign-left valign-top\"\u003eTerminal state\u003c/th\u003e \u003c/tr\u003e \u003c/thead\u003e \u003ctbody\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eRUNNING\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eWorkflow is in progress\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eNo\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eNOT RUN\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eWorkflow never started\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eYes\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eCANCELED\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eWorkflow canceled before it finished\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eYes\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eFAILING\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eA job in the workflow failed, but others are still running or yet to be approved\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eNo\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eFAILED\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eOne or more jobs in the workflow failed\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eYes\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eSUCCESS\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eAll jobs in the workflow completed successfully\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eYes\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eNEEDS APPROVAL (UI) / ON HOLD\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eA job in the workflow is waiting for approval\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eNo\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eERROR\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eWe experienced an internal error starting a job in the workflow\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eYes\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eUNAUTHORIZED\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eOne or more of the jobs terminated with a \u003ccode\u003eunauthorized\u003c/code\u003e job status. The user who triggered the pipeline or approved an approval job does not have access to a required restricted context.\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eYes\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003c/tbody\u003e \u003c/table\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e After 90 days non-terminal workflows are automatically by CircleCI. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"troubleshooting\"\u003eTroubleshooting\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis section describes common problems and solutions for workflows.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"workflow-and-subsequent-jobs-do-not-trigger\"\u003eWorkflow and subsequent jobs do not trigger\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIf you do not see your workflows running, check for configuration errors that may be preventing the workflow from starting. Navigate to your \u003ca href=\"https://app.circleci.com/pipelines/\"\u003eproject\u0026#8217;s pipelines\u003c/a\u003e and find your workflow name to locate the failure.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"rerunning-workflows-fails\"\u003eRerunning workflows fails\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFailures may happen before a workflow runs during pipeline processing. Re-running the in this case workflow will fail. Push a change to the project repository or use the trigger pipeline option to rerun the pipeline.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e You cannot rerun jobs and workflows that are \u0026gt;= 90 days. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"workflows-waiting-for-status-in-github\"\u003eWorkflows waiting for status in GitHub\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIf you have workflows configured on a protected branch and the status check never completes, check the \u003ccode\u003eci/circleci\u003c/code\u003e status key. \u003ccode\u003eci/circleci\u003c/code\u003e is related to a deprecated check and should be and deselected.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/github_branches_status.png\" alt=\"Uncheck GitHub Status Keys\"\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eGo to \u003cspan class=\"menuseq\"\u003e\u003cb class=\"menu\"\u003eSettings\u003c/b\u003e\u0026#160;\u003ci class=\"fa fa-angle-right caret\"\u003e\u003c/i\u003e \u003cb class=\"menuitem\"\u003eBranches\u003c/b\u003e\u003c/span\u003e in GitHub and select \u003cb class=\"button\"\u003eEdit\u003c/b\u003e on the protected branch to deselect the settings, for example: \u003ccode\u003ehttps://github.com/your-org/project/settings/branches\u003c/code\u003e.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"see-also\"\u003eSee also\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eSee the \u003ca href=\"../faq/#workflows\"\u003eworkflows\u003c/a\u003e section of the FAQ.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eFor workflow configuration examples, see the \u003ca href=\"https://github.com/CircleCI-Public/circleci-demo-workflows\"\u003eCircleCI Demo Workflows\u003c/a\u003e page on GitHub.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e","frontMatter":{"draft":false,"categories":[],"last_modified_at":"25-Nov-24","hide":false,"search":true,"toc":true,"suggested":false,"sitemap":true,"readtime":true,"contentTags":{"platform":["Cloud","Server v4.x","Server v3.x"]},"sectionTags":null,"lang":"en","title":"Workflow orchestration","slug":"workflows","ext":".adoc","tags":[],"excerpt":"\u003cdiv class=\"paragraph\"\u003e\n\u003cp\u003eWorkflows in CircleCI are used to orchestrate jobs. Workflows have options to control run order, scheduling, and access to resources. This page explains how to configure workflows to suit your project. Optimizing your workflows can increase the speed of your software development through faster feedback, shorter reruns, and more efficient use of resources.\u003c/p\u003e\n\u003c/div\u003e","asciidoc":true,"layout":"classic-docs","description":"Learn about using CircleCI workflows to orchestrate jobs","liquid":"","category":null,"tag":null,"excerpt_origin":"body","document":"#\u003cAsciidoctor::Document@15040 {doctype: \"article\", doctitle: \"Workflow orchestration\", blocks: 12}\u003e","date":"2024-11-30 08:44:32 +0000","content":"\u003cdiv id=\"preamble\"\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eWorkflows in CircleCI are used to orchestrate jobs. Workflows have options to control run order, scheduling, and access to resources. This page explains how to configure workflows to suit your project. Optimizing your workflows can increase the speed of your software development through faster feedback, shorter reruns, and more efficient use of resources.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"overview\"\u003eOverview\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eA \u003cstrong\u003eworkflow\u003c/strong\u003e is a set of rules for defining a collection of jobs and their run order. Create workflows to orchestrate your jobs using the options described on this page.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eWith workflows, you can:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eRun and troubleshoot jobs independently with real-time status feedback.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eSchedule workflows for jobs that should only run periodically.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eFan-out to run multiple jobs concurrently for efficient version testing.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eFan-in to deploy to multiple platforms.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eCatch failures in real-time and rerun only failed jobs.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"workflows-configuration-examples\"\u003eWorkflows configuration examples\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"admonitionblock tip\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-tip\" title=\"Tip\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e For a full specification of the \u003ccode\u003eworkflows\u003c/code\u003e key, see the \u003ca href=\"../configuration-reference/#workflows\"\u003eWorkflows\u003c/a\u003e section of the configuration reference. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"concurrent-job-execution\"\u003eConcurrent job execution\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe example in this section shows the default workflow orchestration model of concurrent jobs. Concurrent jobs are defined as follows:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eUse the \u003ccode\u003eworkflows\u003c/code\u003e key.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eName the workflow, in this case, \u003ccode\u003ebuild_and_test\u003c/code\u003e.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eNest the \u003ccode\u003ejobs\u003c/code\u003e key with a list of job names that are defined in the configuration file. In this example the jobs have no dependencies defined, so they run concurrently.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e \u003cstrong\u003eUsing Docker?\u003c/strong\u003e Authenticating Docker pulls from image registries is recommended when using the Docker execution environment. Authenticated pulls allow access to private Docker images, and may also grant higher rate limits, depending on your registry provider. For further information see \u003ca href=\"/docs/private-images\"\u003eUsing Docker authenticated pulls\u003c/a\u003e. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003ejobs:\n build:\n docker:\n - image: cimg/base:2023.06\n steps:\n - checkout\n - run: \u0026lt;command\u0026gt;\n test:\n docker:\n - image: cimg/base:2023.06\n steps:\n - checkout\n - run: \u0026lt;command\u0026gt;\nworkflows:\n build_and_test:\n jobs:\n - build\n - test\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eSee the \u003ca href=\"https://github.com/CircleCI-Public/circleci-demo-workflows/blob/parallel-jobs/.circleci/config.yml\"\u003eSample concurrent workflow config\u003c/a\u003e for a full example.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eWhen using workflows, note the following best practices:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eMove the quickest jobs up to the start of your workflow. For example, lint or syntax checking should happen before longer-running, more computationally expensive jobs.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eUsing a \"setup\" job at the \u003cem\u003estart\u003c/em\u003e of a workflow can be helpful to do some preflight checks and populate a workspace for all the following jobs.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock tip\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-tip\" title=\"Tip\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e Refer to the \u003ca href=\"../optimizations/\"\u003eOptimization reference\u003c/a\u003e for tips to improve your configuration. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"sequential-job-execution\"\u003eSequential job execution\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis example shows a workflow with four sequential jobs. Each job waits to start until the \"required\" job finishes successfully, as illustrated in the following diagram:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/sequential_workflow.png\" alt=\"Sequential Job Execution Workflow\"\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis configuration snippet is an example of a workflow configured for sequential jobs:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n build-test-and-deploy:\n jobs:\n - build\n - test1:\n requires:\n - build\n - test2:\n requires:\n - test1\n - deploy:\n requires:\n - test2\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eDefine job dependencies using the \u003ccode\u003erequires\u003c/code\u003e key. A job must wait until all upstream jobs in the dependency graph have run. In this example, the \u003ccode\u003edeploy\u003c/code\u003e job runs when the \u003ccode\u003ebuild\u003c/code\u003e, \u003ccode\u003etest1\u003c/code\u003e and \u003ccode\u003etest2\u003c/code\u003e jobs complete successfully:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003edeploy\u003c/code\u003e job waits for the \u003ccode\u003etest2\u003c/code\u003e job\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003etest2\u003c/code\u003e job waits for the \u003ccode\u003etest1\u003c/code\u003e job\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003etest1\u003c/code\u003e job waits for the \u003ccode\u003ebuild\u003c/code\u003e job\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eSee the \u003ca href=\"https://github.com/CircleCI-Public/circleci-demo-workflows/blob/sequential-branch-filter/.circleci/config.yml\"\u003eSample Sequential Workflow config\u003c/a\u003e for a full example.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"fan-outfan-in-workflow\"\u003eFan-out/fan-in workflow\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis example workflow has a fan-out/fan-in structure, as follows:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eA common build job is run.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe workflow fans-out to run a set of acceptance test jobs concurrently.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe workflow fans-in to run a common deploy job.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/fan-out-in.png\" alt=\"Fan-out and Fan-in Workflow\"\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis configuration snippet is an example of a workflow configured for fan-out/fan-in job execution:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n build_accept_deploy:\n jobs:\n - build\n - acceptance_test_1:\n requires:\n - build\n - acceptance_test_2:\n requires:\n - build\n - acceptance_test_3:\n requires:\n - build\n - acceptance_test_4:\n requires:\n - build\n - deploy:\n requires:\n - acceptance_test_1\n - acceptance_test_2\n - acceptance_test_3\n - acceptance_test_4\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn this example, as soon as the \u003ccode\u003ebuild\u003c/code\u003e job finishes successfully, all four acceptance test jobs start. The \u003ccode\u003edeploy\u003c/code\u003e job waits for all four acceptance test jobs to succeed before it starts.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eSee the \u003ca href=\"https://github.com/CircleCI-Public/circleci-demo-workflows/tree/fan-in-fan-out\"\u003eSample Fan-in/Fan-out Workflow config\u003c/a\u003e for a full example.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"holding-a-workflow-for-a-manual-approval\"\u003eHold a workflow for a manual approval\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eUse an \u003ccode\u003eapproval\u003c/code\u003e job to configure a workflow to wait for manual approval before continuing. Anyone who has push access to the repository can approve the job to continue the workflow or cancel to end the workflow. Approve or Cancel either by using the buttons in the CircleCI web app, or via the API.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eSome things to keep in mind when using manual approval in a workflow:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003e\u003ccode\u003eapproval\u003c/code\u003e is a special job type that is configured when listing jobs under the \u003ccode\u003eworkflows\u003c/code\u003e key. You do not need to define an \u003ccode\u003eapproval\u003c/code\u003e type job in the \u003ccode\u003ejobs\u003c/code\u003e section of your configuration. If you do configure steps for a job that is given the \u003ccode\u003eapproval\u003c/code\u003e type in the workflows section, the steps for that job will not be run. An \u003ccode\u003eapproval\u003c/code\u003e job is \u003cem\u003eonly\u003c/em\u003e used to \u003cem\u003ehold\u003c/em\u003e the workflow for approval, not to run any work.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003eapproval\u003c/code\u003e job name must be unique and not used by any other job in your configuration.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe name of the approval job is arbitrary. For example, an approval job can be named \u003ccode\u003ehold\u003c/code\u003e, \u003ccode\u003ewait\u003c/code\u003e, \u003ccode\u003epause\u003c/code\u003e, etc.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eAll jobs that run \u003cem\u003eafter\u003c/em\u003e a manual approval job \u003cstrong\u003emust\u003c/strong\u003e \u003ccode\u003erequire\u003c/code\u003e the name of the \u003ccode\u003eapproval\u003c/code\u003e job.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eJobs run in the order defined in the workflow.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eWhen the workflow encounters a job with \u003ccode\u003etype: approval\u003c/code\u003e, the workflow pauses until action is taken to approve or cancel.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eIf approval is granted the workflow continues to process jobs in the order defined in the configuration file.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eIf cancel is granted the downstream jobs are not run.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eJobs downstream of an \u003ccode\u003eapproval\u003c/code\u003e job can be restricted by adding a \u003ca href=\"../contexts/#approve-jobs-that-use-restricted-contexts\"\u003erestricted context\u003c/a\u003e to those downstream jobs.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe following screenshot demonstrates:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eA workflow that needs approval.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe approval popup.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe workflow graph after approval.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/approval-workflow-map.png\" alt=\"A three section image showing workflow graph with \u0026quot;Needs approval\u0026quot; job\" width=\"the approval popup\" height=\"and the workflow graph\"\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eBy clicking on the \u003ccode\u003eapproval\u003c/code\u003e job\u0026#8217;s name (\u003ccode\u003ehold\u003c/code\u003e, in the screenshot above), an approval dialog box appears. You can approve, cancel, or close the popup without approving.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"configure-an-approval-job\"\u003eConfigure an approval job\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eTo set up a manual approval workflow, add a job to the \u003ccode\u003ejobs\u003c/code\u003e list in your workflow with \u003ccode\u003etype: approval\u003c/code\u003e. For example:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e# ...\n# \u0026lt;\u0026lt; your config for the build, test1, test2, and deploy jobs \u0026gt;\u0026gt;\n# ...\n\nworkflows:\n build-test-and-approval-deploy:\n jobs:\n - build # your custom job from your config, that builds your code\n - test1: # your custom job; runs test suite 1\n requires: # test1 will not run until the `build` job is completed.\n - build\n - test2: # another custom job; runs test suite 2,\n requires: # test2 is dependent on the success of job `test1`\n - test1\n - hold: # \u0026lt;\u0026lt;\u0026lt; A job that will require manual approval in the CircleCI web application.\n type: approval # This key-value pair will set your workflow to a status of \"Needs Approval\"\n requires: # We only run the \"hold\" job when test2 has succeeded\n - test2\n # On approval of the `hold` job, any successive job that requires the `hold` job will run.\n # In this case, a user is manually triggering the deploy job.\n - deploy:\n requires:\n - hold\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn this example, the \u003ccode\u003edeploy\u003c/code\u003e job will not run until the \u003ccode\u003ehold\u003c/code\u003e job is approved.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"approve-a-job\"\u003eApprove a job\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eTo approve a job follow these steps:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"openblock tab approve CircleCI_web_app\"\u003e \u003cdiv class=\"content\"\u003e \u003cdiv class=\"olist arabic\"\u003e \u003col class=\"arabic\"\u003e \u003cli\u003e \u003cp\u003eSelect the \u003ccode\u003ehold\u003c/code\u003e job in the \u003cstrong\u003eWorkflows\u003c/strong\u003e page of the CircleCI web app.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eSelect \u003cb class=\"button\"\u003eApprove\u003c/b\u003e.\u003c/p\u003e \u003c/li\u003e \u003c/ol\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"openblock tab approve API\"\u003e \u003cdiv class=\"content\"\u003e \u003cdiv class=\"olist arabic\"\u003e \u003col class=\"arabic\"\u003e \u003cli\u003e \u003cp\u003eSet up your API authentication. Steps are available in the \u003ca href=\"../api-developers-guide/#add-an-api-token\"\u003eAPI developers guide\u003c/a\u003e.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eYou need your workflow ID and the \u003ccode\u003eapproval_request_id\u003c/code\u003e (which is the job ID for the job requiring approval) to make the API POST request. Depending on your use case, you might be configuring an approval job in a pipeline, or using an external service to approve a job. You can get the required parameters using \u003ca href=\"../variables/\"\u003epipeline values or environment variables\u003c/a\u003e, or by \u003ca href=\"../webhooks/\"\u003ereceiving webhooks\u003c/a\u003e or polling the API. To approve a job, use the \u003ca href=\"https://circleci.com/docs/api/v2/index.html#operation/approvePendingApprovalJobById\"\u003eapprove a job\u003c/a\u003e endpoint, for example:\u003c/p\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003ecurl --request POST \\\n --url https://circleci.com/api/v2/workflow/\u0026lt;workflow-ID\u0026gt;/approve/\u0026lt;approval_request_id\u0026gt; \\\n --header \"Circle-Token: ${CIRCLE_TOKEN}\" \\\n --header 'content-type: application/json' \\\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003c/li\u003e \u003c/ol\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"cancel-a-job\"\u003eCancel a job\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eTo Cancel a job follow these steps:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"openblock tab cancel CircleCI_web_app\"\u003e \u003cdiv class=\"content\"\u003e \u003cdiv class=\"olist arabic\"\u003e \u003col class=\"arabic\"\u003e \u003cli\u003e \u003cp\u003eSelect the \u003ccode\u003ehold\u003c/code\u003e job in the \u003cstrong\u003eWorkflows\u003c/strong\u003e page of the CircleCI web app.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eSelect \u003cb class=\"button\"\u003eCancel\u003c/b\u003e.\u003c/p\u003e \u003c/li\u003e \u003c/ol\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"openblock tab cancel API\"\u003e \u003cdiv class=\"content\"\u003e \u003cdiv class=\"olist arabic\"\u003e \u003col class=\"arabic\"\u003e \u003cli\u003e \u003cp\u003eSet up your API authentication. Steps are available in the \u003ca href=\"../api-developers-guide/#add-an-api-token\"\u003eAPI developers guide\u003c/a\u003e.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eYou need your job ID (which is the job ID for the job requiring approval) to make the API POST request. Depending on your use case, you might be configuring an approval job in a pipeline, or using an external service to approve a job. You can get the required parameters using \u003ca href=\"../variables/\"\u003epipeline values or environment variables\u003c/a\u003e, or by \u003ca href=\"../webhooks/\"\u003ereceiving webhooks\u003c/a\u003e or polling the API. To cancel a job, use the \u003ca href=\"https://circleci.com/docs/api/v2/index.html#operation/cancelJobByJobID\"\u003ecancel a job\u003c/a\u003e endpoint, for example:\u003c/p\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003ecurl --request POST \\\n --url https://circleci.com/api/v2/jobs/\u0026lt;job-ID\u0026gt;/cancel \\\n --header \"Circle-Token: ${CIRCLE_TOKEN}\" \\\n --header 'content-type: application/json' \\\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003c/li\u003e \u003c/ol\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn this example, the purpose of the \u003ccode\u003ehold\u003c/code\u003e job is to wait for approval to begin deployment. A job can be approved for up to 90 days after it starts.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"scheduling-a-workflow\"\u003eScheduling a workflow\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e Scheduled workflows are not available for projects integrated through the GitHub App, GitLab or Bitbucket Data Center. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e \u003cstrong\u003eThe deprecation of the scheduled workflows feature is postponed\u003c/strong\u003e. Since the deprecation announcement went live, your feedback and feature requests have been monitored and it is clear there is more work for us to do to improve the existing scheduled pipelines experience, and also make migration easier for all. Updates on a new deprecation timeline will be announced here and on \u003ca href=\"https://discuss.circleci.com/\"\u003eCircleCI Discuss\u003c/a\u003e. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock caution\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-caution\" title=\"Caution\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e The scheduled workflows feature does not support \u003ca href=\"../dynamic-config/\"\u003eDynamic configuration\u003c/a\u003e. If you use dynamic configuration you will need to use \u003ca href=\"../scheduled-pipelines/\"\u003eScheduled pipelines\u003c/a\u003e for scheduling. More information can be found in this \u003ca href=\"https://support.circleci.com/hc/en-us/articles/360060833331-Support-for-Scheduled-Workflows-in-Dynamic-Configurations-Setup-Workflows\"\u003esupport article\u003c/a\u003e. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eBy default, a workflow runs on every \u003ccode\u003egit push\u003c/code\u003e. To trigger a workflow on a schedule, add the \u003ccode\u003etriggers\u003c/code\u003e key to the workflow and specify a \u003ccode\u003eschedule\u003c/code\u003e. Scheduled workflows use the \u003ccode\u003ecron\u003c/code\u003e syntax to represent Coordinated Universal Time (UTC).\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eRunning a workflow for every commit for every branch can be inefficient and expensive. Scheduling a workflow is an alternative to building on every commit. You can \u003cem\u003eschedule\u003c/em\u003e a workflow to run at a certain time for a specific branch or branches. Consider scheduling workflows that are resource-intensive or that generate reports on a schedule rather than on every commit.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock caution\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-caution\" title=\"Caution\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e A scheduled workflow will run on a schedule only. A scheduled workflow will \u003cstrong\u003enot\u003c/strong\u003e be run on commits to your code. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIf you do not configure any workflows in your \u003ccode\u003e.circleci/config.yml\u003c/code\u003e, an implicit workflow is used. If you configure a scheduled workflow the implicit workflow is no longer run. If you want to build on every commit you must add your workflow to your configuration file.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e When you schedule a workflow, the workflow will be counted as an individual user seat. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"nightly-example\"\u003eBuild every night\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn the example below, the \u003ccode\u003enightly\u003c/code\u003e workflow is configured to run every day at 12:00am UTC. The \u003ccode\u003ecron\u003c/code\u003e key is specified using POSIX \u003ccode\u003ecrontab\u003c/code\u003e syntax. See the \u003ca href=\"https://www.unix.com/man-page/POSIX/1posix/crontab/\"\u003ecrontab man page\u003c/a\u003e for \u003ccode\u003ecron\u003c/code\u003e syntax basics. The workflow runs on the \u003ccode\u003emain\u003c/code\u003e and \u003ccode\u003ebeta\u003c/code\u003e branches.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e Scheduled workflows may be delayed by up to 15 minutes. This delay is to maintain reliability during busy times, such as 12:00am UTC. Do not assume that scheduled workflows start with to-the-minute accuracy. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n commit:\n jobs:\n - test\n - deploy\n nightly:\n triggers:\n - schedule:\n cron: \"0 0 * * *\"\n filters:\n branches:\n only:\n - main\n - /^release\\/.*/\n jobs:\n - coverage\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn the above example:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003ecommit\u003c/code\u003e workflow has no \u003ccode\u003etriggers\u003c/code\u003e key and runs on every \u003ccode\u003egit push\u003c/code\u003e.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003enightly\u003c/code\u003e workflow has a \u003ccode\u003etriggers\u003c/code\u003e key and runs on the specified \u003ccode\u003eschedule\u003c/code\u003e, which is daily, and only runs on the \u003ccode\u003emain\u003c/code\u003e branch, as well as any branch that starts \u003ccode\u003erelease/\u003c/code\u003e.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"specifying-a-valid-schedule\"\u003eSpecifying a valid schedule\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eA valid \u003ccode\u003eschedule\u003c/code\u003e requires:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eA \u003ccode\u003ecron\u003c/code\u003e key\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eA \u003ccode\u003efilters\u003c/code\u003e key\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003ebranches\u003c/code\u003e filter must be present\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe value of the \u003ccode\u003ecron\u003c/code\u003e key must be a \u003ca href=\"https://crontab.guru/\"\u003evalid crontab entry\u003c/a\u003e.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe following are \u003cstrong\u003enot\u003c/strong\u003e supported:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eCron step syntax (for example, \u003ccode\u003e*/1\u003c/code\u003e, \u003ccode\u003e*/20\u003c/code\u003e).\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eRange elements within comma-separated lists of elements.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eRange elements for days (for example, \u003ccode\u003eTue-Sat\u003c/code\u003e).\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eUse comma-separated digits instead.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eExample \u003cstrong\u003einvalid\u003c/strong\u003e cron range syntax:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e triggers:\n - schedule:\n cron: \"5 4 * * 1,3-5,6\" # \u0026lt; the range separator with `-` is invalid\n filters:\n branches:\n only:\n - main\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eExample \u003cstrong\u003evalid\u003c/strong\u003e cron range syntax:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e triggers:\n - schedule:\n cron: \"5 4 * * 1,3,4,5,6\"\n filters:\n branches:\n only:\n - main\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe value of the \u003ccode\u003efilters\u003c/code\u003e key must be a map that defines rules for execution on specific branches.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor more details, see the \u003ccode\u003ebranches\u003c/code\u003e section of the \u003ca href=\"../configuration-reference/#schedule-branches\"\u003eCircleCI configuration reference\u003c/a\u003e.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor a full configuration example, see the \u003ca href=\"https://github.com/CircleCI-Public/circleci-demo-workflows/blob/try-schedule-workflow/.circleci/config.yml\"\u003eSample Scheduled Workflows configuration\u003c/a\u003e.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"using-job-contexts-to-share-environment-variables\"\u003eUsing contexts to share and secure environment variables\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn a workflow, you can use a context to securely provide environment variables to specific jobs. Contexts allow you to define environment variables at the organization level and control access to them through security restrictions. Using contexts, sensitive data like API keys or credentials are securely shared with only the jobs that require them. Sensitive data in contexts will not be exposed in your config file.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe following example shows a workflow with four sequential jobs that each use a context to access environment variables. See the \u003ca href=\"../contexts/\"\u003eContexts\u003c/a\u003e page for detailed instructions on this setting in the application.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe following \u003ccode\u003econfig.yml\u003c/code\u003e snippet is an example of a sequential job workflow configured to use the environment variables defined in the \u003ccode\u003eorg-global\u003c/code\u003e context:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n build-test-and-deploy:\n jobs:\n - build\n - test1:\n requires:\n - build\n context: org-global\n - test2:\n requires:\n - test1\n context: org-global\n - deploy:\n requires:\n - test2\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe \u003ccode\u003etest1\u003c/code\u003e and \u003ccode\u003etest2\u003c/code\u003e jobs have access to environment variables stored in the \u003ccode\u003eorg-global\u003c/code\u003e context if the pipeline meets the restrictions set for the context, for example:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eWas the pipeline triggered by a user who \u003ca href=\"../contexts/#security-goup-restrictions\"\u003ehas access\u003c/a\u003e (is in the relevant org/security group etc.)?\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eDoes the \u003ca href=\"../contexts/#project-restrictions\"\u003eproject have access\u003c/a\u003e to the context? By default all projects in an organization have access to contexts set for that organization, but restrictions on project access can be configured.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eDoes the pipeline meet the requirements of any \u003ca href=\"../contexts/#expression-restrictions\"\u003eexpression restrictions\u003c/a\u003e set up for the context?\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"use-conditional-logic-in-workflows\"\u003eUse conditional logic in workflows\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eYou may use a \u003ccode\u003ewhen\u003c/code\u003e clause (the inverse clause \u003ccode\u003eunless\u003c/code\u003e is also supported) under a workflow declaration with a \u003ca href=\"../configuration-reference/#logic-statements\"\u003elogic statement\u003c/a\u003e to determine whether or not to run that workflow.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eWorkflows are always run unless there is a \u003ccode\u003ewhen\u003c/code\u003e or \u003ccode\u003eunless\u003c/code\u003e filter that prevents the workflow from being run. If you want a workflow to run in \u003cstrong\u003eevery\u003c/strong\u003e pipeline, do \u003cstrong\u003enot\u003c/strong\u003e add a when or unless filter.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe example configuration below uses a pipeline parameter, \u003ccode\u003erun_integration_tests\u003c/code\u003e to drive the \u003ccode\u003eintegration_tests\u003c/code\u003e workflow.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eversion: 2.1\n\nparameters:\n run_integration_tests:\n type: boolean\n default: false\n\nworkflows:\n integration_tests:\n when: \u0026lt;\u0026lt; pipeline.parameters.run_integration_tests \u0026gt;\u0026gt;\n jobs:\n - mytestjob\n\njobs:\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis example prevents the workflow \u003ccode\u003eintegration_tests\u003c/code\u003e from running unless the \u003ccode\u003erun_integration_tests\u003c/code\u003e pipeline parameter is \u003ccode\u003etrue\u003c/code\u003e. For example, when the pipeline is triggered with the following in the \u003ccode\u003ePOST\u003c/code\u003e body:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e{\n \"parameters\": {\n \"run_integration_tests\": true\n }\n}\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"using-filters-in-your-workflows\"\u003eUsing filters in your workflows\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe following sections provide examples for using filters in your workflows to manage job execution.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eYou can filter workflows by branch, git tag, or neither. Workflow filters for branches and tags have the keys \u003ccode\u003eonly\u003c/code\u003e and \u003ccode\u003eignore\u003c/code\u003e:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eAny branches/tags that match \u003ccode\u003eonly\u003c/code\u003e will run the job.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eAny branches/tags that match \u003ccode\u003eignore\u003c/code\u003e will not run the job.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eIf neither \u003ccode\u003eonly\u003c/code\u003e nor \u003ccode\u003eignore\u003c/code\u003e are specified then the job is skipped for all branches/tags.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eIf both \u003ccode\u003eonly\u003c/code\u003e and \u003ccode\u003eignore\u003c/code\u003e are specified the \u003ccode\u003eonly\u003c/code\u003e is considered before \u003ccode\u003eignore\u003c/code\u003e.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIf \u003cstrong\u003eboth branch and tag\u003c/strong\u003e filtering is configured and a push to your code includes both branch and tag information, the \u003cstrong\u003ebranch\u003c/strong\u003e filters take precedence. In this scenario, if there are no branch filters configured, tag \u003ccode\u003eignore\u003c/code\u003e filters are used, if they exist.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"branch-level-job-execution\"\u003eBranch-level job execution\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThe following example has one workflow that is configured to run different sets of jobs for different branches:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003etest_dev\u003c/code\u003e job is run on the \u003ccode\u003edev\u003c/code\u003e branch and any branch that begins \u003ccode\u003euser-\u003c/code\u003e\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003etest_stage\u003c/code\u003e job is run on the \u003ccode\u003estage\u003c/code\u003e branch\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003etest_pre-prod\u003c/code\u003e job is run on any branch starting \u003ccode\u003epre-prod\u003c/code\u003e including any suffix added to the branch name using a hyphen.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e Workflows ignore \u003ccode\u003ebranches\u003c/code\u003e keys used in the \u003ccode\u003ejobs\u003c/code\u003e declaration. If you use the \u003ca href=\"../configuration-reference/#branches\"\u003edeprecated job-level branches key\u003c/a\u003e, replace them with workflow filters. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock tip\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-tip\" title=\"Tip\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e This example shows how to provide strings and lists of strings when configuring workflow filters. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n dev_stage_pre-prod:\n jobs:\n - test_dev:\n filters: # using regex filters requires the entire branch to match\n branches:\n only: # only branches matching the below regex filters will run\n - dev\n - /user-.*/\n - test_stage:\n filters:\n branches:\n only: stage\n - test_pre-prod:\n filters:\n branches:\n only: /pre-prod(?:-.+)?$/\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis setup can be illustrated as follows:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/branch_level.png\" alt=\"Branch-Level Job Execution\"\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor more information on regular expressions, see the \u003ca href=\"#using-regular-expressions-to-filter-tags-and-branches\"\u003eUsing Regular Expressions to Filter Tags And Branches\u003c/a\u003e section below.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor a full example of workflows, see the \u003ca href=\"https://github.com/CircleCI-Public/circleci-demo-workflows/blob/sequential-branch-filter/.circleci/config.yml\"\u003econfiguration file\u003c/a\u003e for the Sample Sequential Workflow With Branching project.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"executing-workflows-for-a-git-tag\"\u003eExecuting workflows for a git tag\u003c/h3\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e Webhook payloads are capped at 25 MB and for some events a maximum of 3 tags. If you push several tags at once, CircleCI may not receive them all. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eCircleCI does not run workflows for tags unless you explicitly specify tag filters using regular expressions. Both lightweight and annotated tags are supported.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIf you have configured a job to run on a git tag you must also specify tag filters for any dependent jobs. Use \u003ca href=\"#using-regular-expressions-to-filter-tags-and-branches\"\u003eregular expressions\u003c/a\u003e to specify tag filters for a job.\u003c/p\u003e \u003c/div\u003e \u003chr\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn the example below, two workflows are defined:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003e\u003ccode\u003euntagged-build\u003c/code\u003e runs the \u003ccode\u003ebuild\u003c/code\u003e job for all branches.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003e\u003ccode\u003etagged-build\u003c/code\u003e runs \u003ccode\u003ebuild\u003c/code\u003e for all branches \u003cstrong\u003eand\u003c/strong\u003e all tags starting with \u003ccode\u003ev\u003c/code\u003e.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n untagged-build:\n jobs:\n - build\n tagged-build:\n jobs:\n - build:\n filters:\n tags:\n only: /^v.*/\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003chr\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn the example below, two jobs are configured within the \u003ccode\u003ebuild-deploy\u003c/code\u003e workflow:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003ebuild\u003c/code\u003e job runs for all branches and all tags.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003edeploy\u003c/code\u003e job runs for all branches and only for tags starting with 'v'.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n build-deploy:\n jobs:\n - build:\n filters: # required since `deploy` has tag filters AND requires `build`\n tags:\n only: /.*/\n - deploy:\n requires:\n - build\n filters:\n tags:\n only: /^v.*/\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003chr\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn the example below, three jobs are configured for the \u003ccode\u003ebuild-test-deploy\u003c/code\u003e workflow:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003ebuild\u003c/code\u003e job runs for all branches and only tags starting with 'config-test'.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003etest\u003c/code\u003e job runs once the \u003ccode\u003ebuild\u003c/code\u003e job completes for all branches and only tags starting with 'config-test'.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003edeploy\u003c/code\u003e job runs once the \u003ccode\u003etest\u003c/code\u003e job completes for no branches and only tags starting with 'config-test'.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n build-test-deploy:\n jobs:\n - build:\n filters: # required since `test` has tag filters AND requires `build`\n tags:\n only: /^config-test.*/\n - test:\n requires:\n - build\n filters: # required since `deploy` has tag filters AND requires `test`\n tags:\n only: /^config-test.*/\n - deploy:\n requires:\n - test\n filters:\n tags:\n only: /^config-test.*/\n branches:\n ignore: /.*/\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003chr\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIn the example below, two jobs are defined (\u003ccode\u003etest\u003c/code\u003e and \u003ccode\u003edeploy\u003c/code\u003e) and three workflows use those jobs:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003ebuild\u003c/code\u003e workflow runs for all branches except \u003ccode\u003emain\u003c/code\u003e and is not run on tags.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003estaging\u003c/code\u003e workflow will only run on the \u003ccode\u003emain\u003c/code\u003e branch and is not run on tags.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eThe \u003ccode\u003eproduction\u003c/code\u003e workflow runs for no branches and only for tags starting with \u003ccode\u003ev.\u003c/code\u003e.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003eworkflows:\n build: # This workflow will run on all branches except 'main' and will not run on tags\n jobs:\n - test:\n filters:\n branches:\n ignore: main\n staging: # This workflow will only run on 'main' and will not run on tags\n jobs:\n - test:\n filters: \u0026amp;filters-staging # this yaml anchor is setting these values to \"filters-staging\"\n branches:\n only: main\n - deploy:\n requires:\n - test\n filters:\n \u0026lt;\u0026lt;: *filters-staging # this is calling the previously set yaml anchor\n production: # This workflow will only run on tags (specifically starting with 'v.') and will not run on branches\n jobs:\n - test:\n filters: \u0026amp;filters-production # this yaml anchor is setting these values to \"filters-production\"\n branches:\n ignore: /.*/\n tags:\n only: /^v.*/\n - deploy:\n requires:\n - test\n filters:\n \u0026lt;\u0026lt;: *filters-production # this is calling the previously set yaml anchor\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"using-regular-expressions-to-filter-tags-and-branches\"\u003eUsing regular expressions to filter tags and branches\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eCircleCI branch and tag filters support the Java variant of regex pattern matching. When writing filters, CircleCI matches exact regular expressions.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor example, \u003ccode\u003eonly: /^config-test/\u003c/code\u003e only matches the \u003ccode\u003econfig-test\u003c/code\u003e tag. To match all tags starting with \u003ccode\u003econfig-test\u003c/code\u003e, use \u003ccode\u003eonly: /^config-test.*/\u003c/code\u003e instead.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eUsing tags for semantic versioning is a common use case. To match patch versions 3-7 of a 2.1 release, you can write \u003ccode\u003e/^version-2\\.1\\.[3-7]/\u003c/code\u003e.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor full details on pattern-matching rules, see the \u003ca href=\"https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html\"\u003e\u003ccode\u003ejava.util.regex\u003c/code\u003e documentation\u003c/a\u003e.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"using-workspaces-to-share-data-between-jobs\"\u003eUsing workspaces to share data between jobs\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eEach workflow has an associated \u003ca href=\"../configuration-reference/#persisttoworkspace\"\u003eworkspace\u003c/a\u003e for transferring files to downstream jobs as a workflow progresses.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eConfiguration options are available to:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003e\u003ca href=\"../configuration-reference/#persisttoworkspace\"\u003epersist files to the workspace\u003c/a\u003e\u003c/p\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e- persist_to_workspace:\n root: /tmp/workspace\n paths:\n - target/application.jar\n - build/*\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003e\u003ca href=\"../configuration-reference/#attachworkspace\"\u003eattach a workflow\u0026#8217;s workspace\u003c/a\u003e to a container.\u003c/p\u003e \u003cdiv class=\"listingblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cpre class=\"highlight\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e- attach_workspace:\n at: /tmp/workspace\u003c/code\u003e\u003c/pre\u003e \u003c/div\u003e \u003c/div\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFor further information on workspaces and their configuration see the \u003ca href=\"../workspaces/\"\u003eUsing Workspaces to Share Data Between Jobs\u003c/a\u003e doc.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"rerunning-a-workflows-failed-jobs\"\u003eRerunning a workflow\u0026#8217;s failed jobs\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eWorkflows help to speed up your ability to respond to failures. One way to do this is to only rerun failed jobs rather than a whole workflow. To rerun only a workflow\u0026#8217;s \u003cem\u003efailed\u003c/em\u003e jobs, follow these steps:\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"olist arabic\"\u003e \u003col class=\"arabic\"\u003e \u003cli\u003e \u003cp\u003eIn the \u003ca href=\"https://app.circleci.com/home/\"\u003eCircleCI web app\u003c/a\u003e select your organization.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eSelect \u003cstrong\u003ePipelines\u003c/strong\u003e in the sidebar.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eUse the filters to find your project and pipeline.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eFind the row in the pipeline view for the workflow you would like to rerun from failed and select the \u003cstrong\u003eRerun from failed\u003c/strong\u003e icon. This option is also available in the workflow view using the rerun dropdown menu, which you can access by clicking on the workflow name or badge.\u003c/p\u003e \u003c/li\u003e \u003c/ol\u003e \u003c/div\u003e \u003cdiv class=\"openblock tab rerun-screenshot Rerun_from_the_pipelines_page\"\u003e \u003cdiv class=\"content\"\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/orchestrate-and-trigger/rerun-from-failed-pipelines-page.png\" alt=\"Rerun a workflow from failed from the pipelines page\"\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"openblock tab rerun-screenshot Rerun_from_the_workflows_page\"\u003e \u003cdiv class=\"content\"\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/orchestrate-and-trigger/rerun-from-failed-workflows-page.png\" alt=\"Rerun a workflow from failed from the workflows page\"\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e If you rerun a workflow containing a job that was previously re-run with SSH, the new workflow runs with SSH enabled for that job, even after SSH capability is disabled at the project level. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"states\"\u003eWorkflow states\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eWorkflows may have one of the following states:\u003c/p\u003e \u003c/div\u003e \u003ctable class=\"tableblock frame-all grid-all stripes-even stretch table table-striped\"\u003e \u003ccolgroup\u003e \u003ccol style=\"width: 33.3333%;\"\u003e \u003ccol style=\"width: 33.3333%;\"\u003e \u003ccol style=\"width: 33.3334%;\"\u003e \u003c/colgroup\u003e \u003cthead\u003e \u003ctr\u003e \u003cth class=\"tableblock halign-left valign-top\"\u003eState\u003c/th\u003e \u003cth class=\"tableblock halign-left valign-top\"\u003eDescription\u003c/th\u003e \u003cth class=\"tableblock halign-left valign-top\"\u003eTerminal state\u003c/th\u003e \u003c/tr\u003e \u003c/thead\u003e \u003ctbody\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eRUNNING\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eWorkflow is in progress\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eNo\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eNOT RUN\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eWorkflow never started\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eYes\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eCANCELED\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eWorkflow canceled before it finished\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eYes\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eFAILING\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eA job in the workflow failed, but others are still running or yet to be approved\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eNo\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eFAILED\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eOne or more jobs in the workflow failed\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eYes\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eSUCCESS\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eAll jobs in the workflow completed successfully\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eYes\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eNEEDS APPROVAL (UI) / ON HOLD\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eA job in the workflow is waiting for approval\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eNo\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eERROR\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eWe experienced an internal error starting a job in the workflow\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eYes\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eUNAUTHORIZED\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eOne or more of the jobs terminated with a \u003ccode\u003eunauthorized\u003c/code\u003e job status. The user who triggered the pipeline or approved an approval job does not have access to a required restricted context.\u003c/p\u003e\u003c/td\u003e \u003ctd class=\"tableblock halign-left valign-top\"\u003e\u003cp class=\"tableblock\"\u003eYes\u003c/p\u003e\u003c/td\u003e \u003c/tr\u003e \u003c/tbody\u003e \u003c/table\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e After 90 days non-terminal workflows are automatically by CircleCI. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"troubleshooting\"\u003eTroubleshooting\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eThis section describes common problems and solutions for workflows.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"workflow-and-subsequent-jobs-do-not-trigger\"\u003eWorkflow and subsequent jobs do not trigger\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIf you do not see your workflows running, check for configuration errors that may be preventing the workflow from starting. Navigate to your \u003ca href=\"https://app.circleci.com/pipelines/\"\u003eproject\u0026#8217;s pipelines\u003c/a\u003e and find your workflow name to locate the failure.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"rerunning-workflows-fails\"\u003eRerunning workflows fails\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eFailures may happen before a workflow runs during pipeline processing. Re-running the in this case workflow will fail. Push a change to the project repository or use the trigger pipeline option to rerun the pipeline.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"admonitionblock note\"\u003e \u003ctable\u003e \u003ctr\u003e \u003ctd class=\"icon\"\u003e \u003ci class=\"fa icon-note\" title=\"Note\"\u003e\u003c/i\u003e \u003c/td\u003e \u003ctd class=\"content\"\u003e You cannot rerun jobs and workflows that are \u0026gt;= 90 days. \u003c/td\u003e \u003c/tr\u003e \u003c/table\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect2\"\u003e \u003ch3 id=\"workflows-waiting-for-status-in-github\"\u003eWorkflows waiting for status in GitHub\u003c/h3\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eIf you have workflows configured on a protected branch and the status check never completes, check the \u003ccode\u003eci/circleci\u003c/code\u003e status key. \u003ccode\u003eci/circleci\u003c/code\u003e is related to a deprecated check and should be and deselected.\u003c/p\u003e \u003c/div\u003e \u003cdiv class=\"imageblock\"\u003e \u003cdiv class=\"content\"\u003e \u003cimg src=\"/docs/assets/img/docs/github_branches_status.png\" alt=\"Uncheck GitHub Status Keys\"\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"paragraph\"\u003e \u003cp\u003eGo to \u003cspan class=\"menuseq\"\u003e\u003cb class=\"menu\"\u003eSettings\u003c/b\u003e\u0026#160;\u003ci class=\"fa fa-angle-right caret\"\u003e\u003c/i\u003e \u003cb class=\"menuitem\"\u003eBranches\u003c/b\u003e\u003c/span\u003e in GitHub and select \u003cb class=\"button\"\u003eEdit\u003c/b\u003e on the protected branch to deselect the settings, for example: \u003ccode\u003ehttps://github.com/your-org/project/settings/branches\u003c/code\u003e.\u003c/p\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e \u003cdiv class=\"sect1\"\u003e \u003ch2 id=\"see-also\"\u003eSee also\u003c/h2\u003e \u003cdiv class=\"sectionbody\"\u003e \u003cdiv class=\"ulist\"\u003e \u003cul\u003e \u003cli\u003e \u003cp\u003eSee the \u003ca href=\"../faq/#workflows\"\u003eworkflows\u003c/a\u003e section of the FAQ.\u003c/p\u003e \u003c/li\u003e \u003cli\u003e \u003cp\u003eFor workflow configuration examples, see the \u003ca href=\"https://github.com/CircleCI-Public/circleci-demo-workflows\"\u003eCircleCI Demo Workflows\u003c/a\u003e page on GitHub.\u003c/p\u003e \u003c/li\u003e \u003c/ul\u003e \u003c/div\u003e \u003c/div\u003e \u003c/div\u003e","file_name":"_cci2/workflows.adoc"}},"__lang":"en","__namespaces":{"common":{"appName":"Docs","metaTitle":"Welcome to CircleCI Documentation","metaDescription":"Welcome to CircleCI Documentation"},"header":{"loginButton":{"loggedIn":{"text":"Go to Application","href":"https://app.circleci.com/"},"loggedOut":{"text":"Start Building for Free","href":"https://circleci.com/signup/"}}},"search":{"searchBarPlaceholder":"Search Documentation","docsTab":{"long":"Documentation","short":"Docs"},"orbsTab":{"long":"Orbs","short":"Orbs"},"imagesTab":{"long":"Convenience Images","short":"Images"},"noResults":"No {{type}} results"},"content":{"copyLink":{"copy":"Copy link","copied":"Copied!"},"pageMeta":{"lastUpdateReadTime":"Last updated • Read time","cloudServer":"This document is applicable to CircleCI {{platform}}"},"pageFooter":{"editTitle":"Suggest an edit to this page","makeContribution":"Make a contribution","learnContribution":"Learn how to contribute","helpTitle":"Still need help?","askCommunity":"Ask the CircleCI community","researchCommunity":"Join the research community","support":"Visit our Support site"},"on_this_page":"On This Page","translationInProgress":"This page is in the process of being translated."}},"__N_SSP":true},"page":"/[...slug]","query":{"slug":["workflows"]},"buildId":"9e2f0ef33c33cd80cc959c1747acd17d270b8bd8","assetPrefix":"https://assets-docs.circleci.com/docs","runtimeConfig":{"basePath":"/docs","exceptionLoggerClientToken":"ca1befe4db724589813fc4a2a9642d4d","analyticsKey":"AbgkrgN4cbRhAVEwlzMkHbwvrXnxHh35","datadogRumApplicationId":"2a3e19ca-297e-4a53-a2cf-082e827d13d3","datadogRumClientToken":"pubdffb4b4dd07f1f43b42276901d58da91","isPreviewSite":false},"isFallback":false,"isExperimentalCompile":false,"gssp":true,"appGip":true,"locale":"en","locales":["en","ja"],"defaultLocale":"en","scriptLoader":[]}</script></body></html>