How your GitHub Actions workflow builds a Gliss app and requests releases without stored secrets.
Planned. This page describes designed behaviour that is not built yet. Details may change before it ships.
Your company’s CI builds every Gliss app. Gliss never builds your code itself. In GitHub Actions, the job runs the gliss-cli container, which runs Garden with the gliss provider, and holds no stored secrets: every credential it uses is short-lived and obtained during the run.Garden doesn’t document GitHub Actions directly, and its CircleCI guide assumes a kubeconfig and Garden Cloud, so this page describes the Gliss setup instead of porting it.
Builds and tests. Garden builds the images and runs the CI-side exec tests. Actions whose version hasn’t changed are skipped; see Caching.
Pushes images to your registry. The job signs in to your company’s AWS account with GitHub Actions OIDC and pushes the images to Amazon ECR. That AWS role is for pushing to ECR only.
Requests a release. The job exchanges a GitHub Actions OIDC token for a Gliss token, and asks Gliss to release the app. Gliss checks the request and the cluster agent applies it. CI never talks to your clusters and has no kubeconfig.
Both sign-ins use the OIDC ID token that GitHub issues to the job, so the workflow needs permission to request one:
permissions: id-token: write contents: read
AWS: the job assumes a role in your AWS account through GitHub’s OIDC provider. Set that role up to allow pushes to your app’s ECR repositories and nothing else. See GitHub’s guide to configuring OpenID Connect in Amazon Web Services.
Gliss: the gliss provider sends the OIDC token to POST /api/gliss/v1/ci/token and gets back a Gliss token. The token lasts one hour, works only for the one app whose repository the run belongs to, and only lets the job request releases and read that app’s diagnostics. Nothing is stored in the repository or in GitHub secrets.
Gliss decides from the claims in the OIDC token. By default:
only runs on main can get a token, and the branch must be protected;
only push and workflow_dispatch runs can get a token;
pull request runs never can, because they can run code or input from forks.
An admin can allow more branches or events for an app, or pin the token exchange to one workflow file or one GitHub deployment environment. Each GitHub OIDC token can be exchanged only once.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Gliss","description":"Your AI writes the app. Gliss makes it real.","colors":{"primary":"#0D7A68","light":"#3CC6AB","dark":"#0D7A68"},"logo":{"light":"https://mintcdn.com/gliss/axEaheOfhsLFc7KM/logo/light.svg?fit=max\u0026auto=format\u0026n=axEaheOfhsLFc7KM\u0026q=85\u0026s=aaec7156e26ffaa5929b733c57e9af33","dark":"https://mintcdn.com/gliss/axEaheOfhsLFc7KM/logo/dark.svg?fit=max\u0026auto=format\u0026n=axEaheOfhsLFc7KM\u0026q=85\u0026s=b84d3f67c5c71daadd657a5ded1ac09e"},"favicon":"https://mintcdn.com/gliss/jqMn0p3U0Lw4yeV5/logo/favicon.svg?fit=max\u0026auto=format\u0026n=jqMn0p3U0Lw4yeV5\u0026q=85\u0026s=7805f3e55e297f44530af974483b07bc","footer":{"socials":{"website":"https://glissando.dev"}},"contextual":{"options":["copy","view","claude","chatgpt","cursor"],"display":"header"},"markdown":{"instructions":["If you are an AI assistant asked to build, change or ship a Gliss app, read the For AI agents page first (/for-ai-agents.md on this site) and follow its steps.","Inside an app's folder, the app's own AGENTS.md is the authority; `gliss guide` prints it. Never ask the user for a secret's value."]},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"gliss","hasAudioNarration":false,"actualSubdomain":"gliss","customDomains":["docs.glissando.dev"],"gitSource":{"type":"github","owner":"incredibuild-rnd","repo":"gliss-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ae3881e3decdc5d1ba56074","collectionId":"6ebd61ff-1a07-48f8-b9f3-9b0d97c5fc73","liveDeploymentHistoryId":"6ae3881e3decdc5d1ba56074","schemaVersion":"v3"},"entitlements":{},"buildId":"6ae3881e3decdc5d1ba56074","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Documentation","count":39},{"language":"default","tag":"Build apps","count":13},{"language":"default","tag":"Engineers","count":10},{"language":"default","tag":"Administer","count":9},{"language":"default","tag":"Reference","count":9},{"language":"default","tag":"Capabilities","count":7},{"language":"default","tag":"Get started","count":5},{"language":"default","tag":"Files","count":5},{"language":"default","tag":"Tools","count":4},{"language":"default","tag":"Troubleshooting","count":2}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"engineers/ci","slug":"/engineers/ci","pageMetadata":{"title":"CI with GitHub Actions","description":"How your GitHub Actions workflow builds a Gliss app and requests releases without stored secrets.","tag":"Planned","href":"/engineers/ci"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How your GitHub Actions workflow builds a Gliss app and requests releases without stored secrets.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Planned.`}),` This page describes designed behaviour that is not built yet. Details may change before it ships.`]})}),`\n`,_jsxs(_components.p,{children:[`Your company’s CI builds every Gliss app. Gliss never builds your code itself. In GitHub Actions, the job runs the `,_jsx(_components.code,{children:`gliss-cli`}),` container, which runs Garden with the `,_jsx(_components.code,{children:`gliss`}),` provider, and holds no stored secrets: every credential it uses is short-lived and obtained during the run.`]}),`\n`,_jsx(_components.p,{children:`Garden doesn’t document GitHub Actions directly, and its CircleCI guide assumes a kubeconfig and Garden Cloud, so this page describes the Gliss setup instead of porting it.`}),`\n`,_jsx(Heading,{level:`2`,id:`what-a-ci-run-does`,children:`What a CI run does`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Builds and tests.`}),` Garden builds the images and runs the CI-side `,_jsx(_components.code,{children:`exec`}),` tests. Actions whose version hasn’t changed are skipped; see `,_jsx(_components.a,{href:`/engineers/caching`,children:`Caching`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Pushes images to your registry.`}),` The job signs in to your company’s AWS account with GitHub Actions OIDC and pushes the images to Amazon ECR. That AWS role is for pushing to ECR only.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Requests a release.`}),` The job exchanges a GitHub Actions OIDC token for a Gliss token, and asks Gliss to release the app. Gliss checks the request and the cluster agent applies it. CI never talks to your clusters and has no kubeconfig.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`credentials-without-stored-secrets`,children:`Credentials without stored secrets`}),`\n`,_jsx(_components.p,{children:`Both sign-ins use the OIDC ID token that GitHub issues to the job, so the workflow needs permission to request one:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`permissions`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` id-token`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`write`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` contents`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`read`})]}),`\n`]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`AWS:`}),` the job assumes a role in your AWS account through GitHub’s OIDC provider. Set that role up to allow pushes to your app’s ECR repositories and nothing else. See GitHub’s guide to `,_jsx(_components.a,{href:`https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services`,children:`configuring OpenID Connect in Amazon Web Services`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Gliss:`}),` the `,_jsx(_components.code,{children:`gliss`}),` provider sends the OIDC token to `,_jsx(_components.code,{children:`POST /api/gliss/v1/ci/token`}),` and gets back a Gliss token. The token lasts one hour, works only for the one app whose repository the run belongs to, and only lets the job request releases and read that app’s diagnostics. Nothing is stored in the repository or in GitHub secrets.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`which-runs-can-request-releases`,children:`Which runs can request releases`}),`\n`,_jsx(_components.p,{children:`Gliss decides from the claims in the OIDC token. By default:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`only runs on `,_jsx(_components.code,{children:`main`}),` can get a token, and the branch must be protected;`]}),`\n`,_jsxs(_components.li,{children:[`only `,_jsx(_components.code,{children:`push`}),` and `,_jsx(_components.code,{children:`workflow_dispatch`}),` runs can get a token;`]}),`\n`,_jsx(_components.li,{children:`pull request runs never can, because they can run code or input from forks.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`An admin can allow more branches or events for an app, or pin the token exchange to one workflow file or one GitHub deployment environment. Each GitHub OIDC token can be exchanged only once.`}),`\n`,_jsx(Heading,{level:`2`,id:`learn-more`,children:`Learn more`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/build/stages`,children:`Preview, Beta and Live`}),`: a merge to main updates Beta.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/administer/github-app`,children:`The Gliss GitHub App`}),`: how your IT team connects repositories and sets up CI.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"CI with GitHub Actions","description":"How your GitHub Actions workflow builds a Gliss app and requests releases without stored secrets.","tag":"Planned","href":"/engineers/ci"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What a CI run does","slug":"what-a-ci-run-does","depth":2,"children":[]},{"title":"Credentials without stored secrets","slug":"credentials-without-stored-secrets","depth":2,"children":[]},{"title":"Which runs can request releases","slug":"which-runs-can-request-releases","depth":2,"children":[]},{"title":"Learn more","slug":"learn-more","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"gliss","siteName":"Gliss","title":"CI with GitHub Actions - Gliss","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-05T10:35:06.681Z","originalFileLocation":"engineers/ci.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"How your GitHub Actions workflow builds a Gliss app and requests releases without stored secrets.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Gliss\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/gliss/bK94XtMsLyt74fEV/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/gliss/bK94XtMsLyt74fEV/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/gliss/bK94XtMsLyt74fEV/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/gliss/bK94XtMsLyt74fEV/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/gliss/bK94XtMsLyt74fEV/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/gliss/bK94XtMsLyt74fEV/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/gliss/bK94XtMsLyt74fEV/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/gliss/bK94XtMsLyt74fEV/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/gliss/bK94XtMsLyt74fEV/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"CI with GitHub Actions - Gliss\">\u003cmeta data-mint-head property=\"og:description\" content=\"How your GitHub Actions workflow builds a Gliss app and requests releases without stored secrets.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Gliss\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.glissando.dev/engineers/ci\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://gliss.mintlify.app/_mintlify/api/og/v2?division=Engineers\u0026amp;title=CI+with+GitHub+Actions\u0026amp;description=How+your+GitHub+Actions+workflow+builds+a+Gliss+app+and+requests+releases+without+stored+secrets.\u0026amp;theme=452b1c125b48a6dff629143f\u0026amp;signature=a107d1fa90a44502a447f61cc7817cbae3e98e17dab4d7aad00fd7a6384d7dd4\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"CI with GitHub Actions - Gliss\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How your GitHub Actions workflow builds a Gliss app and requests releases without stored secrets.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://gliss.mintlify.app/_mintlify/api/og/v2?division=Engineers\u0026amp;title=CI+with+GitHub+Actions\u0026amp;description=How+your+GitHub+Actions+workflow+builds+a+Gliss+app+and+requests+releases+without+stored+secrets.\u0026amp;theme=452b1c125b48a6dff629143f\u0026amp;signature=a107d1fa90a44502a447f61cc7817cbae3e98e17dab4d7aad00fd7a6384d7dd4\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/gliss/bK94XtMsLyt74fEV/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Gliss\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0D7A68\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.glissando.dev/engineers/ci\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/engineers/ci.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.glissando.dev/#organization\",\"name\":\"Gliss\",\"url\":\"https://docs.glissando.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/gliss/axEaheOfhsLFc7KM/logo/light.svg?fit=max\u0026auto=format\u0026n=axEaheOfhsLFc7KM\u0026q=85\u0026s=aaec7156e26ffaa5929b733c57e9af33\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.glissando.dev#website\",\"name\":\"Gliss\",\"url\":\"https://docs.glissando.dev\",\"publisher\":{\"@id\":\"https://docs.glissando.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.glissando.dev/engineers/ci#webpage\",\"url\":\"https://docs.glissando.dev/engineers/ci\",\"name\":\"CI with GitHub Actions\",\"description\":\"How your GitHub Actions workflow builds a Gliss app and requests releases without stored secrets.\",\"dateModified\":\"2026-10-05T10:35:06.681Z\",\"isPartOf\":{\"@id\":\"https://docs.glissando.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.glissando.dev/engineers/ci#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.glissando.dev/engineers/ci#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Engineers\",\"item\":\"https://docs.glissando.dev/engineers/levels\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CI with GitHub Actions\",\"item\":\"https://docs.glissando.dev/engineers/ci\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.glissando.dev/engineers/ci#article\",\"headline\":\"CI with GitHub Actions\",\"name\":\"CI with GitHub Actions\",\"description\":\"How your GitHub Actions workflow builds a Gliss app and requests releases without stored secrets.\",\"url\":\"https://docs.glissando.dev/engineers/ci\",\"mainEntityOfPage\":{\"@id\":\"https://docs.glissando.dev/engineers/ci#webpage\"},\"dateModified\":\"2026-10-05T10:35:06.681Z\",\"publisher\":{\"@id\":\"https://docs.glissando.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.glissando.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Gliss\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Gliss","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Get started","pages":[{"title":"What is Gliss","href":""},{"title":"How Gliss works","href":"/get-started/how-it-works"},{"title":"Quickstart","tag":"Demo","href":"/get-started/quickstart"},{"title":"For AI agents","tag":"Demo","href":"/for-ai-agents"},{"title":"Concepts","href":"/get-started/concepts"}]},{"group":"Build apps","pages":[{"title":"Writing gliss.yaml","tag":"Available","href":"/build/gliss-yaml"},{"group":"Capabilities","pages":[{"title":"Postgres","tag":"Demo","href":"/build/capabilities/postgres"},{"title":"Redis","tag":"Planned","href":"/build/capabilities/redis"},{"title":"Bucket","tag":"Demo","href":"/build/capabilities/bucket"},{"title":"Hostname","tag":"Demo","href":"/build/capabilities/hostname"},{"title":"Sign-in (SSO)","tag":"Planned","href":"/build/capabilities/sso"},{"title":"Secrets","tag":"Demo","href":"/build/capabilities/secrets"},{"title":"Healer","tag":"Planned","href":"/build/capabilities/healer"}]},{"title":"Preview, Beta and Live","tag":"Demo","href":"/build/stages"},{"title":"Share and publish","tag":"Demo","href":"/build/share-and-publish"},{"title":"Secrets and mock mode","tag":"Demo","href":"/build/secrets-and-mock-mode"},{"title":"Diagnostics with your AI","tag":"Demo","href":"/build/diagnostics"},{"title":"Supported AI tools","tag":"Demo","href":"/build/ai-tools"}]},{"group":"Administer","pages":[{"title":"Install Gliss","tag":"Demo","href":"/administer/install"},{"title":"The Gliss GitHub App","tag":"Demo","href":"/administer/github-app"},{"title":"The catalog","tag":"Available","href":"/administer/catalog"},{"title":"Approvals","tag":"Planned","href":"/administer/approvals"},{"title":"Sign-in and SSO","tag":"Planned","href":"/administer/sign-in"},{"title":"Outbound access","tag":"Planned","href":"/administer/egress"},{"title":"Support access","tag":"Planned","href":"/administer/support-access"},{"title":"Maintenance tiers","tag":"Planned","href":"/administer/maintenance"},{"title":"Security model","tag":"Demo","href":"/administer/security-model"}]},{"group":"Engineers","pages":[{"title":"Levels 1 and 2","tag":"Planned","href":"/engineers/levels"},{"title":"garden.yml with Gliss action types","tag":"Planned","href":"/engineers/garden-yml"},{"title":"Garden basics","tag":"Planned","href":"/engineers/garden-basics"},{"title":"Building containers","tag":"Planned","href":"/engineers/building-containers"},{"title":"Tests and runs","tag":"Planned","href":"/engineers/tests"},{"title":"Caching","tag":"Planned","href":"/engineers/caching"},{"title":"Variables and templating","tag":"Planned","href":"/engineers/variables-and-templating"},{"title":"Helm charts","tag":"Planned","href":"/engineers/helm"},{"title":"Kubernetes manifests","description":"Deploy your own Kubernetes manifests with Garden's kubernetes Deploy action, at level 2.","tag":"Planned","href":"/engineers/kubernetes-manifests"},{"title":"CI with GitHub Actions","tag":"Planned","href":"/engineers/ci"}]},{"group":"Troubleshooting","pages":[{"title":"Troubleshooting","description":"Reading a diagnosis, and what to do for each kind of failure.","tag":"Demo","href":"/troubleshooting/overview"},{"title":"Capacity","tag":"Demo","href":"/maintenance/capacity"}]}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/reference/gliss-yaml"}]}]},"title":"CI with GitHub Actions - Gliss","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}