tpotce/docker/tanner/snare/dist/pages/1/0829a1bb151a668b07a7965e1bdd1225

255 lines
18 KiB
Text
Raw Normal View History

2018-08-14 14:20:55 +00:00
<!DOCTYPE html>
<html class="" lang="en">
<head prefix="og: http://ogp.me/ns#">
<meta charset="utf-8"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
<meta content="object" property="og:type"/>
<meta content="GitLab" property="og:site_name"/>
<meta content="Index · Review apps · Ci · Help" property="og:title"/>
<meta content="GitLab Community Edition" property="og:description"/>
<meta content="http://172.20.254.127/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png" property="og:image"/>
<meta content="64" property="og:image:width"/>
<meta content="64" property="og:image:height"/>
<meta content="http://172.20.254.127/help/ci/review_apps/index.md" property="og:url"/>
<meta content="summary" property="twitter:card"/>
<meta content="Index · Review apps · Ci · Help" property="twitter:title"/>
<meta content="GitLab Community Edition" property="twitter:description"/>
<meta content="http://172.20.254.127/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png" property="twitter:image"/>
<title>Index · Review apps · Ci · Help · GitLab</title>
<meta content="GitLab Community Edition" name="description"/>
<link data-original-href="/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png" href="/assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png" id="favicon" rel="shortcut icon" type="image/png"/>
<link href="/assets/application-266f2bfa52ff531258d13c702895a14fd5994ca591fa2df7338da00ab18c99ac.css" media="all" rel="stylesheet"/>
<link href="/assets/print-c8ff536271f8974b8a9a5f75c0ca25d2b8c1dceb4cff3c01d1603862a0bdcbfc.css" media="print" rel="stylesheet"/>
<script>
//<![CDATA[
window.gon={};gon.api_version="v4";gon.default_avatar_url="http://172.20.254.127/assets/no_avatar-849f9c04a3a0d0cea2424ae97b27447dc64a7dbfae83c036c45b403392f0e8ba.png";gon.max_file_size=10;gon.asset_host=null;gon.webpack_public_path="/assets/webpack/";gon.relative_url_root="";gon.shortcuts_path="/help/shortcuts";gon.user_color_scheme="white";gon.gitlab_url="http://172.20.254.127";gon.revision="63daf37";gon.gitlab_logo="/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png";gon.sprite_icons="/assets/icons-07542808fffaf82e9b57b144464ea42620b32f65ce441c01528d23d4b96d5f11.svg";gon.sprite_file_icons="/assets/file_icons-7262fc6897e02f1ceaf8de43dc33afa5e4f9a2067f4f68ef77dcc87946575e9e.svg";gon.emoji_sprites_css_path="/assets/emoji_sprites-289eccffb1183c188b630297431be837765d9ff4aed6130cf738586fb307c170.css";gon.test_env=false;gon.suggested_label_colors=["#0033CC","#428BCA","#44AD8E","#A8D695","#5CB85C","#69D100","#004E00","#34495E","#7F8C8D","#A295D6","#5843AD","#8E44AD","#FFECDB","#AD4363","#D10069","#CC0033","#FF0000","#D9534F","#D1D100","#F0AD4E","#AD8D43"];
//]]>
</script>
<script defer="defer" src="/assets/webpack/runtime.9fcb75d4.bundle.js"></script>
<script defer="defer" src="/assets/webpack/main.a66b6c66.chunk.js"></script>
<script defer="defer" src="/assets/webpack/pages.help.show.c42c0700.chunk.js"></script>
<meta content="authenticity_token" name="csrf-param">
<meta content="lKkFTwstZn8R6lDLVPgKzwh+gulHmwuJ/EWCzhI7s0PsSFJq4r2lBAAFQrTaDaHXTiYfT9oVBZ6ylpiJuJ1ZUA==" name="csrf-token">
<meta content="origin-when-cross-origin" name="referrer"/>
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport"/>
<meta content="#474D57" name="theme-color"/>
<link href="/assets/touch-icon-iphone-5a9cee0e8a51212e70b90c87c12f382c428870c0ff67d1eb034d884b78d2dae7.png" rel="apple-touch-icon" type="image/x-icon"/>
<link href="/assets/touch-icon-ipad-a6eec6aeb9da138e507593b464fdac213047e49d3093fc30e90d9a995df83ba3.png" rel="apple-touch-icon" sizes="76x76" type="image/x-icon"/>
<link href="/assets/touch-icon-iphone-retina-72e2aadf86513a56e050e7f0f2355deaa19cc17ed97bbe5147847f2748e5a3e3.png" rel="apple-touch-icon" sizes="120x120" type="image/x-icon"/>
<link href="/assets/touch-icon-ipad-retina-8ebe416f5313483d9c1bc772b5bbe03ecad52a54eba443e5215a22caed2a16a2.png" rel="apple-touch-icon" sizes="152x152" type="image/x-icon"/>
<link color="rgb(226, 67, 41)" href="/assets/logo-d36b5212042cebc89b96df4bf6ac24e43db316143e89926c0db839ff694d2de4.svg" rel="mask-icon"/>
<meta content="/assets/msapplication-tile-1196ec67452f618d39cdd85e2e3a542f76574c071051ae7effbfde01710eb17d.png" name="msapplication-TileImage"/>
<meta content="#30353E" name="msapplication-TileColor"/>
</meta></meta></head>
<body class="ui-indigo " data-group="" data-page="help:show" data-project="">
<header class="navbar navbar-gitlab qa-navbar navbar-expand-sm">
<a class="sr-only gl-accessibility" href="#content-body" tabindex="1">Skip to content</a>
<div class="container-fluid">
<div class="header-content">
<div class="title-container">
<h1 class="title">
<a href="/" id="logo" title="Dashboard"><svg class="tanuki-logo" height="24" viewbox="0 0 36 36" width="24">
<path class="tanuki-shape tanuki-left-ear" d="M2 14l9.38 9v-9l-4-12.28c-.205-.632-1.176-.632-1.38 0z" fill="#e24329"></path>
<path class="tanuki-shape tanuki-right-ear" d="M34 14l-9.38 9v-9l4-12.28c.205-.632 1.176-.632 1.38 0z" fill="#e24329"></path>
<path class="tanuki-shape tanuki-nose" d="M18,34.38 3,14 33,14 Z" fill="#e24329"></path>
<path class="tanuki-shape tanuki-left-eye" d="M18,34.38 11.38,14 2,14 6,25Z" fill="#fc6d26"></path>
<path class="tanuki-shape tanuki-right-eye" d="M18,34.38 24.62,14 34,14 30,25Z" fill="#fc6d26"></path>
<path class="tanuki-shape tanuki-left-cheek" d="M2 14L.1 20.16c-.18.565 0 1.2.5 1.56l17.42 12.66z" fill="#fca326"></path>
<path class="tanuki-shape tanuki-right-cheek" d="M34 14l1.9 6.16c.18.565 0 1.2-.5 1.56L18 34.38z" fill="#fca326"></path>
</svg>
<span class="logo-text d-none d-sm-block">
<svg viewbox="0 0 617 169" xmlns="http://www.w3.org/2000/svg"><path d="M315.26 2.97h-21.8l.1 162.5h88.3v-20.1h-66.5l-.1-142.4M465.89 136.95c-5.5 5.7-14.6 11.4-27 11.4-16.6 0-23.3-8.2-23.3-18.9 0-16.1 11.2-23.8 35-23.8 4.5 0 11.7.5 15.4 1.2v30.1h-.1m-22.6-98.5c-17.6 0-33.8 6.2-46.4 16.7l7.7 13.4c8.9-5.2 19.8-10.4 35.5-10.4 17.9 0 25.8 9.2 25.8 24.6v7.9c-3.5-.7-10.7-1.2-15.1-1.2-38.2 0-57.6 13.4-57.6 41.4 0 25.1 15.4 37.7 38.7 37.7 15.7 0 30.8-7.2 36-18.9l4 15.9h15.4v-83.2c-.1-26.3-11.5-43.9-44-43.9M557.63 149.1c-8.2 0-15.4-1-20.8-3.5V70.5c7.4-6.2 16.6-10.7 28.3-10.7 21.1 0 29.2 14.9 29.2 39 0 34.2-13.1 50.3-36.7 50.3m9.2-110.6c-19.5 0-30 13.3-30 13.3v-21l-.1-27.8h-21.3l.1 158.5c10.7 4.5 25.3 6.9 41.2 6.9 40.7 0 60.3-26 60.3-70.9-.1-35.5-18.2-59-50.2-59M77.9 20.6c19.3 0 31.8 6.4 39.9 12.9l9.4-16.3C114.5 6 97.3 0 78.9 0 32.5 0 0 28.3 0 85.4c0 59.8 35.1 83.1 75.2 83.1 20.1 0 37.2-4.7 48.4-9.4l-.5-63.9V75.1H63.6v20.1h38l.5 48.5c-5 2.5-13.6 4.5-25.3 4.5-32.2 0-53.8-20.3-53.8-63-.1-43.5 22.2-64.6 54.9-64.6M231.43 2.95h-21.3l.1 27.3v94.3c0 26.3 11.4 43.9 43.9 43.9 4.5 0 8.9-.4 13.1-1.2v-19.1c-3.1.5-6.4.7-9.9.7-17.9 0-25.8-9.2-25.8-24.6v-65h35.7v-17.8h-35.7l-.1-38.5M155.96 165.47h21.3v-124h-21.3v124M155.96 24.37h21.3V3.07h-21.3v21.3"></path></svg>
</span>
</a></h1>
<ul class="list-unstyled navbar-sub-nav">
<li class="home"><a class="dashboard-shortcuts-projects" href="/explore" title="Projects">Projects
</a></li><li class=""><a class="dashboard-shortcuts-groups" href="/explore/groups" title="Groups">Groups
</a></li><li class=""><a class="dashboard-shortcuts-snippets" href="/explore/snippets" title="Snippets">Snippets
</a></li><li>
<a href="/help" title="About GitLab CE">Help</a>
</li>
</ul>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="nav-item d-none d-sm-none d-md-block m-auto">
<div class="search search-form">
<form accept-charset="UTF-8" action="/search" class="form-inline" method="get"><input name="utf8" type="hidden" value="✓"/><div class="search-input-container">
<div class="search-input-wrap">
<div class="dropdown" data-url="/search/autocomplete">
<input aria-label="Search" autocomplete="off" class="search-input dropdown-menu-toggle no-outline js-search-dashboard-options" data-issues-path="/dashboard/issues" data-mr-path="/dashboard/merge_requests" id="search" name="search" placeholder="Search" spellcheck="false" tabindex="1" type="search"/>
<button class="hidden js-dropdown-search-toggle" data-toggle="dropdown" type="button"></button>
<div class="dropdown-menu dropdown-select">
<div class="dropdown-content"><ul>
<li class="dropdown-menu-empty-item">
<a>
Loading...
</a>
</li>
</ul>
</div><div class="dropdown-loading"><i aria-hidden="true" class="fa fa-spinner fa-spin" data-hidden="true"></i></div>
</div>
<svg class="s16 search-icon"><use xlink:href="/assets/icons-07542808fffaf82e9b57b144464ea42620b32f65ce441c01528d23d4b96d5f11.svg#search"></use></svg>
<svg class="s16 clear-icon js-clear-input"><use xlink:href="/assets/icons-07542808fffaf82e9b57b144464ea42620b32f65ce441c01528d23d4b96d5f11.svg#close"></use></svg>
</div>
</div>
</div>
<input class="js-search-group-options" id="group_id" name="group_id" type="hidden"/>
<input class="js-search-project-options" id="search_project_id" name="project_id" type="hidden" value=""/>
<input id="repository_ref" name="repository_ref" type="hidden"/>
<div class="search-autocomplete-opts hide" data-autocomplete-path="/search/autocomplete"></div>
</form></div>
</li>
<li class="nav-item d-inline-block d-sm-none d-md-none">
<a aria-label="Search" data-container="body" data-placement="bottom" data-toggle="tooltip" href="/search" title="Search"><svg class="s16"><use xlink:href="/assets/icons-07542808fffaf82e9b57b144464ea42620b32f65ce441c01528d23d4b96d5f11.svg#search"></use></svg>
</a></li>
<li class="nav-item">
<div>
<a class="btn btn-sign-in" href="/users/sign_in?redirect_to_referer=yes">Sign in / Register</a>
</div>
</li>
</ul>
</div>
<button class="navbar-toggler d-block d-sm-none" type="button">
<span class="sr-only">Toggle navigation</span>
<svg class="s12 more-icon js-navbar-toggle-right"><use xlink:href="/assets/icons-07542808fffaf82e9b57b144464ea42620b32f65ce441c01528d23d4b96d5f11.svg#more"></use></svg>
<svg class="s12 close-icon js-navbar-toggle-left"><use xlink:href="/assets/icons-07542808fffaf82e9b57b144464ea42620b32f65ce441c01528d23d4b96d5f11.svg#close"></use></svg>
</button>
</div>
</div>
</header>
<div class="layout-page">
<div class="content-wrapper">
<div class="mobile-overlay"></div>
<div class="alert-wrapper">
<nav class="breadcrumbs container-fluid container-limited" role="navigation">
<div class="breadcrumbs-container">
<div class="breadcrumbs-links js-title-container">
<ul class="list-unstyled breadcrumbs-list js-breadcrumbs-list">
<li><a href="/help">Help</a><svg class="s8 breadcrumbs-list-angle"><use xlink:href="/assets/icons-07542808fffaf82e9b57b144464ea42620b32f65ce441c01528d23d4b96d5f11.svg#angle-right"></use></svg></li>
<li>
<h2 class="breadcrumbs-sub-title"><a href="/help/ci/review_apps/index.md">Help</a></h2>
</li>
</ul>
</div>
</div>
</nav>
<div class="flash-container flash-container-page">
</div>
</div>
<div class="container-fluid container-limited ">
<div class="content" id="content-body">
<div class="documentation wiki prepend-top-default">
<h1 dir="auto">
<a aria-hidden="true" class="anchor" href="#getting-started-with-review-apps" id="user-content-getting-started-with-review-apps"></a>Getting started with Review Apps</h1>
<blockquote dir="auto">
</blockquote>
<ul dir="auto">
<li>
<a href="https://gitlab.com/gitlab-org/gitlab-ce/issues/21971" rel="nofollow noreferrer noopener" target="_blank">Introduced</a> in GitLab 8.12. Further additions were made in GitLab
8.13 and 8.14.</li>
<li>Inspired by <a href="https://devcenter.heroku.com/articles/github-integration-review-apps" rel="nofollow noreferrer noopener" target="_blank">Heroku's Review Apps</a> which itself was inspired by
<a href="https://github.com/rainforestapp/fourchette" rel="nofollow noreferrer noopener" target="_blank">Fourchette</a>.</li>
</ul>
<p dir="auto">The basis of Review Apps is the <a href="../environments.md#dynamic-environments">dynamic environments</a> which allow you to create
a new environment (dynamically) for each one of your branches.</p>
<p dir="auto">A Review App can then be visible as a link when you visit the <a href="/user/project/merge_requests.md">merge request</a>
relevant to the branch. That way, you are able to see live all changes introduced
by the merge request changes. Reviewing anything, from performance to interface
changes, becomes much easier with a live environment and as such, Review Apps
can make a huge impact on your development flow.</p>
<p dir="auto">They mostly make sense to be used with web applications, but you can use them
any way you'd like.</p>
<h2 dir="auto">
<a aria-hidden="true" class="anchor" href="#overview" id="user-content-overview"></a>Overview</h2>
<p dir="auto">Simply put, a Review App is a mapping of a branch with an environment as there
is a 1:1 relation between them.</p>
<p dir="auto">Here's an example of what it looks like when viewing a merge request with a
dynamically set environment.</p>
<p dir="auto"><a class="no-attachment-icon" href="/img/review_apps_preview_in_mr.png" rel="noopener noreferrer" target="_blank"><img alt="Review App in merge request" class="lazy" data-src="img/review_apps_preview_in_mr.png" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="/></a></p>
<p dir="auto">In the image above you can see that the <code>add-new-line</code> branch was successfully
built and deployed under a dynamic environment and can be previewed with an
also dynamically URL.</p>
<p dir="auto">The details of the Review Apps implementation depend widely on your real
technology stack and on your deployment process. The simplest case is to
deploy a simple static HTML website, but it will not be that straightforward
when your app is using a database for example. To make a branch be deployed
on a temporary instance and booting up this instance with all required software
and services automatically on the fly is not a trivial task. However, it is
doable, especially if you use Docker, or at least a configuration management
tool like Chef, Puppet, Ansible or Salt.</p>
<h2 dir="auto">
<a aria-hidden="true" class="anchor" href="#prerequisites" id="user-content-prerequisites"></a>Prerequisites</h2>
<p dir="auto">To get a better understanding of Review Apps, you must first learn how
environments and deployments work. The following docs will help you grasp that
knowledge:</p>
<ol dir="auto">
<li>First, learn about <a href="/environments.md">environments</a> and their role in the development workflow.</li>
<li>Then make a small stop to learn about <a href="/variables/README.md">CI variables</a> and how they
can be used in your CI jobs.</li>
<li>Next, explore the <a href="../yaml/README.md#environment"><code>environment</code> syntax</a> as defined in <code>.gitlab-ci.yml</code>.
This will be your primary reference when you are finally comfortable with
how environments work.</li>
<li>Additionally, find out about <a href="../environments.md#manual-actions">manual actions</a> and how you can use them to
deploy to critical environments like production with the push of a button.</li>
<li>And as a last step, follow the <a href="#examples">example tutorials</a> which will
guide you step by step to set up the infrastructure and make use of
Review Apps.</li>
</ol>
<h2 dir="auto">
<a aria-hidden="true" class="anchor" href="#configuration" id="user-content-configuration"></a>Configuration</h2>
<p dir="auto">The configuration of Review apps depends on your technology stack and your
infrastructure. Read the <a href="../environments.md#dynamic-environments">dynamic environments</a> documentation to understand
how to define and create them.</p>
<h2 dir="auto">
<a aria-hidden="true" class="anchor" href="#creating-and-destroying-review-apps" id="user-content-creating-and-destroying-review-apps"></a>Creating and destroying Review Apps</h2>
<p dir="auto">The creation and destruction of a Review App is defined in <code>.gitlab-ci.yml</code>
at a job level under the <code>environment</code> keyword.</p>
<p dir="auto">Check the <a href="/environments.md">environments</a> documentation how to do so.</p>
<h2 dir="auto">
<a aria-hidden="true" class="anchor" href="#a-simple-workflow" id="user-content-a-simple-workflow"></a>A simple workflow</h2>
<p dir="auto">The process of adding Review Apps in your workflow would look like:</p>
<ol dir="auto">
<li>Set up the infrastructure to host and deploy the Review Apps.</li>
<li>
<a href="https://docs.gitlab.com/runner/install/" rel="nofollow noreferrer noopener" target="_blank">Install</a> and <a href="https://docs.gitlab.com/runner/commands/" rel="nofollow noreferrer noopener" target="_blank">configure</a> a Runner that does
the deployment.</li>
<li>Set up a job in <code>.gitlab-ci.yml</code> that uses the predefined
<a href="/variables/README.md">predefined CI environment variable</a> <code>${CI_COMMIT_REF_NAME}</code> to
create dynamic environments and restrict it to run only on branches.</li>
<li>Optionally set a job that <a href="../environments.md#stopping-an-environment">manually stops</a> the Review Apps.</li>
</ol>
<p dir="auto">From there on, you would follow the branched Git flow:</p>
<ol dir="auto">
<li>Push a branch and let the Runner deploy the Review App based on the <code>script</code>
definition of the dynamic environment job.</li>
<li>Wait for the Runner to build and/or deploy your web app.</li>
<li>Click on the link that's present in the MR related to the branch and see the
changes live.</li>
</ol>
<h2 dir="auto">
<a aria-hidden="true" class="anchor" href="#limitations" id="user-content-limitations"></a>Limitations</h2>
<p dir="auto">Check the <a href="../environments.md#limitations">environments limitations</a>.</p>
<h2 dir="auto">
<a aria-hidden="true" class="anchor" href="#examples" id="user-content-examples"></a>Examples</h2>
<p dir="auto">A list of examples used with Review Apps can be found below:</p>
<ul dir="auto">
<li>
<a href="https://gitlab.com/gitlab-examples/review-apps-nginx" rel="nofollow noreferrer noopener" target="_blank">Use with NGINX</a> - Use NGINX and the shell executor of GitLab Runner
to deploy a simple HTML website.</li>
</ul>
<p dir="auto">And below is a soon to be added examples list:</p>
<ul dir="auto">
<li>Use with Amazon S3</li>
<li>Use on Heroku with dpl</li>
<li>Use with OpenShift/kubernetes</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</body>
</html>