CINXE.COM
<!DOCTYPE html><html data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width, initial-scale=1" data-next-head=""/><link rel="icon" type="image/png" href="/assets/cb-345/images/site/favicon.png" data-next-head=""/><link href="/manifest.json" rel="manifest" data-next-head=""/><meta name="google-site-verification" content="c1kuD-K2HIVF635lypcsWPoD4kilo5-jA_wBFyT4uMY" data-next-head=""/><title data-next-head="">Publishing and installing a package with GitHub Actions - GitHub Docs</title><meta name="description" content="You can configure a workflow in GitHub Actions to automatically publish or install a package from GitHub Packages." data-next-head=""/><link rel="alternate" hrefLang="zh-Hans" href="https://docs.github.com/zh/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions" data-next-head=""/><link rel="alternate" hrefLang="es" href="https://docs.github.com/es/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions" data-next-head=""/><link rel="alternate" hrefLang="pt" href="https://docs.github.com/pt/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions" data-next-head=""/><link rel="alternate" hrefLang="ru" href="https://docs.github.com/ru/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions" data-next-head=""/><link rel="alternate" hrefLang="ja" href="https://docs.github.com/ja/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions" data-next-head=""/><link rel="alternate" hrefLang="fr" href="https://docs.github.com/fr/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions" data-next-head=""/><link rel="alternate" hrefLang="de" href="https://docs.github.com/de/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions" data-next-head=""/><link rel="alternate" hrefLang="ko" href="https://docs.github.com/ko/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions" data-next-head=""/><meta name="path-language" content="en" data-next-head=""/><meta name="path-version" content="free-pro-team@latest" data-next-head=""/><meta name="path-product" content="packages" data-next-head=""/><meta name="path-article" content="packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions" data-next-head=""/><meta name="page-document-type" content="article" data-next-head=""/><meta name="status" content="200" data-next-head=""/><meta property="og:site_name" content="GitHub Docs" data-next-head=""/><meta property="og:title" content="Publishing and installing a package with GitHub Actions - GitHub Docs" data-next-head=""/><meta property="og:type" content="article" data-next-head=""/><meta property="og:url" content="https://docs-internal.github.com/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions" data-next-head=""/><meta property="og:image" content="https://github.githubassets.com/images/modules/open_graph/github-logo.png" data-next-head=""/><link rel="preload" href="/_next/static/css/befc662d3a7d0204.css" as="style"/><link rel="stylesheet" href="/_next/static/css/befc662d3a7d0204.css" data-n-g=""/><link rel="preload" href="/_next/static/css/c48aebeabc14a7b5.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c48aebeabc14a7b5.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8641fa8367109a81.js" defer=""></script><script src="/_next/static/chunks/framework-19baaf6675f9027b.js" defer=""></script><script src="/_next/static/chunks/main-a2c1e924d9046c3c.js" defer=""></script><script src="/_next/static/chunks/pages/_app-ed2149ad90aeada5.js" defer=""></script><script src="/_next/static/chunks/727f57db-4bd4b01815458cf5.js" defer=""></script><script src="/_next/static/chunks/4197-10db3e81f24542eb.js" defer=""></script><script src="/_next/static/chunks/2872-eaff82eddfa86435.js" defer=""></script><script src="/_next/static/chunks/690-9f438af70d12addb.js" defer=""></script><script src="/_next/static/chunks/3460-dd9d4ed72839fb08.js" defer=""></script><script src="/_next/static/chunks/824-cd3224cdbacbc6e5.js" defer=""></script><script src="/_next/static/chunks/7685-9ca829555005f024.js" defer=""></script><script src="/_next/static/chunks/pages/%5BversionId%5D/%5BproductId%5D/%5B...restPage%5D-800cc696b967ab14.js" defer=""></script><script src="/_next/static/MCbgFHVmIdIlMGu6pmoUz/_buildManifest.js" defer=""></script><script src="/_next/static/MCbgFHVmIdIlMGu6pmoUz/_ssgManifest.js" defer=""></script><style data-styled="" data-styled-version="5.3.5">.cEhRXB{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .dmdEgz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;pointer-events:none;}/*!sc*/ .hROlum{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:0;}/*!sc*/ .bmseMA{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;font-weight:400;word-break:break-word;}/*!sc*/ .Ywlla{list-style:none;}/*!sc*/ .cUxMoC{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/ .lmYNOb{height:20px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));margin-left:8px;font-weight:initial;}/*!sc*/ [data-variant="danger"]:hover .Box-sc-g0xbh4-0,[data-variant="danger"]:active .lmYNOb{color:var(--fgColor-default,var(--color-fg-default,#1F2328));}/*!sc*/ .gMkIpo{padding:0;margin:0;display:none;}/*!sc*/ .gMkIpo *{font-size:14px;}/*!sc*/ .enEvIH{padding:0;margin:0;display:block;}/*!sc*/ .enEvIH *{font-size:14px;}/*!sc*/ .ivpQTm{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;font-weight:600;word-break:break-word;}/*!sc*/ .bxiMxO{grid-area:breadcrumbs;}/*!sc*/ .eQiQea{grid-area:topper;}/*!sc*/ .ijSsTo{grid-area:intro;}/*!sc*/ .dMdwQg{border-radius:10px;border-style:solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));padding:16px;}/*!sc*/ .giVcWX{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;grid-area:sidebar;}/*!sc*/ .kohLxz{grid-area:content;}/*!sc*/ data-styled.g3[id="Box-sc-g0xbh4-0"]{content:"cEhRXB,dmdEgz,hROlum,bmseMA,Ywlla,cUxMoC,lmYNOb,gMkIpo,enEvIH,ivpQTm,bxiMxO,eQiQea,ijSsTo,dMdwQg,giVcWX,kohLxz,"}/*!sc*/ .hXCKEr{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;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-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:transparent;box-shadow:none;}/*!sc*/ .hXCKEr:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .hXCKEr:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .hXCKEr:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .hXCKEr[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .hXCKEr[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .hXCKEr:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .hXCKEr:active{-webkit-transition:none;transition:none;}/*!sc*/ .hXCKEr[data-inactive]{cursor:auto;}/*!sc*/ .hXCKEr:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .hXCKEr:disabled [data-component=ButtonCounter],.hXCKEr:disabled [data-component="leadingVisual"],.hXCKEr:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.hXCKEr:focus{outline:solid 1px transparent;}}/*!sc*/ .hXCKEr [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .hXCKEr[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .hXCKEr[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .hXCKEr[data-size="small"] [data-component="text"]{line-height:calc(20 / 12);}/*!sc*/ .hXCKEr[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .hXCKEr[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .hXCKEr[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .hXCKEr[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .hXCKEr[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .hXCKEr[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .hXCKEr[data-block="block"]{width:100%;}/*!sc*/ .hXCKEr[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .hXCKEr[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .hXCKEr[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .hXCKEr[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .hXCKEr[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .hXCKEr[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .hXCKEr[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .hXCKEr[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .hXCKEr[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .hXCKEr [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .hXCKEr [data-component="text"]{grid-area:text;line-height:calc(20/14);white-space:nowrap;}/*!sc*/ .hXCKEr [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .hXCKEr [data-component="trailingAction"]{margin-right:-4px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .hXCKEr [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .hXCKEr [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .hXCKEr [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;}/*!sc*/ .hXCKEr [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .hXCKEr:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .hXCKEr:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .hXCKEr[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .hXCKEr[data-component="IconButton"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .hXCKEr[data-no-visuals]{color:var(--fgColor-accent,var(--color-accent-fg,#0969da));}/*!sc*/ .hXCKEr:has([data-component="ButtonCounter"]){color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));}/*!sc*/ .hXCKEr:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .hXCKEr:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .hXCKEr{height:auto;text-align:left;}/*!sc*/ .hXCKEr span:first-child{display:inline;}/*!sc*/ .jOdgLl{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;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-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .jOdgLl:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .jOdgLl:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .jOdgLl:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .jOdgLl[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .jOdgLl[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .jOdgLl:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .jOdgLl:active{-webkit-transition:none;transition:none;}/*!sc*/ .jOdgLl[data-inactive]{cursor:auto;}/*!sc*/ .jOdgLl:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .jOdgLl:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.jOdgLl:focus{outline:solid 1px transparent;}}/*!sc*/ .jOdgLl [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .jOdgLl[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .jOdgLl[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .jOdgLl[data-size="small"] [data-component="text"]{line-height:calc(20 / 12);}/*!sc*/ .jOdgLl[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .jOdgLl[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .jOdgLl[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .jOdgLl[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .jOdgLl[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .jOdgLl[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .jOdgLl[data-block="block"]{width:100%;}/*!sc*/ .jOdgLl[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .jOdgLl[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .jOdgLl[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .jOdgLl[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .jOdgLl[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .jOdgLl[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .jOdgLl[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .jOdgLl[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .jOdgLl[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .jOdgLl [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .jOdgLl [data-component="text"]{grid-area:text;line-height:calc(20/14);white-space:nowrap;}/*!sc*/ .jOdgLl [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .jOdgLl [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .jOdgLl [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .jOdgLl [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .jOdgLl [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;}/*!sc*/ .jOdgLl [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .jOdgLl:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .jOdgLl:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .jOdgLl[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .jOdgLl [data-component="leadingVisual"],.jOdgLl [data-component="trailingVisual"],.jOdgLl [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .jOdgLl[data-component="IconButton"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .jOdgLl[data-no-visuals]{border-top-left-radius:unset;border-bottom-left-radius:unset;}/*!sc*/ .hmWbvh{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;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-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .hmWbvh:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .hmWbvh:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .hmWbvh:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .hmWbvh[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .hmWbvh[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .hmWbvh:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .hmWbvh:active{-webkit-transition:none;transition:none;}/*!sc*/ .hmWbvh[data-inactive]{cursor:auto;}/*!sc*/ .hmWbvh:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .hmWbvh:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.hmWbvh:focus{outline:solid 1px transparent;}}/*!sc*/ .hmWbvh [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .hmWbvh[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .hmWbvh[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .hmWbvh[data-size="small"] [data-component="text"]{line-height:calc(20 / 12);}/*!sc*/ .hmWbvh[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .hmWbvh[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .hmWbvh[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .hmWbvh[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .hmWbvh[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .hmWbvh[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .hmWbvh[data-block="block"]{width:100%;}/*!sc*/ .hmWbvh[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .hmWbvh[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .hmWbvh[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .hmWbvh[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .hmWbvh[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .hmWbvh[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .hmWbvh[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .hmWbvh[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .hmWbvh[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .hmWbvh [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .hmWbvh [data-component="text"]{grid-area:text;line-height:calc(20/14);white-space:nowrap;}/*!sc*/ .hmWbvh [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .hmWbvh [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .hmWbvh [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .hmWbvh [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .hmWbvh [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;}/*!sc*/ .hmWbvh [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .hmWbvh:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .hmWbvh:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .hmWbvh[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .hmWbvh [data-component="leadingVisual"],.hmWbvh [data-component="trailingVisual"],.hmWbvh [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .hmWbvh[data-component="IconButton"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .lkeyoI{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;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-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .lkeyoI:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .lkeyoI:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .lkeyoI:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .lkeyoI[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .lkeyoI[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .lkeyoI:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .lkeyoI:active{-webkit-transition:none;transition:none;}/*!sc*/ .lkeyoI[data-inactive]{cursor:auto;}/*!sc*/ .lkeyoI:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .lkeyoI:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.lkeyoI:focus{outline:solid 1px transparent;}}/*!sc*/ .lkeyoI [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .lkeyoI[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .lkeyoI[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .lkeyoI[data-size="small"] [data-component="text"]{line-height:calc(20 / 12);}/*!sc*/ .lkeyoI[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .lkeyoI[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .lkeyoI[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .lkeyoI[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .lkeyoI[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .lkeyoI[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .lkeyoI[data-block="block"]{width:100%;}/*!sc*/ .lkeyoI[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .lkeyoI[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .lkeyoI[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .lkeyoI[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .lkeyoI[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .lkeyoI[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .lkeyoI[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .lkeyoI[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .lkeyoI[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .lkeyoI [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .lkeyoI [data-component="text"]{grid-area:text;line-height:calc(20/14);white-space:nowrap;}/*!sc*/ .lkeyoI [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .lkeyoI [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .lkeyoI [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .lkeyoI [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .lkeyoI [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;}/*!sc*/ .lkeyoI [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .lkeyoI:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .lkeyoI:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .lkeyoI[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .lkeyoI [data-component="leadingVisual"],.lkeyoI [data-component="trailingVisual"],.lkeyoI [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .lkeyoI[data-component="IconButton"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .lkeyoI[data-no-visuals]{display:none;}/*!sc*/ .htZXvk{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;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-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .htZXvk:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .htZXvk:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .htZXvk:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .htZXvk[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .htZXvk[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .htZXvk:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .htZXvk:active{-webkit-transition:none;transition:none;}/*!sc*/ .htZXvk[data-inactive]{cursor:auto;}/*!sc*/ .htZXvk:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .htZXvk:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.htZXvk:focus{outline:solid 1px transparent;}}/*!sc*/ .htZXvk [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .htZXvk[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .htZXvk[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .htZXvk[data-size="small"] [data-component="text"]{line-height:calc(20 / 12);}/*!sc*/ .htZXvk[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .htZXvk[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .htZXvk[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .htZXvk[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .htZXvk[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .htZXvk[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .htZXvk[data-block="block"]{width:100%;}/*!sc*/ .htZXvk[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .htZXvk[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .htZXvk[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .htZXvk[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .htZXvk[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .htZXvk[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .htZXvk[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .htZXvk[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .htZXvk[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .htZXvk [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .htZXvk [data-component="text"]{grid-area:text;line-height:calc(20/14);white-space:nowrap;}/*!sc*/ .htZXvk [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .htZXvk [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .htZXvk [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .htZXvk [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .htZXvk [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;}/*!sc*/ .htZXvk [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .htZXvk:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .htZXvk:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .htZXvk[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .htZXvk [data-component="leadingVisual"],.htZXvk [data-component="trailingVisual"],.htZXvk [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .htZXvk[data-component="IconButton"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .htZXvk[data-no-visuals]{margin-left:16px;}/*!sc*/ @media (min-width:768px){.htZXvk[data-no-visuals]{margin-left:0;}}/*!sc*/ @media (min-width:1012px){.htZXvk[data-no-visuals]{display:none;}}/*!sc*/ .jCopKa{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;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-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:transparent;box-shadow:none;}/*!sc*/ .jCopKa:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .jCopKa:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .jCopKa:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .jCopKa[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .jCopKa[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .jCopKa:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .jCopKa:active{-webkit-transition:none;transition:none;}/*!sc*/ .jCopKa[data-inactive]{cursor:auto;}/*!sc*/ .jCopKa:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .jCopKa:disabled [data-component=ButtonCounter],.jCopKa:disabled [data-component="leadingVisual"],.jCopKa:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.jCopKa:focus{outline:solid 1px transparent;}}/*!sc*/ .jCopKa [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .jCopKa[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .jCopKa[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .jCopKa[data-size="small"] [data-component="text"]{line-height:calc(20 / 12);}/*!sc*/ .jCopKa[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .jCopKa[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .jCopKa[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .jCopKa[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .jCopKa[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .jCopKa[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .jCopKa[data-block="block"]{width:100%;}/*!sc*/ .jCopKa[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .jCopKa[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .jCopKa[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .jCopKa[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .jCopKa[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .jCopKa[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .jCopKa[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .jCopKa[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .jCopKa[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .jCopKa [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .jCopKa [data-component="text"]{grid-area:text;line-height:calc(20/14);white-space:nowrap;}/*!sc*/ .jCopKa [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .jCopKa [data-component="trailingAction"]{margin-right:-4px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .jCopKa [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .jCopKa [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .jCopKa [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;}/*!sc*/ .jCopKa [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .jCopKa:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .jCopKa:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .jCopKa[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .jCopKa[data-component="IconButton"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .jCopKa[data-no-visuals]{color:var(--fgColor-accent,var(--color-accent-fg,#0969da));}/*!sc*/ .jCopKa:has([data-component="ButtonCounter"]){color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));}/*!sc*/ .jCopKa:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .jCopKa:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ data-styled.g4[id="types__StyledButton-sc-ws60qy-0"]{content:"hXCKEr,jOdgLl,hmWbvh,lkeyoI,htZXvk,jCopKa,"}/*!sc*/ .eiGLpS{display:none;}/*!sc*/ .eiGLpS[popover]{position:absolute;padding:0.5em 0.75em;width:-webkit-max-content;width:-moz-max-content;width:max-content;margin:auto;-webkit-clip:auto;clip:auto;white-space:normal;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-font-smoothing:subpixel-antialiased;color:var(--fgColor-onEmphasis,var(--color-fg-on-emphasis,#ffffff));text-align:center;word-wrap:break-word;background:var(--bgColor-emphasis,var(--color-neutral-emphasis-plus,#24292f));border-radius:6px;border:0;opacity:0;max-width:250px;inset:auto;overflow:visible;}/*!sc*/ .eiGLpS[popover]:popover-open{display:block;}/*!sc*/ .eiGLpS[popover].\:popover-open{display:block;}/*!sc*/ @media (forced-colors:active){.eiGLpS{outline:1px solid transparent;}}/*!sc*/ .eiGLpS::after{position:absolute;display:block;right:0;left:0;height:var(--overlay-offset,0.25rem);content:'';}/*!sc*/ .eiGLpS[data-direction='n']::after,.eiGLpS[data-direction='ne']::after,.eiGLpS[data-direction='nw']::after{top:100%;}/*!sc*/ .eiGLpS[data-direction='s']::after,.eiGLpS[data-direction='se']::after,.eiGLpS[data-direction='sw']::after{bottom:100%;}/*!sc*/ .eiGLpS[data-direction='w']::after{position:absolute;display:block;height:100%;width:8px;content:'';bottom:0;left:100%;}/*!sc*/ .eiGLpS[data-direction='e']::after{position:absolute;display:block;height:100%;width:8px;content:'';bottom:0;right:100%;margin-left:-8px;}/*!sc*/ @-webkit-keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ @keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ .eiGLpS:popover-open,.eiGLpS:popover-open::before{-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .eiGLpS.\:popover-open,.eiGLpS.\:popover-open::before{-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ data-styled.g8[id="Tooltip__StyledTooltip-sc-e45c7z-0"]{content:"eiGLpS,"}/*!sc*/ .daAEFx{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}/*!sc*/ .gzcJGA{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);}/*!sc*/ data-styled.g11[id="Octicon-sc-9kayk9-0"]{content:"daAEFx,gzcJGA,"}/*!sc*/ .bebFBv{font-weight:600;font-size:32px;margin:0;font-size:14px;}/*!sc*/ @media (min-width:1012px) and (max-width:1400px){.bebFBv{margin-top:2rem;}}/*!sc*/ data-styled.g28[id="Heading__StyledHeading-sc-1c1dgg0-0"]{content:"bebFBv,"}/*!sc*/ .hgjakc{margin:0;padding-inline-start:0;padding-top:8px;padding-bottom:8px;}/*!sc*/ data-styled.g29[id="List__ListBox-sc-1x7olzq-0"]{content:"hgjakc,"}/*!sc*/ .lnYQME{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:0;padding-right:0;font-size:14px;padding-top:0;padding-bottom:0;line-height:20px;min-height:5px;margin-left:8px;margin-right:8px;border-radius:6px;-webkit-transition:background 33.333ms linear;transition:background 33.333ms linear;color:var(--fgColor-default,var(--color-fg-default,#1F2328));cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:unset;border:unset;width:calc(100% - 16px);font-family:unset;text-align:unset;margin-top:unset;margin-bottom:unset;}/*!sc*/ .lnYQME[data-loading]{cursor:default;}/*!sc*/ .lnYQME[aria-disabled],.lnYQME[data-inactive]{cursor:not-allowed;}/*!sc*/ .lnYQME[aria-disabled] [data-component="ActionList.Checkbox"],.lnYQME[data-inactive] [data-component="ActionList.Checkbox"]{cursor:not-allowed;background-color:var(--color-input-disabled-bg,rgba(175,184,193,0.2));border-color:var(--color-input-disabled-bg,rgba(175,184,193,0.2));}/*!sc*/ @media (forced-colors:active){.lnYQME:focus,.lnYQME:focus-visible,.lnYQME > a.focus-visible{outline:solid 1px transparent !important;}}/*!sc*/ .lnYQME [data-component="ActionList.Item--DividerContainer"]{position:relative;}/*!sc*/ .lnYQME [data-component="ActionList.Item--DividerContainer"]::before{content:" ";display:block;position:absolute;width:100%;top:-7px;border:0 solid;border-top-width:0;border-color:var(--divider-color,transparent);}/*!sc*/ .lnYQME:not(:first-of-type){--divider-color:var(--borderColor-muted,var(--color-action-list-item-inline-divider,rgba(208,215,222,0.48)));}/*!sc*/ [data-component="ActionList.Divider"] + .Item__LiBox-sc-yeql7o-0{--divider-color:transparent !important;}/*!sc*/ .lnYQME:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]),.lnYQME[data-focus-visible-added]:not([aria-disabled]):not([data-inactive]){--divider-color:transparent;}/*!sc*/ .lnYQME:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .Item__LiBox-sc-yeql7o-0,.lnYQME[data-focus-visible-added] + li{--divider-color:transparent;}/*!sc*/ @media (hover:hover) and (pointer:fine){.lnYQME:hover:not([aria-disabled]):not([data-inactive]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));color:var(--fgColor-default,var(--color-fg-default,#1F2328));box-shadow:inset 0 0 0 max(1px,0.0625rem) var(--control-transparent-borderColor-active,var(--color-action-list-item-default-active-border,transparent));}.lnYQME:focus-visible,.lnYQME > a.focus-visible,.lnYQME:focus.focus-visible{outline:none;border:2 solid;box-shadow:0 0 0 2px var(--bgColor-accent-emphasis,var(--color-accent-emphasis,#0969da));}.lnYQME:active:not([aria-disabled]):not([data-inactive]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));color:var(--fgColor-default,var(--color-fg-default,#1F2328));}}/*!sc*/ .itjSOb{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:8px;padding-right:8px;padding-top:6px;padding-bottom:6px;line-height:20px;min-height:5px;margin-left:8px;margin-right:8px;border-radius:6px;-webkit-transition:background 33.333ms linear;transition:background 33.333ms linear;color:var(--fgColor-default,var(--color-fg-default,#1F2328));cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:unset;border:unset;width:calc(100% - 16px);font-family:unset;text-align:unset;margin-top:unset;margin-bottom:unset;}/*!sc*/ .itjSOb[data-loading]{cursor:default;}/*!sc*/ .itjSOb[aria-disabled],.itjSOb[data-inactive]{cursor:not-allowed;}/*!sc*/ .itjSOb[aria-disabled] [data-component="ActionList.Checkbox"],.itjSOb[data-inactive] [data-component="ActionList.Checkbox"]{cursor:not-allowed;background-color:var(--color-input-disabled-bg,rgba(175,184,193,0.2));border-color:var(--color-input-disabled-bg,rgba(175,184,193,0.2));}/*!sc*/ @media (forced-colors:active){.itjSOb:focus,.itjSOb:focus-visible,.itjSOb > a.focus-visible{outline:solid 1px transparent !important;}}/*!sc*/ .itjSOb [data-component="ActionList.Item--DividerContainer"]{position:relative;}/*!sc*/ .itjSOb [data-component="ActionList.Item--DividerContainer"]::before{content:" ";display:block;position:absolute;width:100%;top:-7px;border:0 solid;border-top-width:0;border-color:var(--divider-color,transparent);}/*!sc*/ .itjSOb:not(:first-of-type){--divider-color:var(--borderColor-muted,var(--color-action-list-item-inline-divider,rgba(208,215,222,0.48)));}/*!sc*/ [data-component="ActionList.Divider"] + .Item__LiBox-sc-yeql7o-0{--divider-color:transparent !important;}/*!sc*/ .itjSOb:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]),.itjSOb[data-focus-visible-added]:not([aria-disabled]):not([data-inactive]){--divider-color:transparent;}/*!sc*/ .itjSOb:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .Item__LiBox-sc-yeql7o-0,.itjSOb[data-focus-visible-added] + li{--divider-color:transparent;}/*!sc*/ @media (hover:hover) and (pointer:fine){.itjSOb:hover:not([aria-disabled]):not([data-inactive]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));color:var(--fgColor-default,var(--color-fg-default,#1F2328));box-shadow:inset 0 0 0 max(1px,0.0625rem) var(--control-transparent-borderColor-active,var(--color-action-list-item-default-active-border,transparent));}.itjSOb:focus-visible,.itjSOb > a.focus-visible,.itjSOb:focus.focus-visible{outline:none;border:2 solid;box-shadow:0 0 0 2px var(--bgColor-accent-emphasis,var(--color-accent-emphasis,#0969da));}.itjSOb:active:not([aria-disabled]):not([data-inactive]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));color:var(--fgColor-default,var(--color-fg-default,#1F2328));}}/*!sc*/ .hTSEii{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:0;padding-right:0;font-size:14px;padding-top:0;padding-bottom:0;line-height:20px;min-height:5px;margin-left:8px;margin-right:8px;border-radius:6px;-webkit-transition:background 33.333ms linear;transition:background 33.333ms linear;color:var(--fgColor-default,var(--color-fg-default,#1F2328));cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:unset;border:unset;width:calc(100% - 16px);font-family:unset;text-align:unset;margin-top:unset;margin-bottom:unset;font-weight:600;background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .hTSEii[data-loading]{cursor:default;}/*!sc*/ .hTSEii[aria-disabled],.hTSEii[data-inactive]{cursor:not-allowed;}/*!sc*/ .hTSEii[aria-disabled] [data-component="ActionList.Checkbox"],.hTSEii[data-inactive] [data-component="ActionList.Checkbox"]{cursor:not-allowed;background-color:var(--color-input-disabled-bg,rgba(175,184,193,0.2));border-color:var(--color-input-disabled-bg,rgba(175,184,193,0.2));}/*!sc*/ @media (forced-colors:active){.hTSEii:focus,.hTSEii:focus-visible,.hTSEii > a.focus-visible{outline:solid 1px transparent !important;}}/*!sc*/ .hTSEii [data-component="ActionList.Item--DividerContainer"]{position:relative;}/*!sc*/ .hTSEii [data-component="ActionList.Item--DividerContainer"]::before{content:" ";display:block;position:absolute;width:100%;top:-7px;border:0 solid;border-top-width:0;border-color:var(--divider-color,transparent);}/*!sc*/ .hTSEii:not(:first-of-type){--divider-color:var(--borderColor-muted,var(--color-action-list-item-inline-divider,rgba(208,215,222,0.48)));}/*!sc*/ [data-component="ActionList.Divider"] + .Item__LiBox-sc-yeql7o-0{--divider-color:transparent !important;}/*!sc*/ .hTSEii:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]),.hTSEii[data-focus-visible-added]:not([aria-disabled]):not([data-inactive]){--divider-color:transparent;}/*!sc*/ .hTSEii:hover:not([aria-disabled]):not([data-inactive]):not([data-loading]) + .Item__LiBox-sc-yeql7o-0,.hTSEii[data-focus-visible-added] + li{--divider-color:transparent;}/*!sc*/ .hTSEii::after{position:absolute;top:calc(50% - 12px);left:-8px;width:4px;height:24px;content:"";background-color:var(--fgColor-accent,var(--color-accent-fg,#0969da));border-radius:6px;}/*!sc*/ @media (hover:hover) and (pointer:fine){.hTSEii:hover:not([aria-disabled]):not([data-inactive]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));color:var(--fgColor-default,var(--color-fg-default,#1F2328));box-shadow:inset 0 0 0 max(1px,0.0625rem) var(--control-transparent-borderColor-active,var(--color-action-list-item-default-active-border,transparent));}.hTSEii:focus-visible,.hTSEii > a.focus-visible,.hTSEii:focus.focus-visible{outline:none;border:2 solid;box-shadow:0 0 0 2px var(--bgColor-accent-emphasis,var(--color-accent-emphasis,#0969da));}.hTSEii:active:not([aria-disabled]):not([data-inactive]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));color:var(--fgColor-default,var(--color-fg-default,#1F2328));}}/*!sc*/ data-styled.g31[id="Item__LiBox-sc-yeql7o-0"]{content:"lnYQME,itjSOb,hTSEii,"}/*!sc*/ .cJbOew{color:var(--fgColor-accent,var(--color-accent-fg,#0969da));-webkit-text-decoration:none;text-decoration:none;padding-left:8px;padding-right:8px;padding-top:6px;padding-bottom:6px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;border-radius:6px;color:inherit;}/*!sc*/ [data-a11y-link-underlines='true'] .Link__StyledLink-sc-14289xe-0[data-inline='true']{-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/ .cJbOew:hover{-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/ .cJbOew:is(button){display:inline-block;padding:0;font-size:inherit;white-space:nowrap;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;}/*!sc*/ .cJbOew:hover{color:inherit;-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .fuIgwR{color:var(--fgColor-accent,var(--color-accent-fg,#0969da));-webkit-text-decoration:none;text-decoration:none;padding-left:16px;padding-right:8px;padding-top:6px;padding-bottom:6px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;border-radius:6px;color:inherit;font-size:12px;font-weight:400;}/*!sc*/ [data-a11y-link-underlines='true'] .Link__StyledLink-sc-14289xe-0[data-inline='true']{-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/ .fuIgwR:hover{-webkit-text-decoration:underline;text-decoration:underline;}/*!sc*/ .fuIgwR:is(button){display:inline-block;padding:0;font-size:inherit;white-space:nowrap;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;}/*!sc*/ .fuIgwR:hover{color:inherit;-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ data-styled.g32[id="Link__StyledLink-sc-14289xe-0"]{content:"cJbOew,fuIgwR,"}/*!sc*/ .cnCOhW{font-size:14px;line-height:20px;color:var(--fgColor-default,var(--color-fg-default,#1F2328));vertical-align:middle;background-color:var(--bgColor-default,var(--color-canvas-default,#ffffff));border:1px solid var(--control-borderColor-rest,var(--borderColor-default,var(--color-border-default,#d0d7de)));border-radius:6px;outline:none;box-shadow:var(--shadow-inset,var(--color-primer-shadow-inset,inset 0 1px 0 rgba(208,215,222,0.2)));display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;min-height:32px;overflow:hidden;width:100%;height:2rem;-webkit-transition:width 0.3s ease-in-out;transition:width 0.3s ease-in-out;border-bottom-right-radius:unset;border-top-right-radius:unset;border-right:none;min-width:15rem;}/*!sc*/ .cnCOhW input,.cnCOhW textarea{cursor:text;}/*!sc*/ .cnCOhW select{cursor:pointer;}/*!sc*/ .cnCOhW input::-webkit-input-placeholder,.cnCOhW textarea::-webkit-input-placeholder,.cnCOhW select::-webkit-input-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .cnCOhW input::-moz-placeholder,.cnCOhW textarea::-moz-placeholder,.cnCOhW select::-moz-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .cnCOhW input:-ms-input-placeholder,.cnCOhW textarea:-ms-input-placeholder,.cnCOhW select:-ms-input-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .cnCOhW input::placeholder,.cnCOhW textarea::placeholder,.cnCOhW select::placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .cnCOhW:focus-within{border-color:var(--fgColor-accent,var(--color-accent-fg,#0969da));outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .cnCOhW > textarea{padding:12px;}/*!sc*/ @media (min-width:768px){.cnCOhW{font-size:14px;}}/*!sc*/ data-styled.g34[id="TextInputWrapper__TextInputBaseWrapper-sc-1mqhpbi-0"]{content:"cnCOhW,"}/*!sc*/ .hmJNAM{background-repeat:no-repeat;background-position:right 8px center;padding-left:0;padding-right:0;width:100%;height:2rem;-webkit-transition:width 0.3s ease-in-out;transition:width 0.3s ease-in-out;border-bottom-right-radius:unset;border-top-right-radius:unset;border-right:none;min-width:15rem;}/*!sc*/ .hmJNAM > :not(:last-child){margin-right:8px;}/*!sc*/ .hmJNAM .TextInput-icon,.hmJNAM .TextInput-action{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}/*!sc*/ .hmJNAM > input,.hmJNAM > select{padding-left:12px;padding-right:12px;}/*!sc*/ data-styled.g35[id="TextInputWrapper-sc-1mqhpbi-1"]{content:"hmJNAM,"}/*!sc*/ .jvumlb{border:0;font-size:inherit;font-family:inherit;background-color:transparent;-webkit-appearance:none;color:inherit;width:100%;}/*!sc*/ .jvumlb:focus{outline:0;}/*!sc*/ data-styled.g36[id="UnstyledTextInput-sc-14ypya-0"]{content:"jvumlb,"}/*!sc*/ </style></head><body><div id="__next"><a href="#main-content" class="visually-hidden skip-button color-bg-accent-emphasis color-fg-on-emphasis">Skip to main content</a><div data-container="header" class="border-bottom d-unset color-border-muted no-print z-3 color-bg-default Header_header__frpqb"><div data-container="notifications"></div><header class="color-bg-default p-2 position-sticky top-0 z-1 border-bottom" role="banner" aria-label="Main"><div class="d-flex flex-justify-between p-2 flex-items-center flex-wrap" style="row-gap:1rem" data-testid="desktop-header"><div tabindex="-1" class="Header_logoWithClosedSearch__zhF6Q" id="github-logo"><a rel="" class="d-flex flex-items-center color-fg-default no-underline mr-3" href="/en"><svg aria-hidden="true" focusable="false" class="octicon octicon-mark-github" viewBox="0 0 24 24" width="32" height="32" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M12.5.75C6.146.75 1 5.896 1 12.25c0 5.089 3.292 9.387 7.863 10.91.575.101.79-.244.79-.546 0-.273-.014-1.178-.014-2.142-2.889.532-3.636-.704-3.866-1.35-.13-.331-.69-1.352-1.18-1.625-.402-.216-.977-.748-.014-.762.906-.014 1.553.834 1.769 1.179 1.035 1.74 2.688 1.25 3.349.948.1-.747.402-1.25.733-1.538-2.559-.287-5.232-1.279-5.232-5.678 0-1.25.445-2.285 1.178-3.09-.115-.288-.517-1.467.115-3.048 0 0 .963-.302 3.163 1.179.92-.259 1.897-.388 2.875-.388.977 0 1.955.13 2.875.388 2.2-1.495 3.162-1.179 3.162-1.179.633 1.581.23 2.76.115 3.048.733.805 1.179 1.825 1.179 3.09 0 4.413-2.688 5.39-5.247 5.678.417.36.776 1.05.776 2.128 0 1.538-.014 2.774-.014 3.162 0 .302.216.662.79.547C20.709 21.637 24 17.324 24 12.25 24 5.896 18.854.75 12.5.75Z"></path></svg><span class="h4 text-semibold ml-2 mr-3">GitHub Docs</span></a><div class="hide-sm border-left pl-3"><div data-testid="version-picker" class=""><button type="button" aria-label="Select GitHub product version: current version is free-pro-team@latest" class="types__StyledButton-sc-ws60qy-0 hXCKEr color-fg-default width-full p-1 pl-2 pr-2" aria-haspopup="true" aria-expanded="false" tabindex="0" data-loading="false" aria-describedby=":Ripn6:-loading-announcement" id=":Ripn6:"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 cEhRXB"><span data-component="text"><span style="white-space:pre-wrap">Version: </span><span class="f5 color-fg-muted text-normal" data-testid="field">Free, Pro, & Team</span></span></span><span data-component="trailingAction" class="Box-sc-g0xbh4-0 dmdEgz"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></button></div></div></div><div class="d-flex flex-items-center"><div class="OldHeaderSearchAndWidgets_searchContainerWithClosedSearch__Lkq6t mr-3"><div data-testid="search"><div class="position-relative z-2"><form role="search" class="width-full d-flex"><meta name="viewport" content="width=device-width initial-scale=1"/><label class="text-normal width-full"><span class="visually-hidden" aria-describedby="Enter a search term to find it in the GitHub Docs.">Search GitHub Docs</span><span class="TextInputWrapper__TextInputBaseWrapper-sc-1mqhpbi-0 TextInputWrapper-sc-1mqhpbi-1 cnCOhW hmJNAM TextInput-wrapper" aria-busy="false"><input type="search" aria-required="true" data-testid="site-search-input" placeholder="Search GitHub Docs" autoComplete="off" autoCorrect="off" autoCapitalize="off" spellcheck="false" maxLength="512" aria-label="Search GitHub Docs" aria-describedby="Enter a search term to find it in the GitHub Docs." data-component="input" class="UnstyledTextInput-sc-14ypya-0 jvumlb" value=""/></span></label><button data-component="IconButton" type="submit" data-loading="false" data-no-visuals="true" aria-describedby=":Rucpn6:-loading-announcement" aria-labelledby=":R6cpn6:" class="types__StyledButton-sc-ws60qy-0 jOdgLl"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></button><span data-direction="s" aria-hidden="true" id=":R6cpn6:" class="Tooltip__StyledTooltip-sc-e45c7z-0 eiGLpS">Search</span></form></div></div></div><div class="d-none d-lg-flex flex-items-center"><div data-testid="language-picker" class="d-flex"><button data-component="IconButton" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" data-loading="false" data-no-visuals="true" aria-describedby=":Rkpn6:-loading-announcement" aria-labelledby=":Rukpn6:" id=":Rkpn6:" class="types__StyledButton-sc-ws60qy-0 hmWbvh"><svg aria-hidden="true" focusable="false" class="octicon octicon-globe" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path></svg></button><span data-direction="s" aria-hidden="true" id=":Rukpn6:" class="Tooltip__StyledTooltip-sc-e45c7z-0 eiGLpS">Select language: current language is English</span></div></div><button data-component="IconButton" type="button" class="types__StyledButton-sc-ws60qy-0 hmWbvh hide-lg hide-xl d-flex flex-items-center" data-testid="mobile-search-button" aria-expanded="false" data-loading="false" data-no-visuals="true" aria-describedby=":R74pn6:-loading-announcement" aria-labelledby=":R14pn6:"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></button><span data-direction="s" aria-hidden="true" id=":R14pn6:" class="Tooltip__StyledTooltip-sc-e45c7z-0 eiGLpS">Open Search Bar</span><button data-component="IconButton" type="button" class="types__StyledButton-sc-ws60qy-0 lkeyoI px-3" data-testid="mobile-search-button" aria-expanded="false" data-loading="false" data-no-visuals="true" aria-describedby=":R7cpn6:-loading-announcement" aria-labelledby=":R1cpn6:"><svg aria-hidden="true" focusable="false" class="octicon octicon-x" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path></svg></button><span data-direction="s" aria-hidden="true" id=":R1cpn6:" class="Tooltip__StyledTooltip-sc-e45c7z-0 eiGLpS">Close Search Bar</span><div><button data-component="IconButton" type="button" data-testid="mobile-menu" aria-haspopup="true" aria-expanded="false" tabindex="0" data-loading="false" data-no-visuals="true" aria-describedby=":R1kpn6:-loading-announcement" aria-labelledby=":Rvkpn6:" id=":R1kpn6:" class="types__StyledButton-sc-ws60qy-0 htZXvk"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span data-direction="s" aria-hidden="true" id=":Rvkpn6:" class="Tooltip__StyledTooltip-sc-e45c7z-0 eiGLpS">Open Menu</span></div></div></div><div class="d-flex flex-items-center d-xxl-none mt-2" data-testid="header-subnav"><div class="mr-2" data-testid="header-subnav-hamburger"><button data-component="IconButton" type="button" data-testid="sidebar-hamburger" class="types__StyledButton-sc-ws60qy-0 jCopKa color-fg-muted" data-loading="false" data-no-visuals="true" aria-describedby=":R3b9n6:-loading-announcement" aria-labelledby=":Rb9n6:"><svg aria-hidden="true" focusable="false" class="octicon octicon-three-bars" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 2.75A.75.75 0 0 1 1.75 2h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 2.75Zm0 5A.75.75 0 0 1 1.75 7h12.5a.75.75 0 0 1 0 1.5H1.75A.75.75 0 0 1 1 7.75ZM1.75 12h12.5a.75.75 0 0 1 0 1.5H1.75a.75.75 0 0 1 0-1.5Z"></path></svg></button><span data-direction="s" aria-hidden="true" id=":Rb9n6:" class="Tooltip__StyledTooltip-sc-e45c7z-0 eiGLpS">Open Sidebar</span></div><div class="mr-auto width-full" data-search="breadcrumbs"><nav data-testid="breadcrumbs-header" class="f5 breadcrumbs Breadcrumbs_breadcrumbs__xAC4i" aria-label="Breadcrumb" data-container="breadcrumbs"><ul><li class="d-inline-block"><a rel="" data-testid="breadcrumb-link" title="GitHub Packages" class="Link--primary mr-2 color-fg-muted" href="/en/packages">GitHub Packages</a><span class="color-fg-muted pr-2">/</span></li><li class="d-inline-block"><a rel="" data-testid="breadcrumb-link" title="Managing GitHub packages with workflows" class="Link--primary mr-2 color-fg-muted" href="/en/packages/managing-github-packages-using-github-actions-workflows">Managing GitHub packages with workflows</a><span class="color-fg-muted pr-2">/</span></li><li class="d-inline-block"><a rel="" data-testid="breadcrumb-link" title="Publish & install with Actions" class="Link--primary mr-2 color-fg-muted" href="/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions">Publish & install with Actions</a></li></ul></nav></div></div></header></div><div class="d-lg-flex"><div data-container="nav" class="position-sticky d-none border-right d-xxl-block" style="width:326px;height:calc(100vh - 65px);top:65px"><nav aria-labelledby="allproducts-menu"><div class="d-none px-4 pb-3 border-bottom d-xxl-block"><div class="mt-3"><a rel="" class="f6 pl-2 pr-5 ml-n1 pb-1 Link--primary color-fg-default" href="/en"><svg aria-hidden="true" focusable="false" class="octicon octicon-arrow-left mr-1" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.78 12.53a.75.75 0 0 1-1.06 0L2.47 8.28a.75.75 0 0 1 0-1.06l4.25-4.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L4.81 7h7.44a.75.75 0 0 1 0 1.5H4.81l2.97 2.97a.75.75 0 0 1 0 1.06Z"></path></svg>Home</a></div><div class="mt-3" id="allproducts-menu"><a rel="" data-testid="sidebar-product-xl" class="d-block pl-1 mb-2 h3 color-fg-default no-underline _product-title" href="/en/packages">GitHub Packages</a></div></div><div class="border-right d-none d-xxl-block bg-primary overflow-y-auto flex-shrink-0" style="width:326px;height:calc(100vh - 175px);padding-bottom:185px"><div data-testid="sidebar" style="overflow-y:auto" class="pt-3"><div class="ml-3" data-testid="product-sidebar"><nav aria-label="Product sidebar" class="NavList__NavBox-sc-1c8ygf7-0"><ul class="List__ListBox-sc-1x7olzq-0 hgjakc"><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R3b6n6:--label " id=":R3b6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 cJbOew" href="/en/packages/quickstart"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R3b6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Quickstart</span></div></a></li><li aria-labelledby=":R5b6n6:" class="Box-sc-g0xbh4-0 Ywlla"><button tabindex="0" aria-labelledby=":R5b6n6:--label " id=":R5b6n6:" aria-expanded="false" aria-controls=":R5b6n6H1:" class="Item__LiBox-sc-yeql7o-0 itjSOb"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><div class="Box-sc-g0xbh4-0 cUxMoC"><span id=":R5b6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Learn GitHub Packages</span><span class="Box-sc-g0xbh4-0 lmYNOb"><svg sx="[object Object]" aria-hidden="true" focusable="false" class="octicon octicon-chevron-down Octicon-sc-9kayk9-0 daAEFx" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></span></div></div></button><div><ul id=":R5b6n6H1:" aria-labelledby=":R5b6n6:" class="Box-sc-g0xbh4-0 gMkIpo"><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":Rqlb6n6:--label " id=":Rqlb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/learn-github-packages/introduction-to-github-packages"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":Rqlb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Introduction</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R1alb6n6:--label " id=":R1alb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/learn-github-packages/about-permissions-for-github-packages"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R1alb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">About permissions</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R1qlb6n6:--label " id=":R1qlb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R1qlb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Access control & visibility</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R2alb6n6:--label " id=":R2alb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/learn-github-packages/connecting-a-repository-to-a-package"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R2alb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Connect a repository</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R2qlb6n6:--label " id=":R2qlb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/learn-github-packages/publishing-a-package"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R2qlb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Publishing a package</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R3alb6n6:--label " id=":R3alb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/learn-github-packages/viewing-packages"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R3alb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Viewing packages</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R3qlb6n6:--label " id=":R3qlb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/learn-github-packages/installing-a-package"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R3qlb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Installing a package</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R4alb6n6:--label " id=":R4alb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/learn-github-packages/deleting-and-restoring-a-package"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R4alb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Delete & restore a package</span></div></a></li></ul></div></li><li aria-labelledby=":R7b6n6:" class="Box-sc-g0xbh4-0 Ywlla"><button tabindex="0" aria-labelledby=":R7b6n6:--label " id=":R7b6n6:" aria-expanded="false" aria-controls=":R7b6n6H1:" class="Item__LiBox-sc-yeql7o-0 itjSOb"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><div class="Box-sc-g0xbh4-0 cUxMoC"><span id=":R7b6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Working with a GitHub Packages registry</span><span class="Box-sc-g0xbh4-0 lmYNOb"><svg sx="[object Object]" aria-hidden="true" focusable="false" class="octicon octicon-chevron-down Octicon-sc-9kayk9-0 daAEFx" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></span></div></div></button><div><ul id=":R7b6n6H1:" aria-labelledby=":R7b6n6:" class="Box-sc-g0xbh4-0 gMkIpo"><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":Rqnb6n6:--label " id=":Rqnb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":Rqnb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Container registry</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R1anb6n6:--label " id=":R1anb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/working-with-a-github-packages-registry/working-with-the-docker-registry"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R1anb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Docker registry</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R1qnb6n6:--label " id=":R1qnb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/working-with-a-github-packages-registry/working-with-the-rubygems-registry"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R1qnb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">RubyGems registry</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R2anb6n6:--label " id=":R2anb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R2anb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">npm registry</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R2qnb6n6:--label " id=":R2qnb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R2qnb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Apache Maven registry</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R3anb6n6:--label " id=":R3anb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R3anb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Gradle registry</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R3qnb6n6:--label " id=":R3qnb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/working-with-a-github-packages-registry/working-with-the-nuget-registry"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R3qnb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">NuGet registry</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R4anb6n6:--label " id=":R4anb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/working-with-a-github-packages-registry/migrating-to-the-container-registry-from-the-docker-registry"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R4anb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Migration to Container registry</span></div></a></li></ul></div></li><li aria-labelledby=":R9b6n6:" class="Box-sc-g0xbh4-0 Ywlla"><button tabindex="0" aria-labelledby=":R9b6n6:--label " id=":R9b6n6:" aria-expanded="true" aria-controls=":R9b6n6H1:" class="Item__LiBox-sc-yeql7o-0 itjSOb"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><div class="Box-sc-g0xbh4-0 cUxMoC"><span id=":R9b6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Managing GitHub packages with workflows</span><span class="Box-sc-g0xbh4-0 lmYNOb"><svg sx="[object Object]" aria-hidden="true" focusable="false" class="octicon octicon-chevron-down Octicon-sc-9kayk9-0 gzcJGA" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg></span></div></div></button><div><ul id=":R9b6n6H1:" aria-labelledby=":R9b6n6:" class="Box-sc-g0xbh4-0 enEvIH"><li class="Item__LiBox-sc-yeql7o-0 hTSEii"><a sx="[object Object]" tabindex="0" aria-labelledby=":Rqpb6n6:--label " id=":Rqpb6n6:" aria-current="page" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":Rqpb6n6:--label" class="Box-sc-g0xbh4-0 ivpQTm">Publish & install with Actions</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R1apb6n6:--label " id=":R1apb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/managing-github-packages-using-github-actions-workflows/example-workflows-for-publishing-a-package"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R1apb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Example workflows</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a sx="[object Object]" tabindex="0" aria-labelledby=":R1qpb6n6:--label " id=":R1qpb6n6:" aria-current="false" class="Link__StyledLink-sc-14289xe-0 fuIgwR" href="/en/packages/managing-github-packages-using-github-actions-workflows/about-github-packages-and-github-actions"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R1qpb6n6:--label" class="Box-sc-g0xbh4-0 bmseMA">Packages & Actions</span></div></a></li></ul></div></li></ul></nav></div></div></div></nav></div><div class="flex-column flex-1 min-width-0"><main id="main-content" style="scroll-margin-top:5rem"><div class="ArticleInlineLayout_containerBox__p5DcK"><div class="Box-sc-g0xbh4-0 bxiMxO d-none d-xxl-block mt-3 mr-auto width-full"><nav data-testid="breadcrumbs-in-article" class="f5 breadcrumbs Breadcrumbs_breadcrumbs__xAC4i" aria-label="Breadcrumb" data-container="breadcrumbs"><ul><li class="d-inline-block"><a rel="" data-testid="breadcrumb-link" title="GitHub Packages" class="Link--primary mr-2 color-fg-muted" href="/en/packages">GitHub Packages</a><span class="color-fg-muted pr-2">/</span></li><li class="d-inline-block"><a rel="" data-testid="breadcrumb-link" title="Managing GitHub packages with workflows" class="Link--primary mr-2 color-fg-muted" href="/en/packages/managing-github-packages-using-github-actions-workflows">Managing GitHub packages with workflows</a><span class="color-fg-muted pr-2">/</span></li><li class="d-inline-block"><a rel="" data-testid="breadcrumb-link" title="Publish & install with Actions" class="Link--primary mr-2 color-fg-muted d-none" href="/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions">Publish & install with Actions</a></li></ul></nav></div><div class="ArticleInlineLayout_contentBox__Guuxy"><div class="Box-sc-g0xbh4-0 eQiQea"><div class="d-flex flex-items-baseline flex-justify-between" data-container="title"><h1 id="title-h1" class="border-bottom-0">Publishing and installing a package with GitHub Actions</h1></div></div><div id="article-intro" class="Box-sc-g0xbh4-0 ijSsTo f4"><div class="f2 color-fg-muted mb-3 Lead_container__m3L5f _page-intro" data-container="lead" data-testid="lead" data-search="lead"><p>You can configure a workflow in GitHub Actions to automatically publish or install a package from GitHub Packages.</p></div></div><div class="Box-sc-g0xbh4-0 ijSsTo f4 mb-4"><div class="Box-sc-g0xbh4-0 dMdwQg"><div data-search="hide" data-testid="permissions-callout"><div class="mb-3 d-inline-block"><h2 class="f4">Who can use this feature?</h2></div><div class="d-flex" data-testid="product-statement"><svg aria-hidden="true" focusable="false" class="octicon octicon-briefcase mt-1" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.75 0h2.5C10.216 0 11 .784 11 1.75V3h3.25c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25v-8.5C0 3.784.784 3 1.75 3H5V1.75C5 .784 5.784 0 6.75 0ZM3.5 9.5a3.49 3.49 0 0 1-2-.627v4.377c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V8.873a3.49 3.49 0 0 1-2 .627Zm-1.75-5a.25.25 0 0 0-.25.25V6a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2V4.75a.25.25 0 0 0-.25-.25H1.75ZM9.5 3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25V3Z"></path></svg><div class="pl-2"><p>GitHub Packages is available with GitHub Free, GitHub Pro, GitHub Free for organizations, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server 3.0 or higher.</p> <p><br>GitHub Packages is not available for private repositories owned by accounts using legacy per-repository plans. Also, accounts using legacy per-repository plans cannot access registries that support granular permissions, because these accounts are billed by repository. For the list of registries that support granular permissions, see <a href="/en/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages" _originalHref="/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages">About permissions for GitHub Packages</a>. For more information, see <a href="/en/get-started/learning-about-github/githubs-plans" _originalHref="/get-started/learning-about-github/githubs-plans">GitHub’s plans</a>.</p></div></div></div></div></div><div data-container="toc" class="Box-sc-g0xbh4-0 giVcWX ArticleInlineLayout_sidebarBox__nMJ_o border-bottom border-lg-0 pb-4 mb-5 pb-xl-0 mb-xl-0"><h2 id="in-this-article" class="Heading__StyledHeading-sc-1c1dgg0-0 bebFBv mb-1 ml-3" aria-label="In this article">In this article</h2><nav data-testid="minitoc" class="NavList__NavBox-sc-1c8ygf7-0 Minitocs_miniToc__NaGol my-2" aria-labelledby="in-this-article"><ul class="List__ListBox-sc-1x7olzq-0 hgjakc"><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a tabindex="0" aria-labelledby=":R9mkjeqn6:--label " id=":R9mkjeqn6:" aria-current="false" href="#about-github-packages-with-github-actions" class="Link__StyledLink-sc-14289xe-0 cJbOew Minitocs_nested__JSAov"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":R9mkjeqn6:--label" class="Box-sc-g0xbh4-0 bmseMA">About GitHub Packages with GitHub Actions</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a tabindex="0" aria-labelledby=":Ramkjeqn6:--label " id=":Ramkjeqn6:" aria-current="false" href="#about-permissions-and-package-access" class="Link__StyledLink-sc-14289xe-0 cJbOew Minitocs_nested__JSAov"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":Ramkjeqn6:--label" class="Box-sc-g0xbh4-0 bmseMA">About permissions and package access</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a tabindex="0" aria-labelledby=":Rbmkjeqn6:--label " id=":Rbmkjeqn6:" aria-current="false" href="#default-permissions-and-access-settings-for-packages-modified-through-workflows" class="Link__StyledLink-sc-14289xe-0 cJbOew Minitocs_nested__JSAov"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":Rbmkjeqn6:--label" class="Box-sc-g0xbh4-0 bmseMA">Default permissions and access settings for packages modified through workflows</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a tabindex="0" aria-labelledby=":Rcmkjeqn6:--label " id=":Rcmkjeqn6:" aria-current="false" href="#publishing-a-package-using-an-action" class="Link__StyledLink-sc-14289xe-0 cJbOew Minitocs_nested__JSAov"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":Rcmkjeqn6:--label" class="Box-sc-g0xbh4-0 bmseMA">Publishing a package using an action</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a tabindex="0" aria-labelledby=":Rdmkjeqn6:--label " id=":Rdmkjeqn6:" aria-current="false" href="#installing-a-package-using-an-action" class="Link__StyledLink-sc-14289xe-0 cJbOew Minitocs_nested__JSAov"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":Rdmkjeqn6:--label" class="Box-sc-g0xbh4-0 bmseMA">Installing a package using an action</span></div></a></li><li class="Item__LiBox-sc-yeql7o-0 lnYQME"><a tabindex="0" aria-labelledby=":Remkjeqn6:--label " id=":Remkjeqn6:" aria-current="false" href="#upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token" class="Link__StyledLink-sc-14289xe-0 cJbOew Minitocs_nested__JSAov"><div data-component="ActionList.Item--DividerContainer" class="Box-sc-g0xbh4-0 hROlum"><span id=":Remkjeqn6:--label" class="Box-sc-g0xbh4-0 bmseMA">Upgrading a workflow that accesses a registry using a personal access token</span></div></a></li></ul></nav></div><div data-container="article" data-search="article-body" class="Box-sc-g0xbh4-0 kohLxz ArticleInlineLayout_articleContainer__Sb_Af"><div id="article-contents"><div class="MarkdownContent_markdownBody__v5MYy markdown-body"><h2 id="about-github-packages-with-github-actions" tabindex="-1"><a class="heading-link" href="#about-github-packages-with-github-actions">About GitHub Packages with GitHub Actions<span class="heading-link-symbol" aria-hidden="true"></span></a></h2> <p>GitHub Actions help you automate your software development workflows in the same place you store code and collaborate on pull requests and issues. You can write individual tasks, called actions, and combine them to create a custom workflow. With GitHub Actions you can build end-to-end continuous integration (CI) and continuous deployment (CD) capabilities directly in your repository. For more information, see <a href="/en/actions/learn-github-actions" _originalHref="/actions/learn-github-actions">Writing workflows</a>.</p> <p>You can extend the CI and CD capabilities of your repository by publishing or installing packages as part of your workflow.</p> <h3 id="authenticating-to-package-registries-with-granular-permissions" tabindex="-1"><a class="heading-link" href="#authenticating-to-package-registries-with-granular-permissions">Authenticating to package registries with granular permissions<span class="heading-link-symbol" aria-hidden="true"></span></a></h3> <p>Some GitHub Packages registries support granular permissions. This means you can choose to allow packages to be scoped to a user or an organization, or linked to a repository. For the list of registries that support granular permissions, see <a href="/en/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages" _originalHref="/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages">About permissions for GitHub Packages</a>.</p> <p>For registries that support granular permissions, if your GitHub Actions workflow is using a personal access token to authenticate to a registry, we highly recommend you update your workflow to use the <code>GITHUB_TOKEN</code>. For guidance on updating your workflows that authenticate to a registry with a personal access token, see <a href="/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token" _originalHref="/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token">Publishing and installing a package with GitHub Actions</a>.</p> <div class="ghd-alert ghd-alert-accent"><p class="ghd-alert-title"><svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon mr-2" aria-hidden><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg>Note</p> <p> The ability for GitHub Actions workflows to delete and restore packages using the REST API is currently in public preview and subject to change.</p> </div> <p>You can use a <code>GITHUB_TOKEN</code> in a GitHub Actions workflow to delete or restore a package using the REST API, if the token has <code>admin</code> permission to the package. Repositories that publish packages using a workflow, and repositories that you have explicitly connected to packages, are automatically granted <code>admin</code> permission to packages in the repository.</p> <p>For more information about the <code>GITHUB_TOKEN</code>, see <a href="/en/actions/security-guides/automatic-token-authentication#using-the-github_token-in-a-workflow" _originalHref="/actions/security-guides/automatic-token-authentication#using-the-github_token-in-a-workflow">Automatic token authentication</a>. For more information about the best practices when using a registry in actions, see <a href="/en/actions/security-guides/security-hardening-for-github-actions#considering-cross-repository-access" _originalHref="/actions/security-guides/security-hardening-for-github-actions#considering-cross-repository-access">Security hardening for GitHub Actions</a>.</p> <h3 id="authenticating-to-package-registries-with-repository-scoped-permissions" tabindex="-1"><a class="heading-link" href="#authenticating-to-package-registries-with-repository-scoped-permissions">Authenticating to package registries with repository-scoped permissions<span class="heading-link-symbol" aria-hidden="true"></span></a></h3> <p>Some GitHub Packages registries only support repository-scoped permissions, and do not support granular permissions. For a list of these registries, see <a href="/en/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages" _originalHref="/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages">About permissions for GitHub Packages</a>.</p> <p>If you want your workflow to access a GitHub Packages registry that does not support granular permissions, then we recommend using the <code>GITHUB_TOKEN</code> that GitHub automatically creates for your repository when you enable GitHub Actions. You should set the permissions for this access token in the workflow file to grant read access for the <code>contents</code> scope and write access for the <code>packages</code> scope. For forks, the <code>GITHUB_TOKEN</code> is granted read access for the parent repository. For more information, see <a href="/en/actions/security-guides/automatic-token-authentication" _originalHref="/actions/security-guides/automatic-token-authentication">Automatic token authentication</a>.</p> <p>You can reference the <code>GITHUB_TOKEN</code> in your workflow file using the <code>${{ secrets.GITHUB_TOKEN }}</code> context. For more information, see <a href="/en/actions/security-guides/automatic-token-authentication" _originalHref="/actions/security-guides/automatic-token-authentication">Automatic token authentication</a>.</p> <h2 id="about-permissions-and-package-access" tabindex="-1"><a class="heading-link" href="#about-permissions-and-package-access">About permissions and package access<span class="heading-link-symbol" aria-hidden="true"></span></a></h2> <h3 id="packages-scoped-to-users-or-organizations" tabindex="-1"><a class="heading-link" href="#packages-scoped-to-users-or-organizations">Packages scoped to users or organizations<span class="heading-link-symbol" aria-hidden="true"></span></a></h3> <p>Registries that support granular permissions allow users to create and administer packages as free-standing resources at the organization level. Packages can be scoped to an organization or personal account and you can customize access to each of your packages separately from repository permissions.</p> <p>All workflows accessing registries that support granular permissions should use the <code>GITHUB_TOKEN</code> instead of a personal access token. For more information about security best practices, see <a href="/en/actions/security-guides/security-hardening-for-github-actions#using-secrets" _originalHref="/actions/security-guides/security-hardening-for-github-actions#using-secrets">Security hardening for GitHub Actions</a>.</p> <h3 id="packages-scoped-to-repositories" tabindex="-1"><a class="heading-link" href="#packages-scoped-to-repositories">Packages scoped to repositories<span class="heading-link-symbol" aria-hidden="true"></span></a></h3> <p>When you enable GitHub Actions, GitHub installs a GitHub App on your repository. The <code>GITHUB_TOKEN</code> secret is a GitHub App installation access token. You can use the installation access token to authenticate on behalf of the GitHub App installed on your repository. The token's permissions are limited to the repository that contains your workflow. For more information, see <a href="/en/actions/security-guides/automatic-token-authentication#about-the-github_token-secret" _originalHref="/actions/security-guides/automatic-token-authentication#about-the-github_token-secret">Automatic token authentication</a>.</p> <p>GitHub Packages allows you to push and pull packages through the <code>GITHUB_TOKEN</code> available to a GitHub Actions workflow.</p> <h2 id="default-permissions-and-access-settings-for-packages-modified-through-workflows" tabindex="-1"><a class="heading-link" href="#default-permissions-and-access-settings-for-packages-modified-through-workflows">Default permissions and access settings for packages modified through workflows<span class="heading-link-symbol" aria-hidden="true"></span></a></h2> <p>For packages in registries that support granular permissions, when you create, install, modify, or delete a package through a workflow, there are some default permission and access settings used to ensure admins have access to the workflow. You can adjust these access settings as well. For the list of registries that support granular permissions, see <a href="/en/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages" _originalHref="/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages">About permissions for GitHub Packages</a>.</p> <p>For example, by default if a workflow creates a package using the <code>GITHUB_TOKEN</code>, then:</p> <ul> <li>The package inherits the visibility and permissions model of the repository where the workflow is run.</li> <li>Repository admins where the workflow is run become the admins of the package once the package is created.</li> </ul> <p>These are more examples of how default permissions work for workflows that manage packages.</p> <table><thead><tr><th scope="col">GitHub Actions workflow task</th><th scope="col">Default permissions and access</th></tr></thead><tbody><tr><td>Download an existing</td><td>- If the package is public, any workflow running in any repository can download the package. <br> - If the package is internal, then all workflows running in any repository owned by the Enterprise account can download the package. For enterprise-owned organizations, you can read any repository in the enterprise <br> - If the package is private, only workflows running in repositories that are given read permission on that package can download the package. If you grant a public repository access to private packages, forks of the repository may be able to access the private packages. <br></td></tr><tr><td>Upload a new version to an existing package</td><td>- If the package is private, internal, or public, only workflows running in repositories that are given write permission on that package can upload new versions to the package.</td></tr><tr><td>Delete a package or versions of a package</td><td>- If the package is private, internal, or public, only workflows running in repositories that are given admin permission can delete existing versions of the package.</td></tr></tbody></table> <p>You can also adjust access to packages in a more granular way or adjust some of the default permissions behavior. For more information, see <a href="/en/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility" _originalHref="/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility">Configuring a package's access control and visibility</a>.</p> <h2 id="publishing-a-package-using-an-action" tabindex="-1"><a class="heading-link" href="#publishing-a-package-using-an-action">Publishing a package using an action<span class="heading-link-symbol" aria-hidden="true"></span></a></h2> <p>You can use GitHub Actions to automatically publish packages as part of your continuous integration (CI) flow. This approach to continuous deployment (CD) allows you to automate the creation of new package versions, if the code meets your quality standards. For example, you could create a workflow that runs CI tests every time a developer pushes code to a particular branch. If the tests pass, the workflow can publish a new package version to GitHub Packages.</p> <p>Configuration steps vary by package client. For general information about configuring a workflow for GitHub Actions, see <a href="/en/actions/using-workflows" _originalHref="/actions/using-workflows">Writing workflows</a>.</p> <p>The following example demonstrates how you can use GitHub Actions to build your app, and then automatically create a Docker image and publish it to GitHub Packages. The relevant settings are explained in the code. For full details about each element in a workflow, see <a href="/en/actions/using-workflows/workflow-syntax-for-github-actions" _originalHref="/actions/using-workflows/workflow-syntax-for-github-actions">Workflow syntax for GitHub Actions</a>.</p> <p>Create a new workflow file in your repository (such as <code>.github/workflows/deploy-image.yml</code>), and add the following YAML.</p> <div class="ghd-alert ghd-alert-accent"><p class="ghd-alert-title"><svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon mr-2" aria-hidden><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg>Note</p> <p></p> <ul> <li>This workflow uses actions that are not certified by GitHub. They are provided by a third-party and are governed by separate terms of service, privacy policy, and support documentation.</li> <li>GitHub recommends pinning actions to a commit SHA. To get a newer version, you will need to update the SHA. You can also reference a tag or branch, but the action may change without warning.</li> </ul> </div> <div class="annotate beside"><div class="annotate-header"><header class="d-flex flex-items-center flex-justify-between p-2 text-small rounded-top-1 border-top border-left border-right"><span class="flex-1">YAML</span><div class="annotate-toggle"><button name="annotate-display" value="beside" type="button" class="annotate-option">Beside</button><button name="annotate-display" value="inline" type="button" class="annotate-option">Inline</button></div><button class="js-btn-copy btn btn-sm tooltipped tooltipped-nw" aria-label="Copy YAML code to clipboard" data-clipboard="1173902677"><svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-copy" aria-hidden="true"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><pre hidden data-clipboard="1173902677"># name: Create and publish a Docker image # Configures this workflow to run every time a change is pushed to the branch called `release`. on: push: branches: ['release'] # Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds. env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} # There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu. jobs: build-and-push-image: runs-on: ubuntu-latest # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job. permissions: contents: read packages: write attestations: write id-token: write # steps: - name: Checkout repository uses: actions/checkout@v4 # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here. - name: Log in to the Container registry uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels. - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages. # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see [Usage](https://github.com/docker/build-push-action#usage) in the README of the `docker/build-push-action` repository. # It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step. - name: Build and push Docker image id: push uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4 with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} # This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see [Using artifact attestations to establish provenance for builds](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds). - name: Generate artifact attestation uses: actions/attest-build-provenance@v2 with: subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}} subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true </pre></header></div><div class="annotate-beside"><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">Create</span> <span class="hljs-string">and</span> <span class="hljs-string">publish</span> <span class="hljs-string">a</span> <span class="hljs-string">Docker</span> <span class="hljs-string">image</span></code></pre></div><div class="annotate-note"></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"><span class="hljs-attr">on:</span> <span class="hljs-attr">push:</span> <span class="hljs-attr">branches:</span> [<span class="hljs-string">'release'</span>]</code></pre></div><div class="annotate-note"><p>Configures this workflow to run every time a change is pushed to the branch called <code>release</code>.</p></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"><span class="hljs-attr">env:</span> <span class="hljs-attr">REGISTRY:</span> <span class="hljs-string">ghcr.io</span> <span class="hljs-attr">IMAGE_NAME:</span> <span class="hljs-string">${{</span> <span class="hljs-string">github.repository</span> <span class="hljs-string">}}</span></code></pre></div><div class="annotate-note"><p>Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.</p></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"><span class="hljs-attr">jobs:</span> <span class="hljs-attr">build-and-push-image:</span> <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span></code></pre></div><div class="annotate-note"><p>There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.</p></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> <span class="hljs-attr">permissions:</span> <span class="hljs-attr">contents:</span> <span class="hljs-string">read</span> <span class="hljs-attr">packages:</span> <span class="hljs-string">write</span> <span class="hljs-attr">attestations:</span> <span class="hljs-string">write</span> <span class="hljs-attr">id-token:</span> <span class="hljs-string">write</span></code></pre></div><div class="annotate-note"><p>Sets the permissions granted to the <code>GITHUB_TOKEN</code> for the actions in this job.</p></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> <span class="hljs-attr">steps:</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Checkout</span> <span class="hljs-string">repository</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span></code></pre></div><div class="annotate-note"></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Log</span> <span class="hljs-string">in</span> <span class="hljs-string">to</span> <span class="hljs-string">the</span> <span class="hljs-string">Container</span> <span class="hljs-string">registry</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1</span> <span class="hljs-attr">with:</span> <span class="hljs-attr">registry:</span> <span class="hljs-string">${{</span> <span class="hljs-string">env.REGISTRY</span> <span class="hljs-string">}}</span> <span class="hljs-attr">username:</span> <span class="hljs-string">${{</span> <span class="hljs-string">github.actor</span> <span class="hljs-string">}}</span> <span class="hljs-attr">password:</span> <span class="hljs-string">${{</span> <span class="hljs-string">secrets.GITHUB_TOKEN</span> <span class="hljs-string">}}</span></code></pre></div><div class="annotate-note"><p>Uses the <code>docker/login-action</code> action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.</p></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Extract</span> <span class="hljs-string">metadata</span> <span class="hljs-string">(tags,</span> <span class="hljs-string">labels)</span> <span class="hljs-string">for</span> <span class="hljs-string">Docker</span> <span class="hljs-attr">id:</span> <span class="hljs-string">meta</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7</span> <span class="hljs-attr">with:</span> <span class="hljs-attr">images:</span> <span class="hljs-string">${{</span> <span class="hljs-string">env.REGISTRY</span> <span class="hljs-string">}}/${{</span> <span class="hljs-string">env.IMAGE_NAME</span> <span class="hljs-string">}}</span></code></pre></div><div class="annotate-note"><p>This step uses <a href="https://github.com/docker/metadata-action#about">docker/metadata-action</a> to extract tags and labels that will be applied to the specified image. The <code>id</code> "meta" allows the output of this step to be referenced in a subsequent step. The <code>images</code> value provides the base name for the tags and labels.</p></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">and</span> <span class="hljs-string">push</span> <span class="hljs-string">Docker</span> <span class="hljs-string">image</span> <span class="hljs-attr">id:</span> <span class="hljs-string">push</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4</span> <span class="hljs-attr">with:</span> <span class="hljs-attr">context:</span> <span class="hljs-string">.</span> <span class="hljs-attr">push:</span> <span class="hljs-literal">true</span> <span class="hljs-attr">tags:</span> <span class="hljs-string">${{</span> <span class="hljs-string">steps.meta.outputs.tags</span> <span class="hljs-string">}}</span> <span class="hljs-attr">labels:</span> <span class="hljs-string">${{</span> <span class="hljs-string">steps.meta.outputs.labels</span> <span class="hljs-string">}}</span></code></pre></div><div class="annotate-note"><p>This step uses the <code>docker/build-push-action</code> action to build the image, based on your repository's <code>Dockerfile</code>. If the build succeeds, it pushes the image to GitHub Packages. It uses the <code>context</code> parameter to define the build's context as the set of files located in the specified path. For more information, see <a href="https://github.com/docker/build-push-action#usage">Usage</a> in the README of the <code>docker/build-push-action</code> repository. It uses the <code>tags</code> and <code>labels</code> parameters to tag and label the image with the output from the "meta" step.</p></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Generate</span> <span class="hljs-string">artifact</span> <span class="hljs-string">attestation</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/attest-build-provenance@v2</span> <span class="hljs-attr">with:</span> <span class="hljs-attr">subject-name:</span> <span class="hljs-string">${{</span> <span class="hljs-string">env.REGISTRY</span> <span class="hljs-string">}}/${{</span> <span class="hljs-string">env.IMAGE_NAME}}</span> <span class="hljs-attr">subject-digest:</span> <span class="hljs-string">${{</span> <span class="hljs-string">steps.push.outputs.digest</span> <span class="hljs-string">}}</span> <span class="hljs-attr">push-to-registry:</span> <span class="hljs-literal">true</span></code></pre></div><div class="annotate-note"><p>This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see <a href="/en/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds" _originalHref="/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds">Using artifact attestations to establish provenance for builds</a>.</p></div></div></div><div class="annotate-inline"><pre><code class="hljs language-yaml"><span class="hljs-comment">#</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Create</span> <span class="hljs-string">and</span> <span class="hljs-string">publish</span> <span class="hljs-string">a</span> <span class="hljs-string">Docker</span> <span class="hljs-string">image</span> <span class="hljs-comment"># Configures this workflow to run every time a change is pushed to the branch called `release`.</span> <span class="hljs-attr">on:</span> <span class="hljs-attr">push:</span> <span class="hljs-attr">branches:</span> [<span class="hljs-string">'release'</span>] <span class="hljs-comment"># Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.</span> <span class="hljs-attr">env:</span> <span class="hljs-attr">REGISTRY:</span> <span class="hljs-string">ghcr.io</span> <span class="hljs-attr">IMAGE_NAME:</span> <span class="hljs-string">${{</span> <span class="hljs-string">github.repository</span> <span class="hljs-string">}}</span> <span class="hljs-comment"># There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.</span> <span class="hljs-attr">jobs:</span> <span class="hljs-attr">build-and-push-image:</span> <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span> <span class="hljs-comment"># Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.</span> <span class="hljs-attr">permissions:</span> <span class="hljs-attr">contents:</span> <span class="hljs-string">read</span> <span class="hljs-attr">packages:</span> <span class="hljs-string">write</span> <span class="hljs-attr">attestations:</span> <span class="hljs-string">write</span> <span class="hljs-attr">id-token:</span> <span class="hljs-string">write</span> <span class="hljs-comment">#</span> <span class="hljs-attr">steps:</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Checkout</span> <span class="hljs-string">repository</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span> <span class="hljs-comment"># Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Log</span> <span class="hljs-string">in</span> <span class="hljs-string">to</span> <span class="hljs-string">the</span> <span class="hljs-string">Container</span> <span class="hljs-string">registry</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1</span> <span class="hljs-attr">with:</span> <span class="hljs-attr">registry:</span> <span class="hljs-string">${{</span> <span class="hljs-string">env.REGISTRY</span> <span class="hljs-string">}}</span> <span class="hljs-attr">username:</span> <span class="hljs-string">${{</span> <span class="hljs-string">github.actor</span> <span class="hljs-string">}}</span> <span class="hljs-attr">password:</span> <span class="hljs-string">${{</span> <span class="hljs-string">secrets.GITHUB_TOKEN</span> <span class="hljs-string">}}</span> <span class="hljs-comment"># This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Extract</span> <span class="hljs-string">metadata</span> <span class="hljs-string">(tags,</span> <span class="hljs-string">labels)</span> <span class="hljs-string">for</span> <span class="hljs-string">Docker</span> <span class="hljs-attr">id:</span> <span class="hljs-string">meta</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7</span> <span class="hljs-attr">with:</span> <span class="hljs-attr">images:</span> <span class="hljs-string">${{</span> <span class="hljs-string">env.REGISTRY</span> <span class="hljs-string">}}/${{</span> <span class="hljs-string">env.IMAGE_NAME</span> <span class="hljs-string">}}</span> <span class="hljs-comment"># This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.</span> <span class="hljs-comment"># It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see [Usage](https://github.com/docker/build-push-action#usage) in the README of the `docker/build-push-action` repository.</span> <span class="hljs-comment"># It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step.</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">and</span> <span class="hljs-string">push</span> <span class="hljs-string">Docker</span> <span class="hljs-string">image</span> <span class="hljs-attr">id:</span> <span class="hljs-string">push</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4</span> <span class="hljs-attr">with:</span> <span class="hljs-attr">context:</span> <span class="hljs-string">.</span> <span class="hljs-attr">push:</span> <span class="hljs-literal">true</span> <span class="hljs-attr">tags:</span> <span class="hljs-string">${{</span> <span class="hljs-string">steps.meta.outputs.tags</span> <span class="hljs-string">}}</span> <span class="hljs-attr">labels:</span> <span class="hljs-string">${{</span> <span class="hljs-string">steps.meta.outputs.labels</span> <span class="hljs-string">}}</span> <span class="hljs-comment"># This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see [Using artifact attestations to establish provenance for builds](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Generate</span> <span class="hljs-string">artifact</span> <span class="hljs-string">attestation</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/attest-build-provenance@v2</span> <span class="hljs-attr">with:</span> <span class="hljs-attr">subject-name:</span> <span class="hljs-string">${{</span> <span class="hljs-string">env.REGISTRY</span> <span class="hljs-string">}}/${{</span> <span class="hljs-string">env.IMAGE_NAME}}</span> <span class="hljs-attr">subject-digest:</span> <span class="hljs-string">${{</span> <span class="hljs-string">steps.push.outputs.digest</span> <span class="hljs-string">}}</span> <span class="hljs-attr">push-to-registry:</span> <span class="hljs-literal">true</span> </code></pre></div></div> <p>This new workflow will run automatically every time you push a change to a branch named <code>release</code> in the repository. You can view the progress in the <strong>Actions</strong> tab.</p> <p>A few minutes after the workflow has completed, the new package will be visible in your repository. To find your available packages, see <a href="/en/packages/learn-github-packages/viewing-packages#viewing-a-repositorys-packages" _originalHref="/packages/learn-github-packages/viewing-packages#viewing-a-repositorys-packages">Viewing packages</a>.</p> <h2 id="installing-a-package-using-an-action" tabindex="-1"><a class="heading-link" href="#installing-a-package-using-an-action">Installing a package using an action<span class="heading-link-symbol" aria-hidden="true"></span></a></h2> <p>You can install packages as part of your CI flow using GitHub Actions. For example, you could configure a workflow so that anytime a developer pushes code to a pull request, the workflow resolves dependencies by downloading and installing packages hosted by GitHub Packages. Then, the workflow can run CI tests that require the dependencies.</p> <p>Installing packages hosted by GitHub Packages through GitHub Actions requires minimal configuration or additional authentication when you use the <code>GITHUB_TOKEN</code>. Data transfer is also free when an action installs a package. For more information, see <a href="/en/billing/managing-billing-for-github-packages/about-billing-for-github-packages" _originalHref="/billing/managing-billing-for-github-packages/about-billing-for-github-packages">About billing for GitHub Packages</a>.</p> <p>Configuration steps vary by package client. For general information about configuring a workflow for GitHub Actions, see <a href="/en/actions/using-workflows" _originalHref="/actions/using-workflows">Writing workflows</a>.</p> <h2 id="upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token" tabindex="-1"><a class="heading-link" href="#upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token">Upgrading a workflow that accesses a registry using a personal access token<span class="heading-link-symbol" aria-hidden="true"></span></a></h2> <p>GitHub Packages supports the <code>GITHUB_TOKEN</code> for easy and secure authentication in your workflows. If you're using a registry that supports granular permissions, and your workflow is using a personal access token to authenticate to the registry, then we highly recommend you update your workflow to use the <code>GITHUB_TOKEN</code>.</p> <p>For more information about the <code>GITHUB_TOKEN</code>, see <a href="/en/actions/security-guides/automatic-token-authentication#using-the-github_token-in-a-workflow" _originalHref="/actions/security-guides/automatic-token-authentication#using-the-github_token-in-a-workflow">Automatic token authentication</a>.</p> <p>Using the <code>GITHUB_TOKEN</code>, instead of a personal access token (classic) with the <code>repo</code> scope, increases the security of your repository as you don't need to use a long-lived personal access token that offers unnecessary access to the repository where your workflow is run. For more information about security best practices, see <a href="/en/actions/security-guides/security-hardening-for-github-actions#using-secrets" _originalHref="/actions/security-guides/security-hardening-for-github-actions#using-secrets">Security hardening for GitHub Actions</a>.</p> <ol> <li> <p>Navigate to your package landing page.</p> </li> <li> <p>To ensure your package has access to your workflow, you must add the repository where the workflow is stored to your package. Under "Manage Actions access", click <strong>Add repository</strong> and search for the repository you want to add. <div class="procedural-image-wrapper"><picture><source srcset="/assets/cb-57116/mw-1440/images/help/package-registry/add-repository-button.webp 2x" type="image/webp"><img src="/assets/cb-57116/images/help/package-registry/add-repository-button.png" alt="Screenshot of the "Manage Actions access" section of the package settings page. The "Add repository" button is highlighted with an orange outline."></picture></div></p> <div class="ghd-alert ghd-alert-accent"><p class="ghd-alert-title"><svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon mr-2" aria-hidden><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg>Note</p> <p> Adding a repository to your package by using the <strong>Add Repository</strong> button under "Manage Actions access" in the package's settings is different than connecting your package to a repository. For more information, see <a href="/en/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility#ensuring-workflow-access-to-your-package" _originalHref="/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility#ensuring-workflow-access-to-your-package">Configuring a package's access control and visibility</a> and <a href="/en/packages/learn-github-packages/connecting-a-repository-to-a-package" _originalHref="/packages/learn-github-packages/connecting-a-repository-to-a-package">Connecting a repository to a package</a>.</p> </div> </li> <li> <p>Optionally, use the <strong>Role</strong> drop-down menu to select the default access level that you'd like the repository to have to your package.</p> </li> <li> <p>Open your workflow file. On the line where you log in to the registry, replace your personal access token with <code>${{ secrets.GITHUB_TOKEN }}</code>.</p> </li> </ol> <p>For example, this workflow publishes a Docker image to the Container registry and uses <code>${{ secrets.GITHUB_TOKEN }}</code> to authenticate. For more information, see <a href="https://docs.docker.com/docker-hub/builds/">Set up Automated Builds</a> in the Docker documentation.</p> <div class="annotate beside"><div class="annotate-header"><header class="d-flex flex-items-center flex-justify-between p-2 text-small rounded-top-1 border-top border-left border-right"><span class="flex-1">YAML</span><div class="annotate-toggle"><button name="annotate-display" value="beside" type="button" class="annotate-option">Beside</button><button name="annotate-display" value="inline" type="button" class="annotate-option">Inline</button></div><button class="js-btn-copy btn btn-sm tooltipped tooltipped-nw" aria-label="Copy YAML code to clipboard" data-clipboard="3679327733"><svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-copy" aria-hidden="true"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><pre hidden data-clipboard="3679327733"># name: Demo Push # This workflow runs when any of the following occur: # - A push is made to a branch called `main` or `seed` # - A tag starting with "v" is created # - A pull request is created or updated on: push: branches: - main - seed tags: - v* pull_request: # This creates an environment variable called `IMAGE_NAME ` with the value `ghtoken_product_demo`. env: IMAGE_NAME: ghtoken_product_demo # jobs: # This pushes the image to GitHub Packages. push: runs-on: ubuntu-latest permissions: packages: write contents: read # steps: - uses: actions/checkout@v4 - name: Build image run: docker build . --file Dockerfile --tag $IMAGE_NAME --label "runnumber=${GITHUB_RUN_ID}" - name: Log in to registry run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin # - name: Push image run: | IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME # This changes all uppercase characters to lowercase. IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') # This strips the git ref prefix from the version. VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,') # This strips the "v" prefix from the tag name. [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//') # This uses the Docker `latest` tag convention. [ "$VERSION" == "main" ] && VERSION=latest echo IMAGE_ID=$IMAGE_ID echo VERSION=$VERSION docker tag $IMAGE_NAME $IMAGE_ID:$VERSION docker push $IMAGE_ID:$VERSION </pre></header></div><div class="annotate-beside"><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">Demo</span> <span class="hljs-string">Push</span></code></pre></div><div class="annotate-note"></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"><span class="hljs-attr">on:</span> <span class="hljs-attr">push:</span> <span class="hljs-attr">branches:</span> <span class="hljs-bullet">-</span> <span class="hljs-string">main</span> <span class="hljs-bullet">-</span> <span class="hljs-string">seed</span> <span class="hljs-attr">tags:</span> <span class="hljs-bullet">-</span> <span class="hljs-string">v*</span> <span class="hljs-attr">pull_request:</span></code></pre></div><div class="annotate-note"><p>This workflow runs when any of the following occur:</p> <ul> <li>A push is made to a branch called <code>main</code> or <code>seed</code></li> <li>A tag starting with "v" is created</li> <li>A pull request is created or updated</li> </ul></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"><span class="hljs-attr">env:</span> <span class="hljs-attr">IMAGE_NAME:</span> <span class="hljs-string">ghtoken_product_demo</span></code></pre></div><div class="annotate-note"><p>This creates an environment variable called <code>IMAGE_NAME </code> with the value <code>ghtoken_product_demo</code>.</p></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"><span class="hljs-attr">jobs:</span></code></pre></div><div class="annotate-note"></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> <span class="hljs-attr">push:</span> <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span> <span class="hljs-attr">permissions:</span> <span class="hljs-attr">packages:</span> <span class="hljs-string">write</span> <span class="hljs-attr">contents:</span> <span class="hljs-string">read</span></code></pre></div><div class="annotate-note"><p>This pushes the image to GitHub Packages.</p></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> <span class="hljs-attr">steps:</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">image</span> <span class="hljs-attr">run:</span> <span class="hljs-string">docker</span> <span class="hljs-string">build</span> <span class="hljs-string">.</span> <span class="hljs-string">--file</span> <span class="hljs-string">Dockerfile</span> <span class="hljs-string">--tag</span> <span class="hljs-string">$IMAGE_NAME</span> <span class="hljs-string">--label</span> <span class="hljs-string">"runnumber=${GITHUB_RUN_ID}"</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Log</span> <span class="hljs-string">in</span> <span class="hljs-string">to</span> <span class="hljs-string">registry</span> <span class="hljs-attr">run:</span> <span class="hljs-string">echo</span> <span class="hljs-string">"$<span class="hljs-template-variable">{{ secrets.GITHUB_TOKEN }}</span>"</span> <span class="hljs-string">|</span> <span class="hljs-string">docker</span> <span class="hljs-string">login</span> <span class="hljs-string">ghcr.io</span> <span class="hljs-string">-u</span> <span class="hljs-string">${{</span> <span class="hljs-string">github.actor</span> <span class="hljs-string">}}</span> <span class="hljs-string">--password-stdin</span></code></pre></div><div class="annotate-note"></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Push</span> <span class="hljs-string">image</span> <span class="hljs-attr">run:</span> <span class="hljs-string">|</span> <span class="hljs-string">IMAGE_ID=ghcr.io/${{</span> <span class="hljs-string">github.repository_owner</span> <span class="hljs-string">}}/$IMAGE_NAME</span></code></pre></div><div class="annotate-note"></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> <span class="hljs-string">IMAGE_ID=$(echo</span> <span class="hljs-string">$IMAGE_ID</span> <span class="hljs-string">|</span> <span class="hljs-string">tr</span> <span class="hljs-string">'[A-Z]'</span> <span class="hljs-string">'[a-z]'</span><span class="hljs-string">)</span></code></pre></div><div class="annotate-note"><p>This changes all uppercase characters to lowercase.</p></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> <span class="hljs-string">VERSION=$(echo</span> <span class="hljs-string">"$<span class="hljs-template-variable">{{ github.ref }}</span>"</span> <span class="hljs-string">|</span> <span class="hljs-string">sed</span> <span class="hljs-string">-e</span> <span class="hljs-string">'s,.*/\(.*\),\1,'</span><span class="hljs-string">)</span></code></pre></div><div class="annotate-note"><p>This strips the git ref prefix from the version.</p></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> [[ <span class="hljs-string">"$<span class="hljs-template-variable">{{ github.ref }}</span>"</span> <span class="hljs-string">==</span> <span class="hljs-string">"refs/tags/"</span><span class="hljs-string">*</span> ]] <span class="hljs-string">&&</span> <span class="hljs-string">VERSION=$(echo</span> <span class="hljs-string">$VERSION</span> <span class="hljs-string">|</span> <span class="hljs-string">sed</span> <span class="hljs-string">-e</span> <span class="hljs-string">'s/^v//'</span><span class="hljs-string">)</span></code></pre></div><div class="annotate-note"><p>This strips the "v" prefix from the tag name.</p></div></div><div class="annotate-row"><div class="annotate-code"><pre><code class="hljs language-yaml"> [ <span class="hljs-string">"$VERSION"</span> <span class="hljs-string">==</span> <span class="hljs-string">"main"</span> ] <span class="hljs-string">&&</span> <span class="hljs-string">VERSION=latest</span> <span class="hljs-string">echo</span> <span class="hljs-string">IMAGE_ID=$IMAGE_ID</span> <span class="hljs-string">echo</span> <span class="hljs-string">VERSION=$VERSION</span> <span class="hljs-string">docker</span> <span class="hljs-string">tag</span> <span class="hljs-string">$IMAGE_NAME</span> <span class="hljs-string">$IMAGE_ID:$VERSION</span> <span class="hljs-string">docker</span> <span class="hljs-string">push</span> <span class="hljs-string">$IMAGE_ID:$VERSION</span></code></pre></div><div class="annotate-note"><p>This uses the Docker <code>latest</code> tag convention.</p></div></div></div><div class="annotate-inline"><pre><code class="hljs language-yaml"><span class="hljs-comment">#</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Demo</span> <span class="hljs-string">Push</span> <span class="hljs-comment"># This workflow runs when any of the following occur:</span> <span class="hljs-comment"># - A push is made to a branch called `main` or `seed`</span> <span class="hljs-comment"># - A tag starting with "v" is created</span> <span class="hljs-comment"># - A pull request is created or updated</span> <span class="hljs-attr">on:</span> <span class="hljs-attr">push:</span> <span class="hljs-attr">branches:</span> <span class="hljs-bullet">-</span> <span class="hljs-string">main</span> <span class="hljs-bullet">-</span> <span class="hljs-string">seed</span> <span class="hljs-attr">tags:</span> <span class="hljs-bullet">-</span> <span class="hljs-string">v*</span> <span class="hljs-attr">pull_request:</span> <span class="hljs-comment"># This creates an environment variable called `IMAGE_NAME ` with the value `ghtoken_product_demo`.</span> <span class="hljs-attr">env:</span> <span class="hljs-attr">IMAGE_NAME:</span> <span class="hljs-string">ghtoken_product_demo</span> <span class="hljs-comment">#</span> <span class="hljs-attr">jobs:</span> <span class="hljs-comment"># This pushes the image to GitHub Packages.</span> <span class="hljs-attr">push:</span> <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span> <span class="hljs-attr">permissions:</span> <span class="hljs-attr">packages:</span> <span class="hljs-string">write</span> <span class="hljs-attr">contents:</span> <span class="hljs-string">read</span> <span class="hljs-comment">#</span> <span class="hljs-attr">steps:</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">image</span> <span class="hljs-attr">run:</span> <span class="hljs-string">docker</span> <span class="hljs-string">build</span> <span class="hljs-string">.</span> <span class="hljs-string">--file</span> <span class="hljs-string">Dockerfile</span> <span class="hljs-string">--tag</span> <span class="hljs-string">$IMAGE_NAME</span> <span class="hljs-string">--label</span> <span class="hljs-string">"runnumber=${GITHUB_RUN_ID}"</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Log</span> <span class="hljs-string">in</span> <span class="hljs-string">to</span> <span class="hljs-string">registry</span> <span class="hljs-attr">run:</span> <span class="hljs-string">echo</span> <span class="hljs-string">"$<span class="hljs-template-variable">{{ secrets.GITHUB_TOKEN }}</span>"</span> <span class="hljs-string">|</span> <span class="hljs-string">docker</span> <span class="hljs-string">login</span> <span class="hljs-string">ghcr.io</span> <span class="hljs-string">-u</span> <span class="hljs-string">${{</span> <span class="hljs-string">github.actor</span> <span class="hljs-string">}}</span> <span class="hljs-string">--password-stdin</span> <span class="hljs-comment">#</span> <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Push</span> <span class="hljs-string">image</span> <span class="hljs-attr">run:</span> <span class="hljs-string">| IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME </span> <span class="hljs-comment"># This changes all uppercase characters to lowercase.</span> <span class="hljs-string">IMAGE_ID=$(echo</span> <span class="hljs-string">$IMAGE_ID</span> <span class="hljs-string">|</span> <span class="hljs-string">tr</span> <span class="hljs-string">'[A-Z]'</span> <span class="hljs-string">'[a-z]'</span><span class="hljs-string">)</span> <span class="hljs-comment"># This strips the git ref prefix from the version.</span> <span class="hljs-string">VERSION=$(echo</span> <span class="hljs-string">"$<span class="hljs-template-variable">{{ github.ref }}</span>"</span> <span class="hljs-string">|</span> <span class="hljs-string">sed</span> <span class="hljs-string">-e</span> <span class="hljs-string">'s,.*/\(.*\),\1,'</span><span class="hljs-string">)</span> <span class="hljs-comment"># This strips the "v" prefix from the tag name.</span> [[ <span class="hljs-string">"$<span class="hljs-template-variable">{{ github.ref }}</span>"</span> <span class="hljs-string">==</span> <span class="hljs-string">"refs/tags/"</span><span class="hljs-string">*</span> ]] <span class="hljs-string">&&</span> <span class="hljs-string">VERSION=$(echo</span> <span class="hljs-string">$VERSION</span> <span class="hljs-string">|</span> <span class="hljs-string">sed</span> <span class="hljs-string">-e</span> <span class="hljs-string">'s/^v//'</span><span class="hljs-string">)</span> <span class="hljs-comment"># This uses the Docker `latest` tag convention.</span> [ <span class="hljs-string">"$VERSION"</span> <span class="hljs-string">==</span> <span class="hljs-string">"main"</span> ] <span class="hljs-string">&&</span> <span class="hljs-string">VERSION=latest</span> <span class="hljs-string">echo</span> <span class="hljs-string">IMAGE_ID=$IMAGE_ID</span> <span class="hljs-string">echo</span> <span class="hljs-string">VERSION=$VERSION</span> <span class="hljs-string">docker</span> <span class="hljs-string">tag</span> <span class="hljs-string">$IMAGE_NAME</span> <span class="hljs-string">$IMAGE_ID:$VERSION</span> <span class="hljs-string">docker</span> <span class="hljs-string">push</span> <span class="hljs-string">$IMAGE_ID:$VERSION</span> </code></pre></div></div></div></div></div></div></div></main><footer data-container="footer"><section class="container-xl mt-lg-8 mt-6 px-3 px-md-6 no-print mx-auto"><h2 class="f3">Help and support</h2><div class="container-xl mx-auto py-6 py-lg-6 clearfix border-top border-color-secondary"><div class="float-left pr-4 mb-6 mb-xl-0 col-12 col-lg-6 col-xl-3"><form class="f5" data-testid="survey-form" aria-live="polite"><h3 id="survey-title" class="f4 mb-3">Did you find what you needed?</h3><input type="text" class="d-none" name="survey-token" value=""/><div class="mb-2" role="radiogroup" aria-labelledby="survey-title"><input class="Survey_visuallyHidden__Xh_nl Survey_customRadio__aNqUl" id="survey-yes" type="radio" name="survey-vote" aria-label="Yes" value="Y"/><label class="btn mr-1" for="survey-yes"><svg aria-hidden="true" focusable="false" class="octicon octicon-thumbsup color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8.347.631A.75.75 0 0 1 9.123.26l.238.04a3.25 3.25 0 0 1 2.591 4.098L11.494 6h.665a3.25 3.25 0 0 1 3.118 4.167l-1.135 3.859A2.751 2.751 0 0 1 11.503 16H6.586a3.75 3.75 0 0 1-2.184-.702A1.75 1.75 0 0 1 3 16H1.75A1.75 1.75 0 0 1 0 14.25v-6.5C0 6.784.784 6 1.75 6h3.417a.25.25 0 0 0 .217-.127ZM4.75 13.649l.396.33c.404.337.914.521 1.44.521h4.917a1.25 1.25 0 0 0 1.2-.897l1.135-3.859A1.75 1.75 0 0 0 12.159 7.5H10.5a.75.75 0 0 1-.721-.956l.731-2.558a1.75 1.75 0 0 0-1.127-2.14L6.69 6.611a1.75 1.75 0 0 1-1.523.889H4.75ZM3.25 7.5h-1.5a.25.25 0 0 0-.25.25v6.5c0 .138.112.25.25.25H3a.25.25 0 0 0 .25-.25Z"></path></svg> <!-- -->Yes</label><input class="Survey_visuallyHidden__Xh_nl Survey_customRadio__aNqUl" id="survey-no" type="radio" name="survey-vote" aria-label="No" value="N"/><label class="btn" for="survey-no"><svg aria-hidden="true" focusable="false" class="octicon octicon-thumbsdown color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.653 15.369a.75.75 0 0 1-.776.371l-.238-.04a3.25 3.25 0 0 1-2.591-4.099L4.506 10h-.665A3.25 3.25 0 0 1 .723 5.833l1.135-3.859A2.75 2.75 0 0 1 4.482 0H9.43c.78.003 1.538.25 2.168.702A1.752 1.752 0 0 1 12.989 0h1.272A1.75 1.75 0 0 1 16 1.75v6.5A1.75 1.75 0 0 1 14.25 10h-3.417a.25.25 0 0 0-.217.127ZM11.25 2.351l-.396-.33a2.248 2.248 0 0 0-1.44-.521H4.496a1.25 1.25 0 0 0-1.199.897L2.162 6.256A1.75 1.75 0 0 0 3.841 8.5H5.5a.75.75 0 0 1 .721.956l-.731 2.558a1.75 1.75 0 0 0 1.127 2.14L9.31 9.389a1.75 1.75 0 0 1 1.523-.889h.417Zm1.5 6.149h1.5a.25.25 0 0 0 .25-.25v-6.5a.25.25 0 0 0-.25-.25H13a.25.25 0 0 0-.25.25Z"></path></svg> <!-- -->No</label></div><a rel="" class="f6 text-underline" target="_blank" href="/en/site-policy/privacy-policies/github-privacy-statement">Privacy policy</a></form></div><div class="float-left pr-4 mb-6 mb-xl-0 col-12 col-lg-6 col-xl-4 offset-xl-1"><div class="f5 contribution"><h3 class="f4 mb-3">Help us make these docs great!</h3><p class="max-w-xs color-fg-muted mb-3">All GitHub docs are open source. See something that's wrong or unclear? Submit a pull request.</p><a class="btn" href="https://github.com/github/docs/blob/main/content/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions.md"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-pull-request octicon mr-1" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path></svg>Make a contribution</a><p class="color-fg-muted f6 mt-2"><a class="text-underline" href="/contributing" target="_blank" rel="noopener">Learn how to contribute</a></p></div></div><div class="float-left pr-4 mb-6 mb-xl-0 col-12 col-lg-6 col-xl-3 offset-xl-1"><div><h3 class="mb-3 f4">Still need help?</h3><div class="mb-2"><a id="ask-community" href="https://github.com/orgs/community/discussions" class="text-underline"><svg aria-hidden="true" focusable="false" class="octicon octicon-people octicon mr-1" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path></svg>Ask the GitHub community</a></div><div><a id="support" href="https://support.github.com" class="text-underline"><svg aria-hidden="true" focusable="false" class="octicon octicon-comment-discussion octicon mr-1" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path></svg>Contact support</a></div></div></div></div></section><section class="container-xl px-3 mt-6 pb-8 px-md-6 color-fg-muted"><h2 class="f4 mb-2 col-12">Legal</h2><ul class="d-flex flex-wrap list-style-none"><li class="mr-3">© <!-- -->2025<!-- --> GitHub, Inc.</li><li class="mr-3"><a class="text-underline" href="/en/site-policy/github-terms/github-terms-of-service">Terms</a></li><li class="mr-3"><a class="text-underline" href="/en/site-policy/privacy-policies/github-privacy-statement">Privacy</a></li><li class="mr-3"><a class="text-underline" href="https://www.githubstatus.com/">Status</a></li><li class="mr-3"><a class="text-underline" href="https://github.com/pricing">Pricing</a></li><li class="mr-3"><a class="text-underline" href="https://services.github.com">Expert services</a></li><li class="mr-3"><a class="text-underline" href="https://github.blog">Blog</a></li></ul></section><div role="tooltip" class="position-fixed bottom-0 mb-4 right-0 mr-4 z-1 ScrollButton_transition200__rLxBo ScrollButton_opacity0__vjKQD"><button class="ghd-scroll-to-top tooltipped tooltipped-n tooltipped-no-delay btn circle border-1 d-flex flex-items-center flex-justify-center ScrollButton_customFocus__L3FsX" style="width:40px;height:40px" aria-label="Scroll to top"><svg aria-hidden="true" focusable="false" class="octicon octicon-chevron-up" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.22 10.53a.749.749 0 0 1 0-1.06l4.25-4.25a.749.749 0 0 1 1.06 0l4.25 4.25a.749.749 0 1 1-1.06 1.06L8 6.811 4.28 10.53a.749.749 0 0 1-1.06 0Z"></path></svg></button></div></footer></div></div><script type="application/json" id="__PRIMER_DATA_:R16:__">{"resolvedServerColorMode":"day"}</script></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"mainContext":{"breadcrumbs":[{"href":"/en/packages","title":"GitHub Packages"},{"href":"/en/packages/managing-github-packages-using-github-actions-workflows","title":"Managing GitHub packages with workflows"},{"href":"/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions","title":"Publish \u0026 install with Actions"}],"communityRedirect":{},"currentProduct":{"id":"packages","name":"{% data variables.product.prodname_registry %}","href":"/packages","dir":"content/packages","toc":"content/packages/index.md","wip":false,"hidden":false,"versions":["free-pro-team@latest","enterprise-cloud@latest","enterprise-server@3.15","enterprise-server@3.14","enterprise-server@3.13","enterprise-server@3.12","enterprise-server@3.11","enterprise-server@3.10"]},"currentProductName":"GitHub Packages","isHomepageVersion":false,"error":"","data":{"ui":{"alerts":{"NOTE":"Note","IMPORTANT":"Important","WARNING":"Warning","TIP":"Tip","CAUTION":"Caution"},"header":{"github_docs":"GitHub Docs","contact":"Contact","notices":{"release_candidate":" is currently available as a \u003ca href=\"/admin/overview/about-upgrades-to-new-releases\"\u003erelease candidate\u003c/a\u003e.","early_access":"📣 Please \u003cb\u003edo not share\u003c/b\u003e this URL publicly. This page contains content about a private preview feature.","release_notes_use_latest":"Please use the latest release for the latest security, performance, and bug fixes.","ghes_release_notes_upgrade_patch_only":"📣 This is not the \u003ca href=\"#{{ latestPatch }}\"\u003elatest patch release\u003c/a\u003e of Enterprise Server.","ghes_release_notes_upgrade_release_only":"📣 This is not the \u003ca href=\"/enterprise-server@{{ latestRelease }}/admin/release-notes\"\u003elatest release\u003c/a\u003e of Enterprise Server.","ghes_release_notes_upgrade_patch_and_release":"📣 This is not the \u003ca href=\"#{{ latestPatch }}\"\u003elatest patch release\u003c/a\u003e of this release series, and this is not the \u003ca href=\"/enterprise-server@{{ latestRelease }}/admin/release-notes\"\u003elatest release\u003c/a\u003e of Enterprise Server."},"sign_up_cta":"Sign up","menu":"Menu","open_menu_label":"Open menu","go_home":"Home"},"search":{"input":{"aria_label":"Open search overlay","placeholder":"Search or ask Copilot"},"overlay":{"input_aria_label":"Search or ask Copilot","suggestions_list_aria_label":"Search suggestions","ai_suggestions_list_aria_label":"Copilot search suggestions","general_suggestions_list_aria_label":"Docs search suggestions","general_suggestions_list_heading":"Search docs","ai_autocomplete_list_heading":"Ask Copilot","give_feedback":"Give feedback","beta_tag":"Beta","return_to_search":"Return to search","clear_search_query":"Clear"},"ai":{"disclaimer":"Copilot uses AI. Check for mistakes by reviewing the links in the response.","references":"References from these articles","loading_status_message":"Loading Copilot response...","done_loading_status_message":"Done loading Copilot response","unable_to_answer":"Sorry, I'm unable to answer that question. Please try a different query.","copy_answer":"Copy answer","copied_announcement":"Copied!","thumbs_up":"This answer was helpful","thumbs_down":"This answer was not helpful","thumbs_announcement":"Thank you for your feedback!"},"failure":{"autocomplete_title":"There was an error loading autocomplete results.","ai_title":"There was an error loading the AI assistant.","description":"You can still use this field to search our docs."}},"old_search":{"description":"Enter a search term to find it in the GitHub Docs.","placeholder":"Search GitHub Docs","label":"Search GitHub Docs"},"survey":{"able_to_find":"Did you find what you needed?","yes":"Yes","no":"No","cancel":"Cancel","additional_feedback":"Can you tell us more about your rating? (Optional)","optional":"Optional","required":"Required","email_label":"Leave your email if we can contact you. (Optional)","email_validation":"Please enter a valid email address","send":"Send","feedback":"Thank you! We received your feedback.","not_support":"If you need a reply, please contact \u003ca href=\"https://support.github.com/\"\u003esupport\u003c/a\u003e.","privacy_policy":"Privacy policy","server_error":"Unable to process comment at the moment. Please try again."},"toc":{"getting_started":"Getting started","popular":"Popular","startHere":"Start here","whats_new":"What's new","videos":"Videos","all_changelogs":"All changelog posts"},"meta":{"default_description":"Get started, troubleshoot, and make the most of GitHub. Documentation for new users, developers, administrators, and all of GitHub's products."},"scroll_button":{"scroll_to_top":"Scroll to top"},"pages":{"article_version":"Article version","miniToc":"In this article","all_enterprise_releases":"All Enterprise Server releases","about_versions":"About versions","permissions_callout_title":"Who can use this feature?","video_from_transcript":"See video for this transcript"},"picker":{"language_picker_label":"Language","product_picker_default_text":"All products","version_picker_default_text":"Choose a version"},"footer":{"support_heading":"Help and support","legal_heading":"Legal","imprint":"Imprint","terms":"Terms","privacy":"Privacy","status":"Status","pricing":"Pricing","expert_services":"Expert services","blog":"Blog"},"contribution_cta":{"title":"Help us make these docs great!","body":"All GitHub docs are open source. See something that's wrong or unclear? Submit a pull request.","button":"Make a contribution","to_guidelines":"Learn how to contribute"},"support":{"still_need_help":"Still need help?","contact_support":"Contact support","ask_community":"Ask the GitHub community"},"rest":{"banner":{"api_versioned":"The REST API is now versioned.","api_version_info":"For more information, see \"\u003ca href=\"{{ versionWithApiVersion }}/rest/overview/api-versions\"\u003eAbout API versioning\u003c/a\u003e.\"","ghes_api_versioned":"After a site administrator upgrades your Enterprise Server instance to {{ firstGhesReleaseWithApiVersions.versionTitle }} or later, the REST API will be versioned. To learn how to find your instance's version, see \"\u003ca href=\"/{{ currentVersion }}/get-started/learning-about-github/about-versions-of-github-docs#github-enterprise-server\"\u003eAbout versions of GitHub Docs\u003c/a\u003e\".","redirect_notice":"We've recently moved some of the REST API documentation.","redirect_repo":"If you can't find what you're looking for, you might try the new {{ newRestPagesLinks }} REST API pages.","redirect_enterprise":"If you can't find what you're looking for, you might try the {{ actionsPageLink }} REST API page.","actions_api_title":"Actions"},"versioning":{"about_versions":"About REST API versions"},"overview":{"permissions":{"access":"Access","endpoints":"Endpoint","tokens":"Token types","additionalPermissions":"Additional permissions","uat":"UAT","iat":"IAT"}},"screen_reader_text_checkmark_icon":"Multiple permissions are required, or a different permission may be used. For more information about the permissions, see the documentation for this endpoint."},"domain_edit":{"name":"Domain name","edit":"Edit","edit_your":"Edit your domain name","experimental":"Experimental","your_name":"Your domain name","cancel":"Cancel","save":"Save","snippet_about":"Updating will include the new domain name in all code snippets across GitHub Docs.","learn_more":"Learn more","submission_failed":"Submission failed. Please try again in a minute."},"cookbook_landing":{"spotlight":"Spotlight","explore_articles":"Explore {{ number }} prompt articles","reset_filters":"Reset filters","search_articles":"Search articles","category":"Category","complexity":"Complexity"},"popovers":{"role_description":"hovercard link"}},"reusables":{},"variables":{"release_candidate":{"version":null}}},"currentCategory":"managing-github-packages-using-github-actions-workflows","currentPathWithoutLanguage":"/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions","page":{"documentType":"article","type":null,"title":"Publishing and installing a package with GitHub Actions","fullTitle":"Publishing and installing a package with GitHub Actions - GitHub Docs","topics":[],"introPlainText":"You can configure a workflow in GitHub Actions to automatically publish or install a package from GitHub Packages.","applicableVersions":["free-pro-team@latest","enterprise-cloud@latest","enterprise-server@3.15","enterprise-server@3.14","enterprise-server@3.13","enterprise-server@3.12","enterprise-server@3.11","enterprise-server@3.10"],"hidden":false,"noEarlyAccessBanner":false},"enterpriseServerReleases":{"isOldestReleaseDeprecated":true,"oldestSupported":"3.10","nextDeprecationDate":"2024-09-25","supported":["3.15","3.14","3.13","3.12","3.11","3.10"]},"enterpriseServerVersions":["enterprise-server@3.15","enterprise-server@3.14","enterprise-server@3.13","enterprise-server@3.12","enterprise-server@3.11","enterprise-server@3.10"],"allVersions":{"free-pro-team@latest":{"version":"free-pro-team@latest","versionTitle":"Free, Pro, \u0026 Team","apiVersions":["2022-11-28"],"latestApiVersion":"2022-11-28"},"enterprise-cloud@latest":{"version":"enterprise-cloud@latest","versionTitle":"Enterprise Cloud","apiVersions":["2022-11-28"],"latestApiVersion":"2022-11-28"},"enterprise-server@3.15":{"version":"enterprise-server@3.15","versionTitle":"Enterprise Server 3.15","apiVersions":["2022-11-28"],"latestApiVersion":"2022-11-28","isGHES":true},"enterprise-server@3.14":{"version":"enterprise-server@3.14","versionTitle":"Enterprise Server 3.14","apiVersions":["2022-11-28"],"latestApiVersion":"2022-11-28","isGHES":true},"enterprise-server@3.13":{"version":"enterprise-server@3.13","versionTitle":"Enterprise Server 3.13","apiVersions":["2022-11-28"],"latestApiVersion":"2022-11-28","isGHES":true},"enterprise-server@3.12":{"version":"enterprise-server@3.12","versionTitle":"Enterprise Server 3.12","apiVersions":["2022-11-28"],"latestApiVersion":"2022-11-28","isGHES":true},"enterprise-server@3.11":{"version":"enterprise-server@3.11","versionTitle":"Enterprise Server 3.11","apiVersions":["2022-11-28"],"latestApiVersion":"2022-11-28","isGHES":true},"enterprise-server@3.10":{"version":"enterprise-server@3.10","versionTitle":"Enterprise Server 3.10","apiVersions":["2022-11-28"],"latestApiVersion":"2022-11-28","isGHES":true}},"currentVersion":"free-pro-team@latest","currentProductTree":null,"sidebarTree":{"href":"/en/packages","title":"GitHub Packages","childPages":[{"href":"/en/packages/quickstart","title":"Quickstart","childPages":[]},{"href":"/en/packages/learn-github-packages","title":"Learn GitHub Packages","childPages":[{"href":"/en/packages/learn-github-packages/introduction-to-github-packages","title":"Introduction","childPages":[]},{"href":"/en/packages/learn-github-packages/about-permissions-for-github-packages","title":"About permissions","childPages":[]},{"href":"/en/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility","title":"Access control \u0026 visibility","childPages":[]},{"href":"/en/packages/learn-github-packages/connecting-a-repository-to-a-package","title":"Connect a repository","childPages":[]},{"href":"/en/packages/learn-github-packages/publishing-a-package","title":"Publishing a package","childPages":[]},{"href":"/en/packages/learn-github-packages/viewing-packages","title":"Viewing packages","childPages":[]},{"href":"/en/packages/learn-github-packages/installing-a-package","title":"Installing a package","childPages":[]},{"href":"/en/packages/learn-github-packages/deleting-and-restoring-a-package","title":"Delete \u0026 restore a package","childPages":[]}]},{"href":"/en/packages/working-with-a-github-packages-registry","title":"Working with a GitHub Packages registry","childPages":[{"href":"/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry","title":"Container registry","childPages":[]},{"href":"/en/packages/working-with-a-github-packages-registry/working-with-the-docker-registry","title":"Docker registry","childPages":[]},{"href":"/en/packages/working-with-a-github-packages-registry/working-with-the-rubygems-registry","title":"RubyGems registry","childPages":[]},{"href":"/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry","title":"npm registry","childPages":[]},{"href":"/en/packages/working-with-a-github-packages-registry/working-with-the-apache-maven-registry","title":"Apache Maven registry","childPages":[]},{"href":"/en/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry","title":"Gradle registry","childPages":[]},{"href":"/en/packages/working-with-a-github-packages-registry/working-with-the-nuget-registry","title":"NuGet registry","childPages":[]},{"href":"/en/packages/working-with-a-github-packages-registry/migrating-to-the-container-registry-from-the-docker-registry","title":"Migration to Container registry","childPages":[]}]},{"href":"/en/packages/managing-github-packages-using-github-actions-workflows","title":"Managing GitHub packages with workflows","childPages":[{"href":"/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions","title":"Publish \u0026 install with Actions","childPages":[]},{"href":"/en/packages/managing-github-packages-using-github-actions-workflows/example-workflows-for-publishing-a-package","title":"Example workflows","childPages":[]},{"href":"/en/packages/managing-github-packages-using-github-actions-workflows/about-github-packages-and-github-actions","title":"Packages \u0026 Actions","childPages":[]}]}]},"featureFlags":{},"nonEnterpriseDefaultVersion":"free-pro-team@latest","status":200,"fullUrl":"https://docs-internal.github.com/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions","currentLayoutName":"inline","relativePath":"packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions.md"},"articleContext":{"title":"Publishing and installing a package with GitHub Actions","intro":"\u003cp\u003eYou can configure a workflow in GitHub Actions to automatically publish or install a package from GitHub Packages.\u003c/p\u003e","effectiveDate":"","renderedPage":"\u003ch2 id=\"about-github-packages-with-github-actions\" tabindex=\"-1\"\u003e\u003ca class=\"heading-link\" href=\"#about-github-packages-with-github-actions\"\u003eAbout GitHub Packages with GitHub Actions\u003cspan class=\"heading-link-symbol\" aria-hidden=\"true\"\u003e\u003c/span\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGitHub Actions help you automate your software development workflows in the same place you store code and collaborate on pull requests and issues. You can write individual tasks, called actions, and combine them to create a custom workflow. With GitHub Actions you can build end-to-end continuous integration (CI) and continuous deployment (CD) capabilities directly in your repository. For more information, see \u003ca href=\"/en/actions/learn-github-actions\" _originalHref=\"/actions/learn-github-actions\"\u003eWriting workflows\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eYou can extend the CI and CD capabilities of your repository by publishing or installing packages as part of your workflow.\u003c/p\u003e\n\u003ch3 id=\"authenticating-to-package-registries-with-granular-permissions\" tabindex=\"-1\"\u003e\u003ca class=\"heading-link\" href=\"#authenticating-to-package-registries-with-granular-permissions\"\u003eAuthenticating to package registries with granular permissions\u003cspan class=\"heading-link-symbol\" aria-hidden=\"true\"\u003e\u003c/span\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSome GitHub Packages registries support granular permissions. This means you can choose to allow packages to be scoped to a user or an organization, or linked to a repository. For the list of registries that support granular permissions, see \u003ca href=\"/en/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages\" _originalHref=\"/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages\"\u003eAbout permissions for GitHub Packages\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eFor registries that support granular permissions, if your GitHub Actions workflow is using a personal access token to authenticate to a registry, we highly recommend you update your workflow to use the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e. For guidance on updating your workflows that authenticate to a registry with a personal access token, see \u003ca href=\"/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token\" _originalHref=\"/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token\"\u003ePublishing and installing a package with GitHub Actions\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"ghd-alert ghd-alert-accent\"\u003e\u003cp class=\"ghd-alert-title\"\u003e\u003csvg version=\"1.1\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" class=\"octicon mr-2\" aria-hidden\u003e\u003cpath d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"\u003e\u003c/path\u003e\u003c/svg\u003eNote\u003c/p\u003e\n\u003cp\u003e\nThe ability for GitHub Actions workflows to delete and restore packages using the REST API is currently in public preview and subject to change.\u003c/p\u003e\n\u003c/div\u003e\n\u003cp\u003eYou can use a \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e in a GitHub Actions workflow to delete or restore a package using the REST API, if the token has \u003ccode\u003eadmin\u003c/code\u003e permission to the package. Repositories that publish packages using a workflow, and repositories that you have explicitly connected to packages, are automatically granted \u003ccode\u003eadmin\u003c/code\u003e permission to packages in the repository.\u003c/p\u003e\n\u003cp\u003eFor more information about the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e, see \u003ca href=\"/en/actions/security-guides/automatic-token-authentication#using-the-github_token-in-a-workflow\" _originalHref=\"/actions/security-guides/automatic-token-authentication#using-the-github_token-in-a-workflow\"\u003eAutomatic token authentication\u003c/a\u003e. For more information about the best practices when using a registry in actions, see \u003ca href=\"/en/actions/security-guides/security-hardening-for-github-actions#considering-cross-repository-access\" _originalHref=\"/actions/security-guides/security-hardening-for-github-actions#considering-cross-repository-access\"\u003eSecurity hardening for GitHub Actions\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"authenticating-to-package-registries-with-repository-scoped-permissions\" tabindex=\"-1\"\u003e\u003ca class=\"heading-link\" href=\"#authenticating-to-package-registries-with-repository-scoped-permissions\"\u003eAuthenticating to package registries with repository-scoped permissions\u003cspan class=\"heading-link-symbol\" aria-hidden=\"true\"\u003e\u003c/span\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eSome GitHub Packages registries only support repository-scoped permissions, and do not support granular permissions. For a list of these registries, see \u003ca href=\"/en/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages\" _originalHref=\"/packages/learn-github-packages/about-permissions-for-github-packages#permissions-for-repository-scoped-packages\"\u003eAbout permissions for GitHub Packages\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIf you want your workflow to access a GitHub Packages registry that does not support granular permissions, then we recommend using the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e that GitHub automatically creates for your repository when you enable GitHub Actions. You should set the permissions for this access token in the workflow file to grant read access for the \u003ccode\u003econtents\u003c/code\u003e scope and write access for the \u003ccode\u003epackages\u003c/code\u003e scope. For forks, the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e is granted read access for the parent repository. For more information, see \u003ca href=\"/en/actions/security-guides/automatic-token-authentication\" _originalHref=\"/actions/security-guides/automatic-token-authentication\"\u003eAutomatic token authentication\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eYou can reference the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e in your workflow file using the \u003ccode\u003e${{ secrets.GITHUB_TOKEN }}\u003c/code\u003e context. For more information, see \u003ca href=\"/en/actions/security-guides/automatic-token-authentication\" _originalHref=\"/actions/security-guides/automatic-token-authentication\"\u003eAutomatic token authentication\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"about-permissions-and-package-access\" tabindex=\"-1\"\u003e\u003ca class=\"heading-link\" href=\"#about-permissions-and-package-access\"\u003eAbout permissions and package access\u003cspan class=\"heading-link-symbol\" aria-hidden=\"true\"\u003e\u003c/span\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003ch3 id=\"packages-scoped-to-users-or-organizations\" tabindex=\"-1\"\u003e\u003ca class=\"heading-link\" href=\"#packages-scoped-to-users-or-organizations\"\u003ePackages scoped to users or organizations\u003cspan class=\"heading-link-symbol\" aria-hidden=\"true\"\u003e\u003c/span\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eRegistries that support granular permissions allow users to create and administer packages as free-standing resources at the organization level. Packages can be scoped to an organization or personal account and you can customize access to each of your packages separately from repository permissions.\u003c/p\u003e\n\u003cp\u003eAll workflows accessing registries that support granular permissions should use the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e instead of a personal access token. For more information about security best practices, see \u003ca href=\"/en/actions/security-guides/security-hardening-for-github-actions#using-secrets\" _originalHref=\"/actions/security-guides/security-hardening-for-github-actions#using-secrets\"\u003eSecurity hardening for GitHub Actions\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"packages-scoped-to-repositories\" tabindex=\"-1\"\u003e\u003ca class=\"heading-link\" href=\"#packages-scoped-to-repositories\"\u003ePackages scoped to repositories\u003cspan class=\"heading-link-symbol\" aria-hidden=\"true\"\u003e\u003c/span\u003e\u003c/a\u003e\u003c/h3\u003e\n\u003cp\u003eWhen you enable GitHub Actions, GitHub installs a GitHub App on your repository. The \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e secret is a GitHub App installation access token. You can use the installation access token to authenticate on behalf of the GitHub App installed on your repository. The token's permissions are limited to the repository that contains your workflow. For more information, see \u003ca href=\"/en/actions/security-guides/automatic-token-authentication#about-the-github_token-secret\" _originalHref=\"/actions/security-guides/automatic-token-authentication#about-the-github_token-secret\"\u003eAutomatic token authentication\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eGitHub Packages allows you to push and pull packages through the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e available to a GitHub Actions workflow.\u003c/p\u003e\n\u003ch2 id=\"default-permissions-and-access-settings-for-packages-modified-through-workflows\" tabindex=\"-1\"\u003e\u003ca class=\"heading-link\" href=\"#default-permissions-and-access-settings-for-packages-modified-through-workflows\"\u003eDefault permissions and access settings for packages modified through workflows\u003cspan class=\"heading-link-symbol\" aria-hidden=\"true\"\u003e\u003c/span\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eFor packages in registries that support granular permissions, when you create, install, modify, or delete a package through a workflow, there are some default permission and access settings used to ensure admins have access to the workflow. You can adjust these access settings as well. For the list of registries that support granular permissions, see \u003ca href=\"/en/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages\" _originalHref=\"/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages\"\u003eAbout permissions for GitHub Packages\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eFor example, by default if a workflow creates a package using the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e, then:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe package inherits the visibility and permissions model of the repository where the workflow is run.\u003c/li\u003e\n\u003cli\u003eRepository admins where the workflow is run become the admins of the package once the package is created.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThese are more examples of how default permissions work for workflows that manage packages.\u003c/p\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003ctable\u003e\u003cthead\u003e\u003ctr\u003e\u003cth scope=\"col\"\u003eGitHub Actions workflow task\u003c/th\u003e\u003cth scope=\"col\"\u003eDefault permissions and access\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd\u003eDownload an existing\u003c/td\u003e\u003ctd\u003e- If the package is public, any workflow running in any repository can download the package. \u003cbr\u003e - If the package is internal, then all workflows running in any repository owned by the Enterprise account can download the package. For enterprise-owned organizations, you can read any repository in the enterprise \u003cbr\u003e - If the package is private, only workflows running in repositories that are given read permission on that package can download the package. If you grant a public repository access to private packages, forks of the repository may be able to access the private packages. \u003cbr\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eUpload a new version to an existing package\u003c/td\u003e\u003ctd\u003e- If the package is private, internal, or public, only workflows running in repositories that are given write permission on that package can upload new versions to the package.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003eDelete a package or versions of a package\u003c/td\u003e\u003ctd\u003e- If the package is private, internal, or public, only workflows running in repositories that are given admin permission can delete existing versions of the package.\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\n\u003cp\u003eYou can also adjust access to packages in a more granular way or adjust some of the default permissions behavior. For more information, see \u003ca href=\"/en/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility\" _originalHref=\"/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility\"\u003eConfiguring a package's access control and visibility\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"publishing-a-package-using-an-action\" tabindex=\"-1\"\u003e\u003ca class=\"heading-link\" href=\"#publishing-a-package-using-an-action\"\u003ePublishing a package using an action\u003cspan class=\"heading-link-symbol\" aria-hidden=\"true\"\u003e\u003c/span\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou can use GitHub Actions to automatically publish packages as part of your continuous integration (CI) flow. This approach to continuous deployment (CD) allows you to automate the creation of new package versions, if the code meets your quality standards. For example, you could create a workflow that runs CI tests every time a developer pushes code to a particular branch. If the tests pass, the workflow can publish a new package version to GitHub Packages.\u003c/p\u003e\n\u003cp\u003eConfiguration steps vary by package client. For general information about configuring a workflow for GitHub Actions, see \u003ca href=\"/en/actions/using-workflows\" _originalHref=\"/actions/using-workflows\"\u003eWriting workflows\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eThe following example demonstrates how you can use GitHub Actions to build your app, and then automatically create a Docker image and publish it to GitHub Packages. The relevant settings are explained in the code. For full details about each element in a workflow, see \u003ca href=\"/en/actions/using-workflows/workflow-syntax-for-github-actions\" _originalHref=\"/actions/using-workflows/workflow-syntax-for-github-actions\"\u003eWorkflow syntax for GitHub Actions\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eCreate a new workflow file in your repository (such as \u003ccode\u003e.github/workflows/deploy-image.yml\u003c/code\u003e), and add the following YAML.\u003c/p\u003e\n\u003cdiv class=\"ghd-alert ghd-alert-accent\"\u003e\u003cp class=\"ghd-alert-title\"\u003e\u003csvg version=\"1.1\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" class=\"octicon mr-2\" aria-hidden\u003e\u003cpath d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"\u003e\u003c/path\u003e\u003c/svg\u003eNote\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThis workflow uses actions that are not certified by GitHub. They are provided by a third-party and are governed by separate terms of service, privacy policy, and support documentation.\u003c/li\u003e\n\u003cli\u003eGitHub recommends pinning actions to a commit SHA. To get a newer version, you will need to update the SHA. You can also reference a tag or branch, but the action may change without warning.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\u003cdiv class=\"annotate beside\"\u003e\u003cdiv class=\"annotate-header\"\u003e\u003cheader class=\"d-flex flex-items-center flex-justify-between p-2 text-small rounded-top-1 border-top border-left border-right\"\u003e\u003cspan class=\"flex-1\"\u003eYAML\u003c/span\u003e\u003cdiv class=\"annotate-toggle\"\u003e\u003cbutton name=\"annotate-display\" value=\"beside\" type=\"button\" class=\"annotate-option\"\u003eBeside\u003c/button\u003e\u003cbutton name=\"annotate-display\" value=\"inline\" type=\"button\" class=\"annotate-option\"\u003eInline\u003c/button\u003e\u003c/div\u003e\u003cbutton class=\"js-btn-copy btn btn-sm tooltipped tooltipped-nw\" aria-label=\"Copy YAML code to clipboard\" data-clipboard=\"1173902677\"\u003e\u003csvg version=\"1.1\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" class=\"octicon octicon-copy\" aria-hidden=\"true\"\u003e\u003cpath d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"\u003e\u003c/path\u003e\u003cpath d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/button\u003e\u003cpre hidden data-clipboard=\"1173902677\"\u003e#\nname: Create and publish a Docker image\n\n# Configures this workflow to run every time a change is pushed to the branch called `release`.\non:\n push:\n branches: ['release']\n\n# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.\nenv:\n REGISTRY: ghcr.io\n IMAGE_NAME: ${{ github.repository }}\n\n# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.\njobs:\n build-and-push-image:\n runs-on: ubuntu-latest\n # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.\n permissions:\n contents: read\n packages: write\n attestations: write\n id-token: write\n #\n steps:\n - name: Checkout repository\n uses: actions/checkout@v4\n # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.\n - name: Log in to the Container registry\n uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1\n with:\n registry: ${{ env.REGISTRY }}\n username: ${{ github.actor }}\n password: ${{ secrets.GITHUB_TOKEN }}\n # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` \"meta\" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.\n - name: Extract metadata (tags, labels) for Docker\n id: meta\n uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7\n with:\n images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.\n # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see [Usage](https://github.com/docker/build-push-action#usage) in the README of the `docker/build-push-action` repository.\n # It uses the `tags` and `labels` parameters to tag and label the image with the output from the \"meta\" step.\n - name: Build and push Docker image\n id: push\n uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4\n with:\n context: .\n push: true\n tags: ${{ steps.meta.outputs.tags }}\n labels: ${{ steps.meta.outputs.labels }}\n \n # This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see [Using artifact attestations to establish provenance for builds](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).\n - name: Generate artifact attestation\n uses: actions/attest-build-provenance@v2\n with:\n subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}\n subject-digest: ${{ steps.push.outputs.digest }}\n push-to-registry: true\n \n\u003c/pre\u003e\u003c/header\u003e\u003c/div\u003e\u003cdiv class=\"annotate-beside\"\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e\u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eCreate\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eand\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003epublish\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ea\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eDocker\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eimage\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e\u003cspan class=\"hljs-attr\"\u003eon:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epush:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ebranches:\u003c/span\u003e [\u003cspan class=\"hljs-string\"\u003e'release'\u003c/span\u003e]\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eConfigures this workflow to run every time a change is pushed to the branch called \u003ccode\u003erelease\u003c/code\u003e.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e\u003cspan class=\"hljs-attr\"\u003eenv:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eREGISTRY:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eghcr.io\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eIMAGE_NAME:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003egithub.repository\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eDefines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e\u003cspan class=\"hljs-attr\"\u003ejobs:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ebuild-and-push-image:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eruns-on:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eubuntu-latest\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eThere is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e \u003cspan class=\"hljs-attr\"\u003epermissions:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003econtents:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eread\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epackages:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ewrite\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eattestations:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ewrite\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eid-token:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ewrite\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eSets the permissions granted to the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e for the actions in this job.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e \u003cspan class=\"hljs-attr\"\u003esteps:\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eCheckout\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003erepository\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003euses:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eactions/checkout@v4\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eLog\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ein\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eto\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ethe\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eContainer\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eregistry\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003euses:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003edocker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ewith:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eregistry:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eenv.REGISTRY\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eusername:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003egithub.actor\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epassword:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003esecrets.GITHUB_TOKEN\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eUses the \u003ccode\u003edocker/login-action\u003c/code\u003e action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eExtract\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003emetadata\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e(tags,\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003elabels)\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003efor\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eDocker\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eid:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003emeta\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003euses:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003edocker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ewith:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eimages:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eenv.REGISTRY\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}/${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eenv.IMAGE_NAME\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eThis step uses \u003ca href=\"https://github.com/docker/metadata-action#about\"\u003edocker/metadata-action\u003c/a\u003e to extract tags and labels that will be applied to the specified image. The \u003ccode\u003eid\u003c/code\u003e \"meta\" allows the output of this step to be referenced in a subsequent step. The \u003ccode\u003eimages\u003c/code\u003e value provides the base name for the tags and labels.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eBuild\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eand\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003epush\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eDocker\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eimage\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eid:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003epush\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003euses:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003edocker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ewith:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003econtext:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e.\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epush:\u003c/span\u003e \u003cspan class=\"hljs-literal\"\u003etrue\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003etags:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003esteps.meta.outputs.tags\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003elabels:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003esteps.meta.outputs.labels\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eThis step uses the \u003ccode\u003edocker/build-push-action\u003c/code\u003e action to build the image, based on your repository's \u003ccode\u003eDockerfile\u003c/code\u003e. If the build succeeds, it pushes the image to GitHub Packages.\nIt uses the \u003ccode\u003econtext\u003c/code\u003e parameter to define the build's context as the set of files located in the specified path. For more information, see \u003ca href=\"https://github.com/docker/build-push-action#usage\"\u003eUsage\u003c/a\u003e in the README of the \u003ccode\u003edocker/build-push-action\u003c/code\u003e repository.\nIt uses the \u003ccode\u003etags\u003c/code\u003e and \u003ccode\u003elabels\u003c/code\u003e parameters to tag and label the image with the output from the \"meta\" step.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eGenerate\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eartifact\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eattestation\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003euses:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eactions/attest-build-provenance@v2\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ewith:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003esubject-name:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eenv.REGISTRY\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}/${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eenv.IMAGE_NAME}}\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003esubject-digest:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003esteps.push.outputs.digest\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epush-to-registry:\u003c/span\u003e \u003cspan class=\"hljs-literal\"\u003etrue\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eThis step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see \u003ca href=\"/en/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds\" _originalHref=\"/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds\"\u003eUsing artifact attestations to establish provenance for builds\u003c/a\u003e.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-inline\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e\u003cspan class=\"hljs-comment\"\u003e#\u003c/span\u003e\n\u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eCreate\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eand\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003epublish\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ea\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eDocker\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eimage\u003c/span\u003e\n\n\u003cspan class=\"hljs-comment\"\u003e# Configures this workflow to run every time a change is pushed to the branch called `release`.\u003c/span\u003e\n\u003cspan class=\"hljs-attr\"\u003eon:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epush:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ebranches:\u003c/span\u003e [\u003cspan class=\"hljs-string\"\u003e'release'\u003c/span\u003e]\n\n\u003cspan class=\"hljs-comment\"\u003e# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.\u003c/span\u003e\n\u003cspan class=\"hljs-attr\"\u003eenv:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eREGISTRY:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eghcr.io\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eIMAGE_NAME:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003egithub.repository\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\n\n\u003cspan class=\"hljs-comment\"\u003e# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.\u003c/span\u003e\n\u003cspan class=\"hljs-attr\"\u003ejobs:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ebuild-and-push-image:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eruns-on:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eubuntu-latest\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e# Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epermissions:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003econtents:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eread\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epackages:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ewrite\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eattestations:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ewrite\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eid-token:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ewrite\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e#\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003esteps:\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eCheckout\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003erepository\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003euses:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eactions/checkout@v4\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e# Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eLog\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ein\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eto\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ethe\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eContainer\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eregistry\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003euses:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003edocker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ewith:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eregistry:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eenv.REGISTRY\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eusername:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003egithub.actor\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epassword:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003esecrets.GITHUB_TOKEN\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e# This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` \"meta\" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eExtract\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003emetadata\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e(tags,\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003elabels)\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003efor\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eDocker\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eid:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003emeta\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003euses:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003edocker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ewith:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eimages:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eenv.REGISTRY\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}/${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eenv.IMAGE_NAME\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e# This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e# It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see [Usage](https://github.com/docker/build-push-action#usage) in the README of the `docker/build-push-action` repository.\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e# It uses the `tags` and `labels` parameters to tag and label the image with the output from the \"meta\" step.\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eBuild\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eand\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003epush\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eDocker\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eimage\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eid:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003epush\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003euses:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003edocker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ewith:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003econtext:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e.\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epush:\u003c/span\u003e \u003cspan class=\"hljs-literal\"\u003etrue\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003etags:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003esteps.meta.outputs.tags\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003elabels:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003esteps.meta.outputs.labels\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\n \n \u003cspan class=\"hljs-comment\"\u003e# This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see [Using artifact attestations to establish provenance for builds](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eGenerate\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eartifact\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eattestation\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003euses:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eactions/attest-build-provenance@v2\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ewith:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003esubject-name:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eenv.REGISTRY\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}/${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eenv.IMAGE_NAME}}\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003esubject-digest:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003esteps.push.outputs.digest\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epush-to-registry:\u003c/span\u003e \u003cspan class=\"hljs-literal\"\u003etrue\u003c/span\u003e\n \n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003cp\u003eThis new workflow will run automatically every time you push a change to a branch named \u003ccode\u003erelease\u003c/code\u003e in the repository. You can view the progress in the \u003cstrong\u003eActions\u003c/strong\u003e tab.\u003c/p\u003e\n\u003cp\u003eA few minutes after the workflow has completed, the new package will be visible in your repository. To find your available packages, see \u003ca href=\"/en/packages/learn-github-packages/viewing-packages#viewing-a-repositorys-packages\" _originalHref=\"/packages/learn-github-packages/viewing-packages#viewing-a-repositorys-packages\"\u003eViewing packages\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"installing-a-package-using-an-action\" tabindex=\"-1\"\u003e\u003ca class=\"heading-link\" href=\"#installing-a-package-using-an-action\"\u003eInstalling a package using an action\u003cspan class=\"heading-link-symbol\" aria-hidden=\"true\"\u003e\u003c/span\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eYou can install packages as part of your CI flow using GitHub Actions. For example, you could configure a workflow so that anytime a developer pushes code to a pull request, the workflow resolves dependencies by downloading and installing packages hosted by GitHub Packages. Then, the workflow can run CI tests that require the dependencies.\u003c/p\u003e\n\u003cp\u003eInstalling packages hosted by GitHub Packages through GitHub Actions requires minimal configuration or additional authentication when you use the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e. Data transfer is also free when an action installs a package. For more information, see \u003ca href=\"/en/billing/managing-billing-for-github-packages/about-billing-for-github-packages\" _originalHref=\"/billing/managing-billing-for-github-packages/about-billing-for-github-packages\"\u003eAbout billing for GitHub Packages\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eConfiguration steps vary by package client. For general information about configuring a workflow for GitHub Actions, see \u003ca href=\"/en/actions/using-workflows\" _originalHref=\"/actions/using-workflows\"\u003eWriting workflows\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token\" tabindex=\"-1\"\u003e\u003ca class=\"heading-link\" href=\"#upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token\"\u003eUpgrading a workflow that accesses a registry using a personal access token\u003cspan class=\"heading-link-symbol\" aria-hidden=\"true\"\u003e\u003c/span\u003e\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eGitHub Packages supports the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e for easy and secure authentication in your workflows. If you're using a registry that supports granular permissions, and your workflow is using a personal access token to authenticate to the registry, then we highly recommend you update your workflow to use the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eFor more information about the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e, see \u003ca href=\"/en/actions/security-guides/automatic-token-authentication#using-the-github_token-in-a-workflow\" _originalHref=\"/actions/security-guides/automatic-token-authentication#using-the-github_token-in-a-workflow\"\u003eAutomatic token authentication\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUsing the \u003ccode\u003eGITHUB_TOKEN\u003c/code\u003e, instead of a personal access token (classic) with the \u003ccode\u003erepo\u003c/code\u003e scope, increases the security of your repository as you don't need to use a long-lived personal access token that offers unnecessary access to the repository where your workflow is run. For more information about security best practices, see \u003ca href=\"/en/actions/security-guides/security-hardening-for-github-actions#using-secrets\" _originalHref=\"/actions/security-guides/security-hardening-for-github-actions#using-secrets\"\u003eSecurity hardening for GitHub Actions\u003c/a\u003e.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eNavigate to your package landing page.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTo ensure your package has access to your workflow, you must add the repository where the workflow is stored to your package. Under \"Manage Actions access\", click \u003cstrong\u003eAdd repository\u003c/strong\u003e and search for the repository you want to add.\n\u003cdiv class=\"procedural-image-wrapper\"\u003e\u003cpicture\u003e\u003csource srcset=\"/assets/cb-57116/mw-1440/images/help/package-registry/add-repository-button.webp 2x\" type=\"image/webp\"\u003e\u003cimg src=\"/assets/cb-57116/images/help/package-registry/add-repository-button.png\" alt=\"Screenshot of the \u0026#x22;Manage Actions access\u0026#x22; section of the package settings page. The \u0026#x22;Add repository\u0026#x22; button is highlighted with an orange outline.\"\u003e\u003c/picture\u003e\u003c/div\u003e\u003c/p\u003e\n\u003cdiv class=\"ghd-alert ghd-alert-accent\"\u003e\u003cp class=\"ghd-alert-title\"\u003e\u003csvg version=\"1.1\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" class=\"octicon mr-2\" aria-hidden\u003e\u003cpath d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"\u003e\u003c/path\u003e\u003c/svg\u003eNote\u003c/p\u003e\n\u003cp\u003e\nAdding a repository to your package by using the \u003cstrong\u003eAdd Repository\u003c/strong\u003e button under \"Manage Actions access\" in the package's settings is different than connecting your package to a repository. For more information, see \u003ca href=\"/en/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility#ensuring-workflow-access-to-your-package\" _originalHref=\"/packages/learn-github-packages/configuring-a-packages-access-control-and-visibility#ensuring-workflow-access-to-your-package\"\u003eConfiguring a package's access control and visibility\u003c/a\u003e and \u003ca href=\"/en/packages/learn-github-packages/connecting-a-repository-to-a-package\" _originalHref=\"/packages/learn-github-packages/connecting-a-repository-to-a-package\"\u003eConnecting a repository to a package\u003c/a\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOptionally, use the \u003cstrong\u003eRole\u003c/strong\u003e drop-down menu to select the default access level that you'd like the repository to have to your package.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOpen your workflow file. On the line where you log in to the registry, replace your personal access token with \u003ccode\u003e${{ secrets.GITHUB_TOKEN }}\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eFor example, this workflow publishes a Docker image to the Container registry and uses \u003ccode\u003e${{ secrets.GITHUB_TOKEN }}\u003c/code\u003e to authenticate. For more information, see \u003ca href=\"https://docs.docker.com/docker-hub/builds/\"\u003eSet up Automated Builds\u003c/a\u003e in the Docker documentation.\u003c/p\u003e\n\u003cdiv class=\"annotate beside\"\u003e\u003cdiv class=\"annotate-header\"\u003e\u003cheader class=\"d-flex flex-items-center flex-justify-between p-2 text-small rounded-top-1 border-top border-left border-right\"\u003e\u003cspan class=\"flex-1\"\u003eYAML\u003c/span\u003e\u003cdiv class=\"annotate-toggle\"\u003e\u003cbutton name=\"annotate-display\" value=\"beside\" type=\"button\" class=\"annotate-option\"\u003eBeside\u003c/button\u003e\u003cbutton name=\"annotate-display\" value=\"inline\" type=\"button\" class=\"annotate-option\"\u003eInline\u003c/button\u003e\u003c/div\u003e\u003cbutton class=\"js-btn-copy btn btn-sm tooltipped tooltipped-nw\" aria-label=\"Copy YAML code to clipboard\" data-clipboard=\"3679327733\"\u003e\u003csvg version=\"1.1\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" class=\"octicon octicon-copy\" aria-hidden=\"true\"\u003e\u003cpath d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"\u003e\u003c/path\u003e\u003cpath d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/button\u003e\u003cpre hidden data-clipboard=\"3679327733\"\u003e#\nname: Demo Push\n\n# This workflow runs when any of the following occur:\n# - A push is made to a branch called `main` or `seed`\n# - A tag starting with \"v\" is created\n# - A pull request is created or updated\non:\n push:\n branches:\n - main\n - seed\n tags:\n - v*\n pull_request:\n # This creates an environment variable called `IMAGE_NAME ` with the value `ghtoken_product_demo`.\nenv:\n IMAGE_NAME: ghtoken_product_demo\n#\njobs:\n # This pushes the image to GitHub Packages.\n push:\n runs-on: ubuntu-latest\n permissions:\n packages: write\n contents: read\n #\n steps:\n - uses: actions/checkout@v4\n\n - name: Build image\n run: docker build . --file Dockerfile --tag $IMAGE_NAME --label \"runnumber=${GITHUB_RUN_ID}\"\n\n - name: Log in to registry\n run: echo \"${{ secrets.GITHUB_TOKEN }}\" | docker login ghcr.io -u ${{ github.actor }} --password-stdin\n #\n - name: Push image\n run: |\n IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME\n\n # This changes all uppercase characters to lowercase.\n IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')\n # This strips the git ref prefix from the version.\n VERSION=$(echo \"${{ github.ref }}\" | sed -e 's,.*/\\(.*\\),\\1,')\n # This strips the \"v\" prefix from the tag name.\n [[ \"${{ github.ref }}\" == \"refs/tags/\"* ]] \u0026#x26;\u0026#x26; VERSION=$(echo $VERSION | sed -e 's/^v//')\n # This uses the Docker `latest` tag convention.\n [ \"$VERSION\" == \"main\" ] \u0026#x26;\u0026#x26; VERSION=latest\n echo IMAGE_ID=$IMAGE_ID\n echo VERSION=$VERSION\n docker tag $IMAGE_NAME $IMAGE_ID:$VERSION\n docker push $IMAGE_ID:$VERSION\n\u003c/pre\u003e\u003c/header\u003e\u003c/div\u003e\u003cdiv class=\"annotate-beside\"\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e\u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eDemo\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ePush\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e\u003cspan class=\"hljs-attr\"\u003eon:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epush:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ebranches:\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003emain\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eseed\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003etags:\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ev*\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epull_request:\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eThis workflow runs when any of the following occur:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA push is made to a branch called \u003ccode\u003emain\u003c/code\u003e or \u003ccode\u003eseed\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eA tag starting with \"v\" is created\u003c/li\u003e\n\u003cli\u003eA pull request is created or updated\u003c/li\u003e\n\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e\u003cspan class=\"hljs-attr\"\u003eenv:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eIMAGE_NAME:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eghtoken_product_demo\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eThis creates an environment variable called \u003ccode\u003eIMAGE_NAME \u003c/code\u003e with the value \u003ccode\u003eghtoken_product_demo\u003c/code\u003e.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e\u003cspan class=\"hljs-attr\"\u003ejobs:\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e \u003cspan class=\"hljs-attr\"\u003epush:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eruns-on:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eubuntu-latest\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epermissions:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epackages:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ewrite\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003econtents:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eread\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eThis pushes the image to GitHub Packages.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e \u003cspan class=\"hljs-attr\"\u003esteps:\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003euses:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eactions/checkout@v4\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eBuild\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eimage\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003erun:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003edocker\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ebuild\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e.\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e--file\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eDockerfile\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e--tag\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e$IMAGE_NAME\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e--label\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e\"runnumber=${GITHUB_RUN_ID}\"\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eLog\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ein\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eto\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eregistry\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003erun:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eecho\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e\"$\u003cspan class=\"hljs-template-variable\"\u003e{{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\"\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e|\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003edocker\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003elogin\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eghcr.io\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e-u\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003egithub.actor\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e--password-stdin\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ePush\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eimage\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003erun:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e|\u003c/span\u003e\n \u003cspan class=\"hljs-string\"\u003eIMAGE_ID=ghcr.io/${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003egithub.repository_owner\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}/$IMAGE_NAME\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e \u003cspan class=\"hljs-string\"\u003eIMAGE_ID=$(echo\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e$IMAGE_ID\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e|\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003etr\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e'[A-Z]'\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e'[a-z]'\u003c/span\u003e\u003cspan class=\"hljs-string\"\u003e)\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eThis changes all uppercase characters to lowercase.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e \u003cspan class=\"hljs-string\"\u003eVERSION=$(echo\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e\"$\u003cspan class=\"hljs-template-variable\"\u003e{{ github.ref }}\u003c/span\u003e\"\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e|\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003esed\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e-e\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e's,.*/\\(.*\\),\\1,'\u003c/span\u003e\u003cspan class=\"hljs-string\"\u003e)\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eThis strips the git ref prefix from the version.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e [[ \u003cspan class=\"hljs-string\"\u003e\"$\u003cspan class=\"hljs-template-variable\"\u003e{{ github.ref }}\u003c/span\u003e\"\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e==\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e\"refs/tags/\"\u003c/span\u003e\u003cspan class=\"hljs-string\"\u003e*\u003c/span\u003e ]] \u003cspan class=\"hljs-string\"\u003e\u0026#x26;\u0026#x26;\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eVERSION=$(echo\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e$VERSION\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e|\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003esed\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e-e\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e's/^v//'\u003c/span\u003e\u003cspan class=\"hljs-string\"\u003e)\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eThis strips the \"v\" prefix from the tag name.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-row\"\u003e\u003cdiv class=\"annotate-code\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e [ \u003cspan class=\"hljs-string\"\u003e\"$VERSION\"\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e==\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e\"main\"\u003c/span\u003e ] \u003cspan class=\"hljs-string\"\u003e\u0026#x26;\u0026#x26;\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eVERSION=latest\u003c/span\u003e\n \u003cspan class=\"hljs-string\"\u003eecho\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eIMAGE_ID=$IMAGE_ID\u003c/span\u003e\n \u003cspan class=\"hljs-string\"\u003eecho\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eVERSION=$VERSION\u003c/span\u003e\n \u003cspan class=\"hljs-string\"\u003edocker\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003etag\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e$IMAGE_NAME\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e$IMAGE_ID:$VERSION\u003c/span\u003e\n \u003cspan class=\"hljs-string\"\u003edocker\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003epush\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e$IMAGE_ID:$VERSION\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"annotate-note\"\u003e\u003cp\u003eThis uses the Docker \u003ccode\u003elatest\u003c/code\u003e tag convention.\u003c/p\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class=\"annotate-inline\"\u003e\u003cpre\u003e\u003ccode class=\"hljs language-yaml\"\u003e\u003cspan class=\"hljs-comment\"\u003e#\u003c/span\u003e\n\u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eDemo\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ePush\u003c/span\u003e\n\n\u003cspan class=\"hljs-comment\"\u003e# This workflow runs when any of the following occur:\u003c/span\u003e\n\u003cspan class=\"hljs-comment\"\u003e# - A push is made to a branch called `main` or `seed`\u003c/span\u003e\n\u003cspan class=\"hljs-comment\"\u003e# - A tag starting with \"v\" is created\u003c/span\u003e\n\u003cspan class=\"hljs-comment\"\u003e# - A pull request is created or updated\u003c/span\u003e\n\u003cspan class=\"hljs-attr\"\u003eon:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epush:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003ebranches:\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003emain\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eseed\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003etags:\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ev*\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epull_request:\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e# This creates an environment variable called `IMAGE_NAME ` with the value `ghtoken_product_demo`.\u003c/span\u003e\n\u003cspan class=\"hljs-attr\"\u003eenv:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eIMAGE_NAME:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eghtoken_product_demo\u003c/span\u003e\n\u003cspan class=\"hljs-comment\"\u003e#\u003c/span\u003e\n\u003cspan class=\"hljs-attr\"\u003ejobs:\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e# This pushes the image to GitHub Packages.\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epush:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003eruns-on:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eubuntu-latest\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epermissions:\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003epackages:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ewrite\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003econtents:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eread\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e#\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003esteps:\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003euses:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eactions/checkout@v4\u003c/span\u003e\n\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eBuild\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eimage\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003erun:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003edocker\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ebuild\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e.\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e--file\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eDockerfile\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e--tag\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e$IMAGE_NAME\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e--label\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e\"runnumber=${GITHUB_RUN_ID}\"\u003c/span\u003e\n\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eLog\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ein\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eto\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eregistry\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003erun:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eecho\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e\"$\u003cspan class=\"hljs-template-variable\"\u003e{{ secrets.GITHUB_TOKEN }}\u003c/span\u003e\"\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e|\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003edocker\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003elogin\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eghcr.io\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e-u\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e${{\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003egithub.actor\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e}}\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e--password-stdin\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e#\u003c/span\u003e\n \u003cspan class=\"hljs-bullet\"\u003e-\u003c/span\u003e \u003cspan class=\"hljs-attr\"\u003ename:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003ePush\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eimage\u003c/span\u003e\n \u003cspan class=\"hljs-attr\"\u003erun:\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e|\n IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME\n\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e# This changes all uppercase characters to lowercase.\u003c/span\u003e\n \u003cspan class=\"hljs-string\"\u003eIMAGE_ID=$(echo\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e$IMAGE_ID\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e|\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003etr\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e'[A-Z]'\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e'[a-z]'\u003c/span\u003e\u003cspan class=\"hljs-string\"\u003e)\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e# This strips the git ref prefix from the version.\u003c/span\u003e\n \u003cspan class=\"hljs-string\"\u003eVERSION=$(echo\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e\"$\u003cspan class=\"hljs-template-variable\"\u003e{{ github.ref }}\u003c/span\u003e\"\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e|\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003esed\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e-e\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e's,.*/\\(.*\\),\\1,'\u003c/span\u003e\u003cspan class=\"hljs-string\"\u003e)\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e# This strips the \"v\" prefix from the tag name.\u003c/span\u003e\n [[ \u003cspan class=\"hljs-string\"\u003e\"$\u003cspan class=\"hljs-template-variable\"\u003e{{ github.ref }}\u003c/span\u003e\"\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e==\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e\"refs/tags/\"\u003c/span\u003e\u003cspan class=\"hljs-string\"\u003e*\u003c/span\u003e ]] \u003cspan class=\"hljs-string\"\u003e\u0026#x26;\u0026#x26;\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eVERSION=$(echo\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e$VERSION\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e|\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003esed\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e-e\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e's/^v//'\u003c/span\u003e\u003cspan class=\"hljs-string\"\u003e)\u003c/span\u003e\n \u003cspan class=\"hljs-comment\"\u003e# This uses the Docker `latest` tag convention.\u003c/span\u003e\n [ \u003cspan class=\"hljs-string\"\u003e\"$VERSION\"\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e==\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e\"main\"\u003c/span\u003e ] \u003cspan class=\"hljs-string\"\u003e\u0026#x26;\u0026#x26;\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eVERSION=latest\u003c/span\u003e\n \u003cspan class=\"hljs-string\"\u003eecho\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eIMAGE_ID=$IMAGE_ID\u003c/span\u003e\n \u003cspan class=\"hljs-string\"\u003eecho\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003eVERSION=$VERSION\u003c/span\u003e\n \u003cspan class=\"hljs-string\"\u003edocker\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003etag\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e$IMAGE_NAME\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e$IMAGE_ID:$VERSION\u003c/span\u003e\n \u003cspan class=\"hljs-string\"\u003edocker\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003epush\u003c/span\u003e \u003cspan class=\"hljs-string\"\u003e$IMAGE_ID:$VERSION\u003c/span\u003e\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e","miniTocItems":[{"contents":{"href":"#about-github-packages-with-github-actions","title":"About GitHub Packages with GitHub Actions"}},{"contents":{"href":"#about-permissions-and-package-access","title":"About permissions and package access"}},{"contents":{"href":"#default-permissions-and-access-settings-for-packages-modified-through-workflows","title":"Default permissions and access settings for packages modified through workflows"}},{"contents":{"href":"#publishing-a-package-using-an-action","title":"Publishing a package using an action"}},{"contents":{"href":"#installing-a-package-using-an-action","title":"Installing a package using an action"}},{"contents":{"href":"#upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token","title":"Upgrading a workflow that accesses a registry using a personal access token"}}],"permissions":"","includesPlatformSpecificContent":false,"includesToolSpecificContent":false,"defaultPlatform":"","defaultTool":"","product":"\u003cp\u003eGitHub Packages is available with GitHub Free, GitHub Pro, GitHub Free for organizations, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server 3.0 or higher.\u003c/p\u003e\n\u003cp\u003e\u003cbr\u003eGitHub Packages is not available for private repositories owned by accounts using legacy per-repository plans. Also, accounts using legacy per-repository plans cannot access registries that support granular permissions, because these accounts are billed by repository. For the list of registries that support granular permissions, see \u003ca href=\"/en/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages\" _originalHref=\"/packages/learn-github-packages/about-permissions-for-github-packages#granular-permissions-for-userorganization-scoped-packages\"\u003eAbout permissions for GitHub Packages\u003c/a\u003e. For more information, see \u003ca href=\"/en/get-started/learning-about-github/githubs-plans\" _originalHref=\"/get-started/learning-about-github/githubs-plans\"\u003eGitHub’s plans\u003c/a\u003e.\u003c/p\u003e","productVideoUrl":"","currentLearningTrack":null,"detectedPlatforms":[],"detectedTools":[],"allTools":{"agents":"Agents","api":"API","azure_data_studio":"Azure Data Studio","bash":"Bash","cli":"GitHub CLI","codespaces":"Codespaces","curl":"curl","desktop":"Desktop","eclipse":"Eclipse","importer_cli":"GitHub Enterprise Importer CLI","javascript":"JavaScript","jetbrains":"JetBrains IDEs","jetbrains_beta":"JetBrains IDEs (Beta)","skillsets":"Skillsets","vimneovim":"Vim/Neovim","powershell":"PowerShell","visualstudio":"Visual Studio","vscode":"Visual Studio Code","webui":"Web browser","windowsterminal":"Windows Terminal","xcode":"Xcode"},"supportPortalVaIframeProps":{"supportPortalUrl":"https://support.github.com","vaFlowUrlParameter":""},"currentLayout":"inline"}},"languagesContext":{"languages":{"en":{"name":"English","code":"en"},"zh":{"name":"Simplified Chinese","code":"zh","hreflang":"zh-Hans","nativeName":"简体中文"},"es":{"name":"Spanish","code":"es","nativeName":"Español"},"pt":{"name":"Portuguese","code":"pt","nativeName":"Português do Brasil"},"ru":{"name":"Russian","code":"ru","nativeName":"Русский"},"ja":{"name":"Japanese","code":"ja","nativeName":"日本語"},"fr":{"name":"French","code":"fr","nativeName":"Français"},"de":{"name":"German","code":"de","nativeName":"Deutsch"},"ko":{"name":"Korean","code":"ko","nativeName":"한국어"}}},"__N_SSP":true},"page":"/[versionId]/[productId]/[...restPage]","query":{"versionId":"free-pro-team@latest","productId":"packages","restPage":["managing-github-packages-using-github-actions-workflows","publishing-and-installing-a-package-with-github-actions"]},"buildId":"MCbgFHVmIdIlMGu6pmoUz","isFallback":false,"isExperimentalCompile":false,"gssp":true,"appGip":true,"locale":"en","locales":["en","zh","es","pt","ru","ja","fr","de","ko"],"defaultLocale":"en","scriptLoader":[]}</script></body></html>