[{"data":1,"prerenderedAt":214},["ShallowReactive",2],{"term-e\u002Fephemeral-environments":3,"related-e\u002Fephemeral-environments":198},{"id":4,"title":5,"acronym":6,"body":7,"category":180,"description":181,"difficulty":182,"extension":183,"letter":184,"meta":185,"navigation":92,"path":186,"related":187,"seo":192,"sitemap":193,"stem":196,"subcategory":6,"__hash__":197},"terms\u002Fterms\u002Fe\u002Fephemeral-environments.md","Ephemeral Environments",null,{"type":8,"value":9,"toc":174},"minimark",[10,15,19,23,26,30,163,167,170],[11,12,14],"h2",{"id":13},"eli5-the-vibe-check","ELI5 - The Vibe Check",[16,17,18],"p",{},"An ephemeral environment is a full, working copy of your app spun up automatically for a single pull request, and torn down the moment that PR closes. Instead of everyone fighting over one shared staging server that's perpetually broken by someone else's half-finished feature, every PR gets its own clean sandbox that lives and dies with it.",[11,20,22],{"id":21},"real-talk","Real Talk",[16,24,25],{},"Ephemeral environments are short-lived, isolated deployments created automatically for a specific branch, pull request, or test run, and destroyed once no longer needed. They give reviewers and automated tests a real, fully deployed environment to work against without the contention and drift of a single shared staging environment.",[11,27,29],{"id":28},"show-me-the-code","Show Me The Code",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","on:\n  pull_request:\n    types: [opened, synchronize]\n\njobs:\n  preview:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - run: npm ci && npm run deploy:preview -- --pr=${{ github.event.number }}\n      # torn down automatically when the PR closes\n","yaml","",[38,39,40,53,62,87,94,102,110,121,129,143,156],"code",{"__ignoreMap":36},[41,42,45,49],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"sfNiH","on",[41,50,52],{"class":51},"sMK4o",":\n",[41,54,56,60],{"class":43,"line":55},2,[41,57,59],{"class":58},"swJcz","  pull_request",[41,61,52],{"class":51},[41,63,65,68,71,74,78,81,84],{"class":43,"line":64},3,[41,66,67],{"class":58},"    types",[41,69,70],{"class":51},":",[41,72,73],{"class":51}," [",[41,75,77],{"class":76},"sfazB","opened",[41,79,80],{"class":51},",",[41,82,83],{"class":76}," synchronize",[41,85,86],{"class":51},"]\n",[41,88,90],{"class":43,"line":89},4,[41,91,93],{"emptyLinePlaceholder":92},true,"\n",[41,95,97,100],{"class":43,"line":96},5,[41,98,99],{"class":58},"jobs",[41,101,52],{"class":51},[41,103,105,108],{"class":43,"line":104},6,[41,106,107],{"class":58},"  preview",[41,109,52],{"class":51},[41,111,113,116,118],{"class":43,"line":112},7,[41,114,115],{"class":58},"    runs-on",[41,117,70],{"class":51},[41,119,120],{"class":76}," ubuntu-latest\n",[41,122,124,127],{"class":43,"line":123},8,[41,125,126],{"class":58},"    steps",[41,128,52],{"class":51},[41,130,132,135,138,140],{"class":43,"line":131},9,[41,133,134],{"class":51},"      -",[41,136,137],{"class":58}," uses",[41,139,70],{"class":51},[41,141,142],{"class":76}," actions\u002Fcheckout@v4\n",[41,144,146,148,151,153],{"class":43,"line":145},10,[41,147,134],{"class":51},[41,149,150],{"class":58}," run",[41,152,70],{"class":51},[41,154,155],{"class":76}," npm ci && npm run deploy:preview -- --pr=${{ github.event.number }}\n",[41,157,159],{"class":43,"line":158},11,[41,160,162],{"class":161},"sHwdD","      # torn down automatically when the PR closes\n",[11,164,166],{"id":165},"when-youll-hear-this","When You'll Hear This",[16,168,169],{},"\"Every PR gets an ephemeral environment now, reviewers can click through the actual feature before approving.\" \u002F \"The ephemeral environment for that branch already got torn down, spin up a new one.\"",[171,172,173],"style",{},"html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":36,"searchDepth":55,"depth":55,"links":175},[176,177,178,179],{"id":13,"depth":55,"text":14},{"id":21,"depth":55,"text":22},{"id":28,"depth":55,"text":29},{"id":165,"depth":55,"text":166},"cicd","An ephemeral environment is a full, working copy of your app spun up automatically for a single pull request, and torn down the moment that PR closes.","intermediate","md","e",{},"\u002Fterms\u002Fe\u002Fephemeral-environments",[188,189,190,191],"Staging","Deployment","CI Testing","Canary Deployment",{"title":5,"description":181},{"changefreq":194,"priority":195},"weekly",0.7,"terms\u002Fe\u002Fephemeral-environments","XyRqGRevV-yhLQTNAl1b74o1y1Tc8z-oSckRRouXxj4",[199,203,208,211],{"title":191,"path":200,"acronym":6,"category":201,"difficulty":182,"description":202},"\u002Fterms\u002Fc\u002Fcanary-deployment","cloud","Canary deployment is releasing your new code to a tiny percentage of users first to see if it explodes.",{"title":190,"path":204,"acronym":6,"category":205,"difficulty":206,"description":207},"\u002Fterms\u002Fc\u002Fci-testing","testing","beginner","CI Testing is running all your tests automatically every time someone pushes code.",{"title":189,"path":209,"acronym":6,"category":180,"difficulty":206,"description":210},"\u002Fterms\u002Fd\u002Fdeployment","A deployment is the event of pushing your code live — it's both the action and the thing you deployed.",{"title":188,"path":212,"acronym":6,"category":180,"difficulty":206,"description":213},"\u002Fterms\u002Fs\u002Fstaging","Staging is a fake version of your real app that looks and acts exactly like production but has zero real users.",1792528082368]