From 0400b4b39147a1aeedd09af3cf794f5845391737 Mon Sep 17 00:00:00 2001 From: Evan Read Date: Mon, 10 Sep 2018 13:56:04 +1000 Subject: [PATCH] Add more introductory information to Review Apps page Also includes other refactoring. --- .../img/continuous-delivery-review-apps.svg | 48 ++++++ .../img/review_apps_preview_in_mr.png | Bin 11664 -> 29800 bytes doc/ci/review_apps/index.md | 161 ++++++++---------- 3 files changed, 119 insertions(+), 90 deletions(-) create mode 100644 doc/ci/review_apps/img/continuous-delivery-review-apps.svg diff --git a/doc/ci/review_apps/img/continuous-delivery-review-apps.svg b/doc/ci/review_apps/img/continuous-delivery-review-apps.svg new file mode 100644 index 00000000000..90ac763a01e --- /dev/null +++ b/doc/ci/review_apps/img/continuous-delivery-review-apps.svg @@ -0,0 +1,48 @@ + + + + review-apps-CD-outlined + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/ci/review_apps/img/review_apps_preview_in_mr.png b/doc/ci/review_apps/img/review_apps_preview_in_mr.png index 7d0923f198fa7b26d17e3f939149122283166edd..3e6506a6a3a1193d8ebabe63d930ec1e4b54761b 100644 GIT binary patch literal 29800 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 X3F*sDHVljEe}^h7sLR*LT7>@>R*)_> literal 11664 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 - [Introduced][ce-21971] in GitLab 8.12. Further additions were made in GitLab -> 8.13 and 8.14. -> - Inspired by [Heroku's Review Apps][heroku-apps] which itself was inspired by -> [Fourchette]. +> - [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/21971) in GitLab 8.12. Further additions were made in GitLab 8.13 and 8.14. +> - Inspired by [Heroku's Review Apps](https://devcenter.heroku.com/articles/github-integration-review-apps), which itself was inspired by [Fourchette](https://github.com/rainforestapp/fourchette). -The basis of Review Apps is the [dynamic environments] which allow you to create -a new environment (dynamically) for each one of your branches. - -A Review App can then be visible as a link when you visit the [merge request] -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. - -They mostly make sense to be used with web applications, but you can use them -any way you'd like. +For a video introduction to Review Apps, see [8.14 Webcast: Review Apps & Time Tracking Beta (EE) - GitLab Release](https://www.youtube.com/watch?v=CteZol_7pxo). ## Overview -Simply put, a Review App is a mapping of a branch with an environment as there -is a 1:1 relation between them. +Review Apps are a collaboration tool that takes the hard work out of providing an environment to showcase product changes. -Here's an example of what it looks like when viewing a merge request with a -dynamically set environment. +Review Apps: + +- Provide an automatic live preview of changes made in a feature branch by spinning up a dynamic environment for your merge requests. +- Allow designers and product manages to see your changes without needing to check out your branch and run your changes in a sandbox environment. +- Are fully integrated with the [GitLab DevOps LifeCycle](../../README.md#complete-devops-with-gitlab). +- Allow you to deploy your changes wherever you want. + +![Review Apps Workflow](img/continuous-delivery-review-apps.svg) + +Reviewing anything, from performance to interface changes, becomes much easier with a live environment and so Review Apps can make a large impact on your development flow. + +## What are Review Apps? + +A Review App is a mapping of a branch with an [environment](../environments.md). The following is an example of a merge request with an environment set dynamically. ![Review App in merge request](img/review_apps_preview_in_mr.png) -In the image above you can see that the `add-new-line` branch was successfully -built and deployed under a dynamic environment and can be previewed with an -also dynamically URL. +In this example, you can see a branch was: -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. +- Successfully built. +- Deployed under a dynamic environment that can be reached by clicking on the **View app** button. -## Prerequisites +## How do Review Apps work? -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: +The basis of Review Apps in GitLab is [dynamic environments](../environments.md#dynamic-environments), which allow you to dynamically create a new environment for each branch. -1. First, learn about [environments][] and their role in the development workflow. -1. Then make a small stop to learn about [CI variables][variables] and how they - can be used in your CI jobs. -1. Next, explore the [`environment` syntax][yaml-env] as defined in `.gitlab-ci.yml`. - This will be your primary reference when you are finally comfortable with - how environments work. -1. Additionally, find out about [manual actions][] and how you can use them to - deploy to critical environments like production with the push of a button. -1. And as a last step, follow the [example tutorials](#examples) which will - guide you step by step to set up the infrastructure and make use of - Review Apps. +Access to the Review App is made available as a link on the [merge request](../../user/project/merge_requests.md) relevant to the branch. Review Apps enable you to review all changes proposed by the merge request in live environment. -## Configuration +## Use cases -The configuration of Review apps depends on your technology stack and your -infrastructure. Read the [dynamic environments] documentation to understand -how to define and create them. +Some supported use cases include the: -## Creating and destroying Review Apps +- Simple case of deploying a simple static HTML website. +- More complicated case of an application that uses a database. Deploying a branch 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 possible, especially if you use Docker or a configuration management tool like Chef, Puppet, Ansible, or Salt. -The creation and destruction of a Review App is defined in `.gitlab-ci.yml` -at a job level under the `environment` keyword. +Review Apps usually make sense with web applications, but you can use them any way you'd like. -Check the [environments] documentation how to do so. +## Implementing Review Apps -## A simple workflow +Implementing Review Apps depends on your: -The process of adding Review Apps in your workflow would look like: +- Technology stack. +- Deployment process. + +### Prerequisite Knowledge + +To get a better understanding of Review Apps, review documentation on how environments and deployments work. Before you implement your own Review Apps: + +1. Learn about [environments](../environments.md) and their role in the development workflow. +1. Learn about [CI variables](../variables/README.md) and how they can be used in your CI jobs. +1. Explore the [`environment` syntax](../yaml/README.md#environment) as defined in `.gitlab-ci.yml`. This will become a primary reference. +1. Additionally, find out about [manual actions](../environments.md#manual-actions) and how you can use them to deploy to critical environments like production with the push of a button. +1. Follow the [example tutorials](#examples). These will guide you through setting up infrastructure and using Review Apps. + +### Configuring dynamic environments + +Configuring Review Apps dynamic environments depends on your technology stack and infrastructure. + +For more information, see [dynamic environments](../environments.md#dynamic-environments) documentation to understand how to define and create them. + +### Creating and destroying Review Apps + +Creating and destroying Review Apps is defined in `.gitlab-ci.yml` at a job level under the `environment` keyword. + +For more information, see [Introduction to environments and deployments](../environments.md). + +### Adding Review Apps to your workflow + +The process of adding Review Apps in your workflow is as follows: 1. Set up the infrastructure to host and deploy the Review Apps. -1. [Install][install-runner] and [configure][conf-runner] a Runner that does - the deployment. -1. Set up a job in `.gitlab-ci.yml` that uses the predefined - [predefined CI environment variable][variables] `${CI_COMMIT_REF_NAME}` to - create dynamic environments and restrict it to run only on branches. -1. Optionally set a job that [manually stops][manual-env] the Review Apps. +1. [Install](https://docs.gitlab.com/runner/install/) and [configure](https://docs.gitlab.com/runner/commands/) a Runner to do deployment. +1. Set up a job in `.gitlab-ci.yml` that uses the predefined [predefined CI environment variable](../variables/README.md) `${CI_COMMIT_REF_NAME}` to create dynamic environments and restrict it to run only on branches. +1. Optionally, set a job that [manually stops](../environments.md#stopping-an-environment) the Review Apps. -From there on, you would follow the branched Git flow: +After adding Review Apps to your workflow, you follow the branched Git flow. That is: -1. Push a branch and let the Runner deploy the Review App based on the `script` - definition of the dynamic environment job. -1. Wait for the Runner to build and/or deploy your web app. -1. Click on the link that's present in the MR related to the branch and see the - changes live. +1. Push a branch and let the Runner deploy the Review App based on the `script` definition of the dynamic environment job. +1. Wait for the Runner to build and deploy your web application. +1. Click on the link that provided in the merge request related to the branch to see the changes live. ## Limitations @@ -97,27 +96,9 @@ Check the [environments limitations](../environments.md#limitations). ## Examples -A list of examples used with Review Apps can be found below: +The following are example projects that use Review Apps with: -- [Use with NGINX][app-nginx] - Use NGINX and the shell executor of GitLab Runner - to deploy a simple HTML website. +- [NGINX](https://gitlab.com/gitlab-examples/review-apps-nginx). +- [OpenShift](https://gitlab.com/gitlab-examples/review-apps-openshift). -And below is a soon to be added examples list: - -- Use with Amazon S3 -- Use on Heroku with dpl -- Use with OpenShift/kubernetes - -[app-nginx]: https://gitlab.com/gitlab-examples/review-apps-nginx -[ce-21971]: https://gitlab.com/gitlab-org/gitlab-ce/issues/21971 -[dynamic environments]: ../environments.md#dynamic-environments -[environments]: ../environments.md -[fourchette]: https://github.com/rainforestapp/fourchette -[heroku-apps]: https://devcenter.heroku.com/articles/github-integration-review-apps -[manual actions]: ../environments.md#manual-actions -[merge request]: ../../user/project/merge_requests.md -[variables]: ../variables/README.md -[yaml-env]: ../yaml/README.md#environment -[install-runner]: https://docs.gitlab.com/runner/install/ -[conf-runner]: https://docs.gitlab.com/runner/commands/ -[manual-env]: ../environments.md#stopping-an-environment +See also the video [Demo: Cloud Native Development with GitLab](https://www.youtube.com/watch?v=jfIyQEwrocw), which includes a Review Apps example.