This folder shows an example of how to use the jenkins-server,
install-jenkins, and ec2-backup modules to deploy a Jenkins CI
server in AWS. The server will run on top of an Auto Scaling Group (for high availability), with
an ALB and domain name, an EBS volume to persist data between redeploys, and a Lambda function that will take automatic
nightly snapshots of the EBS volume for backup.
Quick start
To run this example, you need to:
Build a Jenkins AMI
Deploy the Jenkins AMI with Terraform
Login to Jenkins
Build a Jenkins AMI
We create an AMI that has Jenkins and its dependencies installed using the Packer template
under packer/jenkins.json. To build the AMI:
Set the GITHUB_OAUTH_TOKEN environment variable to a valid GitHub auth token with "repo" access. You can generate
one here: https://github.com/settings/tokens
In packer/jenkins.json, configure the AWS region you want to use via the aws_region variable.
To run Jenkins on Ubuntu: packer build -only=ubuntu-ami packer/jenkins.json.
To run Jenkins on CentOS: packer build -only=centos-ami packer/jenkins.json.
Note down the ID of the new AMI, as you'll need it in the next section.
Deploy the Jenkins AMI with Terraform
We have created Terraform configurations to deploy the AMI from the previous step in AWS.
To deploy the Terraform code:
Open vars.tf, set the environment variables specified at the top of the file, and fill in any other variables that
don't have a default:
ami_id: Set this to the ID of the AMI you built in the previous section.
hosted_zone_domain_name: Set this to a domain name for which you have a Public Hosted
Zone in Route
53. You will also need to request a free wildcard TLS certificate for this
domain name using AWS Certificate Manager: e.g., if the domain
name is foo.com, you'll need to request a free certificate for *.foo.com. Getting a cert is a very easy
process that takes only a couple minutes: instructions.
key_pair_name: The EC2 Key Pair to
associate with the Jenkins server. You'll need access to this EC2 Key Pair so you can SSH to the server later.
Run terraform init.
Run terraform plan.
If the plan looks good, run terraform apply.
When apply finishes, it'll output the domain name of your server. Head over to that URL and you'll be prompted to
login to Jenkins.
Login to Jenkins
When you first load Jenkins, it will ask you to enter the initial admin password to unlock it. This password is located
on the Jenkins server itself and the initial login page will show you the path (typically,
/jenkins/secrets/initialAdminPassword). You'll need to SSH to the server to get the password.
Local testing
The Packer template in packer/jenkins.json can build not only an AMI, but also a Docker image with Jenkins installed.
You can run this Docker image on your local computer for faster ("unit") testing:
Set the GITHUB_OAUTH_TOKEN environment variable to a valid GitHub auth token with "repo" access. You can generate
one here: https://github.com/settings/tokens
The docker-compose.yml in this folder will run the scripts in the mock folder to mock out a few dependencies and
boot up Jenkins locally on port 8080. After a few seconds, you should be able to test it by going to
http://localhost:8080.
Questions? Ask away.
We're here to talk about our services, answer any questions, give advice, or just to chat.
{"treedata":{"name":"root","toggled":true,"children":[{"name":".circleci","children":[{"name":"config.yml","path":".circleci/config.yml","sha":"a8a45a30ccefc6d2fc424a47a564aa68af59b8a3"}]},{"name":".gitignore","path":".gitignore","sha":"a2d4f753354776f7f63b55f8082b7eae8bce3e6e"},{"name":".pre-commit-config.yaml","path":".pre-commit-config.yaml","sha":"c727e29761f9d32c212546d1c47ebc05a16b2d37"},{"name":"CODEOWNERS","path":"CODEOWNERS","sha":"32aa600d3eb2abcb4cb30df928b0e6cd28fca80f"},{"name":"LICENSE.txt","path":"LICENSE.txt","sha":"f4e3d9bd4717a044ed31ad847a300eee74371a78"},{"name":"README-CircleCI.adoc","path":"README-CircleCI.adoc","sha":"046b030ed6e15023530d4a29a3dcf60ac7982d27"},{"name":"README-Jenkins.adoc","path":"README-Jenkins.adoc","sha":"2587e3b59001ed39eaac88468202afdcbc2332af"},{"name":"README-TravisCI.adoc","path":"README-TravisCI.adoc","sha":"45e0d32aae5d971ee7e7670dc0da94d364c14457"},{"name":"README.adoc","path":"README.adoc","sha":"47cb10253af3b2e514678434a61ad681c02a88f2"},{"name":"_ci","children":[{"name":"deploy.sh","path":"_ci/deploy.sh","sha":"f264c4d38709566346cd9c443f1cac3ed9b7e49a"},{"name":"output-debug-values.sh","path":"_ci/output-debug-values.sh","sha":"56c4e5a9cdec005280b58d7f70c8095abf668644"}]},{"name":"_docs","children":[{"name":"circleci-cicd-architecture.png","path":"_docs/circleci-cicd-architecture.png","sha":"06f8a55b7c123b6e589333a1ff1c3d90c43222d6"},{"name":"circleci-icon.png","path":"_docs/circleci-icon.png","sha":"d4e8df17858e6f230ff9e8d90ea388b3ff340b79"},{"name":"jenkins-architecture.png","path":"_docs/jenkins-architecture.png","sha":"a35a534eb7f13547e232635262d6b1c1506e9230"},{"name":"jenkins-icon.png","path":"_docs/jenkins-icon.png","sha":"cfb474486acb167b655c22a400fe5cc999959164"},{"name":"travisci-cicd-architecture.png","path":"_docs/travisci-cicd-architecture.png","sha":"c7da609e901de1baba84918893af9016c3da78ed"},{"name":"travisci-icon.png","path":"_docs/travisci-icon.png","sha":"57116e900f797c8f35399929fb3a24b2cf0e7181"}]},{"name":"examples","children":[{"name":"iam-policies","children":[{"name":"README.md","path":"examples/iam-policies/README.md","sha":"4eaf42cd7b4bc254ac9aabfaa8d6c1b4b8cc4281"},{"name":"main.tf","path":"examples/iam-policies/main.tf","sha":"2a1c9d0380b66da922b51e259b0691987de595b1"},{"name":"vars.tf","path":"examples/iam-policies/vars.tf","sha":"ffd4eed9234a389e6809cbb1c149efdbe778578e"}]},{"name":"jenkins","children":[{"name":"README.md","path":"examples/jenkins/README.md","sha":"5c76af2853297fa24f0ab44dc1cdcdf6ba8e1a55","toggled":true},{"name":"docker-compose.yml","path":"examples/jenkins/docker-compose.yml","sha":"cdbb01e4c39d6ad67656d7997355b03027f2358e"},{"name":"main.tf","path":"examples/jenkins/main.tf","sha":"60d9e04a652323da568bbe1bea4b8967e1380559"},{"name":"mock","children":[{"name":"mock-user-data.sh","path":"examples/jenkins/mock/mock-user-data.sh","sha":"610ba8091622d0bbec4301093b63c4263b5939ae"},{"name":"mount-ebs-volume","path":"examples/jenkins/mock/mount-ebs-volume","sha":"faa2394ad8a7a35657fb7f34b2014c7f05224e56"},{"name":"systemctl","path":"examples/jenkins/mock/systemctl","sha":"c656c65a7fd2b411548adb7865bc9c065333ad2e"}]},{"name":"outputs.tf","path":"examples/jenkins/outputs.tf","sha":"c23cb7b34a3e1c87c303e6b6167537f0d8c5853a"},{"name":"packer","children":[{"name":"jenkins.json","path":"examples/jenkins/packer/jenkins.json","sha":"fa01efbd48ad2e5f80859ff5349ac6b2b2cf3522"}]},{"name":"user-data","children":[{"name":"user-data.sh","path":"examples/jenkins/user-data/user-data.sh","sha":"19a4ccc9a1f8cb264d6995473ece0c2b02a0091a"}]},{"name":"vars.tf","path":"examples/jenkins/vars.tf","sha":"9677907a3c79dac888c623251e43e992872d72fe"}],"toggled":true}],"toggled":true},{"name":"modules","children":[{"name":"aws-helpers","children":[{"name":"README.md","path":"modules/aws-helpers/README.md","sha":"2fc74c09e7880238a4c049022f455809549d2ee1"},{"name":"bin","children":[{"name":"publish-ami","path":"modules/aws-helpers/bin/publish-ami","sha":"1d5697d411cbeed05734fb356ffbf598f7e4eeeb"}]},{"name":"install.sh","path":"modules/aws-helpers/install.sh","sha":"2700711d6a80c6f6c218e4b3d5b1b0cfe4d7609b"}]},{"name":"build-helpers","children":[{"name":"README.md","path":"modules/build-helpers/README.md","sha":"0c9d44fcb852f57f1c044eb5f3340ec6e6705076"},{"name":"bin","children":[{"name":"build-docker-image","path":"modules/build-helpers/bin/build-docker-image","sha":"0fde55c7e1985925fe00d2d399b190ae6b2edd26"},{"name":"build-packer-artifact","path":"modules/build-helpers/bin/build-packer-artifact","sha":"655fc4a37acd6402fd13e38fecf84170ef156081"}]},{"name":"install.sh","path":"modules/build-helpers/install.sh","sha":"a132488127b88ef8268399a0b3852aa5e0967a20"}]},{"name":"check-url","children":[{"name":"README.md","path":"modules/check-url/README.md","sha":"070d26ac5f4cf136fc28a69d97df6710a341cf24"},{"name":"bin","children":[{"name":"check-url","path":"modules/check-url/bin/check-url","sha":"4e6c57dd70e0a385fb23814619dc917b7c527e57"}]},{"name":"install.sh","path":"modules/check-url/install.sh","sha":"488fad728f75e4ffb6d7156b7cc9ee9682d60183"}]},{"name":"circleci-helpers","children":[{"name":"README.md","path":"modules/circleci-helpers/README.md","sha":"3e58d0856dd6ae04bbd22814d6243b0225a689d9"},{"name":"bin","children":[{"name":"install-go-version","path":"modules/circleci-helpers/bin/install-go-version","sha":"8a0121205f24358a00af129e729795013ebf7edb"},{"name":"place-repo-in-gopath","path":"modules/circleci-helpers/bin/place-repo-in-gopath","sha":"ac7085bb304a2004050e676bea658f039493fdcc"}]},{"name":"install.sh","path":"modules/circleci-helpers/install.sh","sha":"313288f93c55678a883f53106471a21f8ebbb2fa"}]},{"name":"docs-generator","children":[{"name":"Gopkg.lock","path":"modules/docs-generator/Gopkg.lock","sha":"ed9374f63ba7f58682ce32280d18f1eb8b2c1b64"},{"name":"Gopkg.toml","path":"modules/docs-generator/Gopkg.toml","sha":"4c60aa943b9c6e60b4b29de43dc50de703949053"},{"name":"README.md","path":"modules/docs-generator/README.md","sha":"2f6d3cccf601b029b37d1a1174afb8ef41006b84"},{"name":"cli.go","path":"modules/docs-generator/cli.go","sha":"9b21b3b996f6c9a664e537f62473ba67ac9522f7"},{"name":"cli_test.go","path":"modules/docs-generator/cli_test.go","sha":"5b2b8f8a0ac43aed3d7fe43a0eb4d9eb6e640f56"},{"name":"errors.go","path":"modules/docs-generator/errors.go","sha":"12e1b3be5167b2a5bf2c4ab9571784763c3b2139"},{"name":"file.go","path":"modules/docs-generator/file.go","sha":"739560fb3f7de0355130e5617c6a435bf34fa905"},{"name":"generator.go","path":"modules/docs-generator/generator.go","sha":"17c9aebb915efeb44dec7f7834ea9b963f59cbd9"},{"name":"generator_test.go","path":"modules/docs-generator/generator_test.go","sha":"f3785b83e6869696c0f3e9ebf91d4d1027209186"},{"name":"glob.go","path":"modules/docs-generator/glob.go","sha":"850d3fb4927b9d55a33edfb24691689080ae762c"},{"name":"glob_test.go","path":"modules/docs-generator/glob_test.go","sha":"f64539547ba90ff76bf6307c777b9093debbb4cc"},{"name":"logger.go","path":"modules/docs-generator/logger.go","sha":"512a924261dac04c1254507b31ef9c3a501857ed"},{"name":"main.go","path":"modules/docs-generator/main.go","sha":"9d71ef7296f8ed369d63696d3b67d3b659188adc"},{"name":"placeholder.go","path":"modules/docs-generator/placeholder.go","sha":"1f67dd342324270fc52afe95db3018cfdda00f99"},{"name":"placeholder_test.go","path":"modules/docs-generator/placeholder_test.go","sha":"0a37f79ed169b05af416005218fb761b04613e0e"},{"name":"test-fixtures","children":[{"name":"all-file-types-and-subfolders-copy-everything-output","children":[{"name":"another-subfolder","children":[{"name":"non-documentation-empty.css","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-copy-everything-output/another-subfolder/non-documentation-empty.css","sha":"b2f431e42186ead4b40e69c44bc32e6d635c8a9e"},{"name":"non-documentation.java","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-copy-everything-output/another-subfolder/non-documentation.java","sha":"7477f52ad80bd3ab173dbb90be14733ed7df9a0d"}]},{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-copy-everything-output/documentation.md","sha":"361dc342c8710689cabce350177f9a76c7c273ab"},{"name":"documentation.txt","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-copy-everything-output/documentation.txt","sha":"f2d086f4d9adc789457cb4e3cbb8900c98e38edb"},{"name":"logo.png","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-copy-everything-output/logo.png","sha":"4b4af5bb80a3b81f5b05aeb1fbf06febeb2006a5"},{"name":"non-documentation.yml","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-copy-everything-output/non-documentation.yml","sha":"854b47f81dec8dedf335fa2c4990296b8a1284c6"},{"name":"subfolder","children":[{"name":"another-subfolder","children":[{"name":"documentation-empty.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-copy-everything-output/subfolder/another-subfolder/documentation-empty.md","sha":"dd401f0d6a397258a63a406f3fc3e3c365e396d6"},{"name":"non-documentation.json","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-copy-everything-output/subfolder/another-subfolder/non-documentation.json","sha":"e2ce87d2be184a735ec4b82fb8c36d97dd6bbf6f"}]},{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-copy-everything-output/subfolder/documentation.md","sha":"1b978b8c7d0e1ca8c9a704f1e2b3a0dd10c26c14"},{"name":"non-documentation.tf","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-copy-everything-output/subfolder/non-documentation.tf","sha":"3c62b0cb12adb708af8b66fb44531f66b3133cf6"},{"name":"subfolder","children":[{"name":"non-documentation.sh","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-copy-everything-output/subfolder/subfolder/non-documentation.sh","sha":"18ce52b03559084b48242eb3bcac8095d5619e86"}]}]}]},{"name":"all-file-types-and-subfolders-docs-excluded-output","children":[{"name":"another-subfolder","children":[{"name":"non-documentation-empty.css","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-docs-excluded-output/another-subfolder/non-documentation-empty.css","sha":"b2f431e42186ead4b40e69c44bc32e6d635c8a9e"},{"name":"non-documentation.java","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-docs-excluded-output/another-subfolder/non-documentation.java","sha":"1a50193c47ab5146fb5558774da3da602cc32240"}]},{"name":"non-documentation.yml","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-docs-excluded-output/non-documentation.yml","sha":"179e4e4c6101d2a0856b0c5aba09359558d8dfc2"},{"name":"subfolder","children":[{"name":"another-subfolder","children":[{"name":"non-documentation.json","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-docs-excluded-output/subfolder/another-subfolder/non-documentation.json","sha":"d9c65fab379e06a5fda95ba163c90149cc6ccd90"}]},{"name":"non-documentation.tf","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-docs-excluded-output/subfolder/non-documentation.tf","sha":"a7573bb16167db1119d2976ff008d41755dd9784"},{"name":"subfolder","children":[{"name":"non-documentation.sh","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-docs-excluded-output/subfolder/subfolder/non-documentation.sh","sha":"b9e3ac3cb6328555d8bee673b171f06f777e0d69"}]}]}]},{"name":"all-file-types-and-subfolders-markdown-docs-only-output","children":[{"name":"another-subfolder","children":[{"name":"non-documentation-empty.css","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-markdown-docs-only-output/another-subfolder/non-documentation-empty.css","sha":"b2f431e42186ead4b40e69c44bc32e6d635c8a9e"},{"name":"non-documentation.java","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-markdown-docs-only-output/another-subfolder/non-documentation.java","sha":"1a50193c47ab5146fb5558774da3da602cc32240"}]},{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-markdown-docs-only-output/documentation.md","sha":"361dc342c8710689cabce350177f9a76c7c273ab"},{"name":"documentation.txt","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-markdown-docs-only-output/documentation.txt","sha":"04be4cc1e25385ba4a59ac13daac07488ba28cfc"},{"name":"logo.png","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-markdown-docs-only-output/logo.png","sha":"02568aecb3b3c52059225968993cb2801f1f354f"},{"name":"non-documentation.yml","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-markdown-docs-only-output/non-documentation.yml","sha":"179e4e4c6101d2a0856b0c5aba09359558d8dfc2"},{"name":"subfolder","children":[{"name":"another-subfolder","children":[{"name":"documentation-empty.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-markdown-docs-only-output/subfolder/another-subfolder/documentation-empty.md","sha":"dd401f0d6a397258a63a406f3fc3e3c365e396d6"},{"name":"non-documentation.json","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-markdown-docs-only-output/subfolder/another-subfolder/non-documentation.json","sha":"d9c65fab379e06a5fda95ba163c90149cc6ccd90"}]},{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-markdown-docs-only-output/subfolder/documentation.md","sha":"1b978b8c7d0e1ca8c9a704f1e2b3a0dd10c26c14"},{"name":"non-documentation.tf","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-markdown-docs-only-output/subfolder/non-documentation.tf","sha":"a7573bb16167db1119d2976ff008d41755dd9784"},{"name":"subfolder","children":[{"name":"non-documentation.sh","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-markdown-docs-only-output/subfolder/subfolder/non-documentation.sh","sha":"b9e3ac3cb6328555d8bee673b171f06f777e0d69"}]}]}]},{"name":"all-file-types-and-subfolders-no-matching-doc-patterns-output","children":[{"name":"another-subfolder","children":[{"name":"non-documentation-empty.css","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-no-matching-doc-patterns-output/another-subfolder/non-documentation-empty.css","sha":"b2f431e42186ead4b40e69c44bc32e6d635c8a9e"},{"name":"non-documentation.java","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-no-matching-doc-patterns-output/another-subfolder/non-documentation.java","sha":"1a50193c47ab5146fb5558774da3da602cc32240"}]},{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-no-matching-doc-patterns-output/documentation.md","sha":"34721f2be68a10bd006361d8f293068acff1317d"},{"name":"documentation.txt","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-no-matching-doc-patterns-output/documentation.txt","sha":"04be4cc1e25385ba4a59ac13daac07488ba28cfc"},{"name":"logo.png","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-no-matching-doc-patterns-output/logo.png","sha":"02568aecb3b3c52059225968993cb2801f1f354f"},{"name":"non-documentation.yml","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-no-matching-doc-patterns-output/non-documentation.yml","sha":"179e4e4c6101d2a0856b0c5aba09359558d8dfc2"},{"name":"subfolder","children":[{"name":"another-subfolder","children":[{"name":"documentation-empty.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-no-matching-doc-patterns-output/subfolder/another-subfolder/documentation-empty.md","sha":"dd401f0d6a397258a63a406f3fc3e3c365e396d6"},{"name":"non-documentation.json","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-no-matching-doc-patterns-output/subfolder/another-subfolder/non-documentation.json","sha":"d9c65fab379e06a5fda95ba163c90149cc6ccd90"}]},{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-no-matching-doc-patterns-output/subfolder/documentation.md","sha":"bb93770608db4b7d467ad86bdfcc07991ae7a02b"},{"name":"non-documentation.tf","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-no-matching-doc-patterns-output/subfolder/non-documentation.tf","sha":"a7573bb16167db1119d2976ff008d41755dd9784"},{"name":"subfolder","children":[{"name":"non-documentation.sh","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-no-matching-doc-patterns-output/subfolder/subfolder/non-documentation.sh","sha":"b9e3ac3cb6328555d8bee673b171f06f777e0d69"}]}]}]},{"name":"all-file-types-and-subfolders-output","children":[{"name":"another-subfolder","children":[{"name":"non-documentation-empty.css","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-output/another-subfolder/non-documentation-empty.css","sha":"b2f431e42186ead4b40e69c44bc32e6d635c8a9e"},{"name":"non-documentation.java","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-output/another-subfolder/non-documentation.java","sha":"1a50193c47ab5146fb5558774da3da602cc32240"}]},{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-output/documentation.md","sha":"361dc342c8710689cabce350177f9a76c7c273ab"},{"name":"documentation.txt","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-output/documentation.txt","sha":"f2d086f4d9adc789457cb4e3cbb8900c98e38edb"},{"name":"logo.png","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-output/logo.png","sha":"4b4af5bb80a3b81f5b05aeb1fbf06febeb2006a5"},{"name":"non-documentation.yml","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-output/non-documentation.yml","sha":"179e4e4c6101d2a0856b0c5aba09359558d8dfc2"},{"name":"subfolder","children":[{"name":"another-subfolder","children":[{"name":"documentation-empty.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-output/subfolder/another-subfolder/documentation-empty.md","sha":"dd401f0d6a397258a63a406f3fc3e3c365e396d6"},{"name":"non-documentation.json","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-output/subfolder/another-subfolder/non-documentation.json","sha":"d9c65fab379e06a5fda95ba163c90149cc6ccd90"}]},{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-output/subfolder/documentation.md","sha":"1b978b8c7d0e1ca8c9a704f1e2b3a0dd10c26c14"},{"name":"non-documentation.tf","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-output/subfolder/non-documentation.tf","sha":"a7573bb16167db1119d2976ff008d41755dd9784"},{"name":"subfolder","children":[{"name":"non-documentation.sh","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders-output/subfolder/subfolder/non-documentation.sh","sha":"b9e3ac3cb6328555d8bee673b171f06f777e0d69"}]}]}]},{"name":"all-file-types-and-subfolders","children":[{"name":"another-subfolder","children":[{"name":"non-documentation-empty.css","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders/another-subfolder/non-documentation-empty.css","sha":"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"},{"name":"non-documentation.java","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders/another-subfolder/non-documentation.java","sha":"8098f9f26ec5dd770382cc1b4c93a982ffd70c45"}]},{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders/documentation.md","sha":"6e7f6a1b6b31c0091ab66d99df487068fc1783a9"},{"name":"documentation.txt","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders/documentation.txt","sha":"60303204b8834945d26d9ae7b184b2c7c1f01899"},{"name":"logo.png","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders/logo.png","sha":"4b4af5bb80a3b81f5b05aeb1fbf06febeb2006a5"},{"name":"non-documentation.yml","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders/non-documentation.yml","sha":"048500db13abd24c1896cd48dd1a940b5d6c7487"},{"name":"subfolder","children":[{"name":"another-subfolder","children":[{"name":"documentation-empty.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders/subfolder/another-subfolder/documentation-empty.md","sha":"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"},{"name":"non-documentation.json","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders/subfolder/another-subfolder/non-documentation.json","sha":"07c70839ad3ef7ae3a4a9384a9c6a101a6aeff05"}]},{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders/subfolder/documentation.md","sha":"6e7f6a1b6b31c0091ab66d99df487068fc1783a9"},{"name":"non-documentation.tf","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders/subfolder/non-documentation.tf","sha":"ad0858eea6d1f4ff0fc2cf90403ab64ac4dbd3ce"},{"name":"subfolder","children":[{"name":"non-documentation.sh","path":"modules/docs-generator/test-fixtures/all-file-types-and-subfolders/subfolder/subfolder/non-documentation.sh","sha":"124fe8fc2df0c0886224c922c43d8d70cf5f2292"}]}]}]},{"name":"all-file-types-subfolders-excluded-output","children":[{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/all-file-types-subfolders-excluded-output/documentation.md","sha":"361dc342c8710689cabce350177f9a76c7c273ab"},{"name":"documentation.txt","path":"modules/docs-generator/test-fixtures/all-file-types-subfolders-excluded-output/documentation.txt","sha":"f2d086f4d9adc789457cb4e3cbb8900c98e38edb"},{"name":"logo.png","path":"modules/docs-generator/test-fixtures/all-file-types-subfolders-excluded-output/logo.png","sha":"4b4af5bb80a3b81f5b05aeb1fbf06febeb2006a5"},{"name":"non-documentation.yml","path":"modules/docs-generator/test-fixtures/all-file-types-subfolders-excluded-output/non-documentation.yml","sha":"179e4e4c6101d2a0856b0c5aba09359558d8dfc2"}]},{"name":"generator-tests","children":[{"name":"documentation-no-urls-output.md","path":"modules/docs-generator/test-fixtures/generator-tests/documentation-no-urls-output.md","sha":"3b95d4400f315380acc62f088a656595cc7ca0e9"},{"name":"documentation-no-urls.md","path":"modules/docs-generator/test-fixtures/generator-tests/documentation-no-urls.md","sha":"941274efbebd367c315fa58b279bb35b8c453cb4"},{"name":"documentation-output.txt","path":"modules/docs-generator/test-fixtures/generator-tests/documentation-output.txt","sha":"26fbbeb14a529bdb767fc606b443e59e51ed7105"},{"name":"documentation-with-urls-output.md","path":"modules/docs-generator/test-fixtures/generator-tests/documentation-with-urls-output.md","sha":"87243db4cbb83fd2257ef613567f3ad555ba4efa"},{"name":"documentation-with-urls.md","path":"modules/docs-generator/test-fixtures/generator-tests/documentation-with-urls.md","sha":"95c45e8915cb495e5ae6ffaea794b963ef219c47"},{"name":"documentation.txt","path":"modules/docs-generator/test-fixtures/generator-tests/documentation.txt","sha":"ea4b74ecb7fe418ce2689dcc603641b53fe055a0"},{"name":"logo-output.png","path":"modules/docs-generator/test-fixtures/generator-tests/logo-output.png","sha":"4b4af5bb80a3b81f5b05aeb1fbf06febeb2006a5"},{"name":"logo.png","path":"modules/docs-generator/test-fixtures/generator-tests/logo.png","sha":"4b4af5bb80a3b81f5b05aeb1fbf06febeb2006a5"},{"name":"non-documentation-output.java","path":"modules/docs-generator/test-fixtures/generator-tests/non-documentation-output.java","sha":"b8ee5f7495c8e14abcbac0ff4d275c332ea68992"},{"name":"non-documentation.java","path":"modules/docs-generator/test-fixtures/generator-tests/non-documentation.java","sha":"8098f9f26ec5dd770382cc1b4c93a982ffd70c45"}]},{"name":"no-documentation-output","children":[{"name":"non-documentation.java","path":"modules/docs-generator/test-fixtures/no-documentation-output/non-documentation.java","sha":"b8ee5f7495c8e14abcbac0ff4d275c332ea68992"},{"name":"non-documentation.tf","path":"modules/docs-generator/test-fixtures/no-documentation-output/non-documentation.tf","sha":"5bef10ee8ab662ad833740cd4c9ceb4409ba6039"}]},{"name":"no-documentation","children":[{"name":"non-documentation.java","path":"modules/docs-generator/test-fixtures/no-documentation/non-documentation.java","sha":"8098f9f26ec5dd770382cc1b4c93a982ffd70c45"},{"name":"non-documentation.tf","path":"modules/docs-generator/test-fixtures/no-documentation/non-documentation.tf","sha":"ad0858eea6d1f4ff0fc2cf90403ab64ac4dbd3ce"}]},{"name":"only-documentation-output","children":[{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/only-documentation-output/documentation.md","sha":"361dc342c8710689cabce350177f9a76c7c273ab"},{"name":"documentation.txt","path":"modules/docs-generator/test-fixtures/only-documentation-output/documentation.txt","sha":"f2d086f4d9adc789457cb4e3cbb8900c98e38edb"}]},{"name":"only-documentation","children":[{"name":"documentation.md","path":"modules/docs-generator/test-fixtures/only-documentation/documentation.md","sha":"6e7f6a1b6b31c0091ab66d99df487068fc1783a9"},{"name":"documentation.txt","path":"modules/docs-generator/test-fixtures/only-documentation/documentation.txt","sha":"60303204b8834945d26d9ae7b184b2c7c1f01899"}]}]},{"name":"urls.go","path":"modules/docs-generator/urls.go","sha":"b909b2a6fb1effa0b386d129444c9a5c049fce24"},{"name":"urls_test.go","path":"modules/docs-generator/urls_test.go","sha":"28f828efc795e6f754266b92234d06e1dc3601db"}]},{"name":"ec2-backup","children":[{"name":"README.md","path":"modules/ec2-backup/README.md","sha":"8123dab2b46b585e57e56b001ffd96ae80c525df"},{"name":"backup-lambda-function","children":[{"name":"ec2-snapper_linux_amd64-v0.5.2","path":"modules/ec2-backup/backup-lambda-function/ec2-snapper_linux_amd64-v0.5.2","sha":"11f872d3dde35b44c160eccf3f0adf49cc5bd72f"},{"name":"index.js","path":"modules/ec2-backup/backup-lambda-function/index.js","sha":"555ea9666346d7d57588452a5a9642ff73bcf25e"}]},{"name":"main.tf","path":"modules/ec2-backup/main.tf","sha":"9f60db8997a60e7fb92c17313f0225bb10d0ca31"},{"name":"outputs.tf","path":"modules/ec2-backup/outputs.tf","sha":"770744637fcd7cafd98991397b26a82d01524192"},{"name":"vars.tf","path":"modules/ec2-backup/vars.tf","sha":"dd8d61875d9f68596d05bf677a51119750f512e8"}]},{"name":"git-helpers","children":[{"name":"README.md","path":"modules/git-helpers/README.md","sha":"86803f51a9bdcca05dfd13756fe16088a6363ff4"},{"name":"bin","children":[{"name":"git-add-commit-push","path":"modules/git-helpers/bin/git-add-commit-push","sha":"82199d8c5b70dff536b143653b812662ddc9d57c"},{"name":"git-rebase","path":"modules/git-helpers/bin/git-rebase","sha":"887dd90ba36adc5c0362cbadca79707756535b24"}]},{"name":"install.sh","path":"modules/git-helpers/install.sh","sha":"f22ede2f2f085af0a065dd43ed1279c69dd5a00b"}]},{"name":"gruntwork-module-circleci-helpers","children":[{"name":"README.md","path":"modules/gruntwork-module-circleci-helpers/README.md","sha":"074bc610447d27206bc50ba1a7b06fc95226d369"},{"name":"bin","children":[{"name":"build-go-binaries","path":"modules/gruntwork-module-circleci-helpers/bin/build-go-binaries","sha":"8aca966ed857b2d6d50a7c72c09e9181ae125e3c"},{"name":"configure-environment-for-gruntwork-module","path":"modules/gruntwork-module-circleci-helpers/bin/configure-environment-for-gruntwork-module","sha":"14a69cdfb26d2a5b75c5474b9467031bb02cc4f6"},{"name":"run-go-tests","path":"modules/gruntwork-module-circleci-helpers/bin/run-go-tests","sha":"d5406bdd61dae657ded161cf6f2ca66b17cd5b81"},{"name":"upload-github-release-assets","path":"modules/gruntwork-module-circleci-helpers/bin/upload-github-release-assets","sha":"b86a2f1049b1be58179569ea7fed641d960d1f05"}]},{"name":"install.sh","path":"modules/gruntwork-module-circleci-helpers/install.sh","sha":"a9cc16c05a73cf6c40097608838758a8de64daab"}]},{"name":"iam-policies","children":[{"name":"README.md","path":"modules/iam-policies/README.md","sha":"da28056c8749bc2c46dc99ed16286e14b7c55511"},{"name":"ecr-docker-push","children":[{"name":"README.md","path":"modules/iam-policies/ecr-docker-push/README.md","sha":"6a0a84157fe573f2c7ac1e0bd6e2169b2814f1c0"},{"name":"main.tf","path":"modules/iam-policies/ecr-docker-push/main.tf","sha":"cdeffaebf2282427da8abbfe85561dda51293c01"},{"name":"outputs.tf","path":"modules/iam-policies/ecr-docker-push/outputs.tf","sha":"5701c7b7d7bd8db73d72843c51c3a9bb46023843"},{"name":"vars.tf","path":"modules/iam-policies/ecr-docker-push/vars.tf","sha":"d48f9f98b3f4628ec97afc291fb4ba8dd70d754e"}]},{"name":"ecs-service-deployment","children":[{"name":"README.md","path":"modules/iam-policies/ecs-service-deployment/README.md","sha":"82a64957107f1dfe8f90d0d5b82af7100ca90d74"},{"name":"main.tf","path":"modules/iam-policies/ecs-service-deployment/main.tf","sha":"36fcdb2afbdf1cef77c7b7c9b1012cd6a8f0c21f"},{"name":"outputs.tf","path":"modules/iam-policies/ecs-service-deployment/outputs.tf","sha":"76e27c8d7bd26187005cbc305f6c2be23f3bc099"},{"name":"vars.tf","path":"modules/iam-policies/ecs-service-deployment/vars.tf","sha":"ab0cad7db7b9959111ebc2d7e9e8f2f7f0328731"}]},{"name":"terraform-remote-state-s3","children":[{"name":"README.md","path":"modules/iam-policies/terraform-remote-state-s3/README.md","sha":"837478e6d84aa15acc2bd97cf70c0b83d4427451"},{"name":"main.tf","path":"modules/iam-policies/terraform-remote-state-s3/main.tf","sha":"d99eada5815f9d986bbe9c9976111893a12642e0"},{"name":"outputs.tf","path":"modules/iam-policies/terraform-remote-state-s3/outputs.tf","sha":"6c413301ebe30576ee9c5055c116c007eae9b812"},{"name":"vars.tf","path":"modules/iam-policies/terraform-remote-state-s3/vars.tf","sha":"2c60fb5784bc217acc0c912c2cecc48e48f86e45"}]},{"name":"terragrunt","children":[{"name":"README.md","path":"modules/iam-policies/terragrunt/README.md","sha":"137a34ef5d8c394ade49b08b2bd2f68067435669"},{"name":"main.tf","path":"modules/iam-policies/terragrunt/main.tf","sha":"2d3f2dc8cd82fec125cb36fd426e1953f4643ba0"},{"name":"outputs.tf","path":"modules/iam-policies/terragrunt/outputs.tf","sha":"68e0f6ef422ccf67b24125f3fa9850542929241b"},{"name":"vars.tf","path":"modules/iam-policies/terragrunt/vars.tf","sha":"bb1d41b32ca9a103dd3b3e72ea6b01aa35e22514"}]}]},{"name":"install-jenkins","children":[{"name":"README.md","path":"modules/install-jenkins/README.md","sha":"f3c33b9c09257522281a7be9687a53b343bc1fd8"},{"name":"install.sh","path":"modules/install-jenkins/install.sh","sha":"30b1f9f60c29ce75b8bd00d5df106fe7178a7017"},{"name":"run-jenkins","path":"modules/install-jenkins/run-jenkins","sha":"d73823a893790ac1027e6c6d34889e03a60096eb"}]},{"name":"jenkins-server","children":[{"name":"README.md","path":"modules/jenkins-server/README.md","sha":"49ecb595ff9883d9a77ddfebe1369e25f1692890"},{"name":"main.tf","path":"modules/jenkins-server/main.tf","sha":"15a78ff89ac7ae5eec58c70806adb2b22da31759"},{"name":"outputs.tf","path":"modules/jenkins-server/outputs.tf","sha":"5670bd47368b97e5eeedcca805a28a337230e9e2"},{"name":"vars.tf","path":"modules/jenkins-server/vars.tf","sha":"86dec8ea74e61afba2b48f950f97ff783fa2937c"}]},{"name":"kubernetes-circleci-helpers","children":[{"name":"README.md","path":"modules/kubernetes-circleci-helpers/README.md","sha":"833fef8b04c17c43b10c680fad7db3aa7da2e8ad"},{"name":"bin","children":[{"name":"setup-minikube","path":"modules/kubernetes-circleci-helpers/bin/setup-minikube","sha":"142ca1af8c9fbb954d3640f3186a410c3331985d"}]},{"name":"install.sh","path":"modules/kubernetes-circleci-helpers/install.sh","sha":"2ae8670872407ceb2c434dc5b117ae14073af9a2"}]},{"name":"terraform-helpers","children":[{"name":"README.md","path":"modules/terraform-helpers/README.md","sha":"6484c7c8f8b67bca9e0f128b52d0451a9a766b0f"},{"name":"bin","children":[{"name":"terraform-update-variable","path":"modules/terraform-helpers/bin/terraform-update-variable","sha":"8ac66d5d7ac52076ae645d76ae48f5d7c6c58a25"}]},{"name":"install.sh","path":"modules/terraform-helpers/install.sh","sha":"7ed105646899dc02ef28e6e0569d6fbea7f42447"}]}]},{"name":"test","children":[{"name":"README.md","path":"test/README.md","sha":"6e1ceee7e9a037225f0674121b4fada50d2f8d67"},{"name":"build_docker_image_test.go","path":"test/build_docker_image_test.go","sha":"9b3dac61e083049cd10277bcabab5904bfc869ac"},{"name":"build_helpers.go","path":"test/build_helpers.go","sha":"8475977fda1ed59c83c272b13c38e81478ef63b9"},{"name":"build_packer_artifact_test.go","path":"test/build_packer_artifact_test.go","sha":"98dca3b411e5b36362b81e2652c680924d7ecdab"},{"name":"check_url_test.go","path":"test/check_url_test.go","sha":"6e099e94ab237cc9f140fa3aba9f6b8e253e624d"},{"name":"fixtures","children":[{"name":"git-add-commit-push","children":[{"name":"auto-committed.txt","path":"test/fixtures/git-add-commit-push/auto-committed.txt","sha":"1da6d39bc2a7f27edca58ca0ae171f1060acb16a"}]},{"name":"hello-world-go-app","children":[{"name":"main.go","path":"test/fixtures/hello-world-go-app/main.go","sha":"3e0c7643f51386747f1b85656a0c797f282aed04"}]},{"name":"test-docker-image","children":[{"name":"Dockerfile","path":"test/fixtures/test-docker-image/Dockerfile","sha":"5de35bbecce145045ae22fbc5fb97c133568a1ff"},{"name":"test.sh","path":"test/fixtures/test-docker-image/test.sh","sha":"ef3083cf7f3436ac7d01acfa33e4dab143fbcafd"}]},{"name":"test-go-test-files","children":[{"name":"simple_test.go","path":"test/fixtures/test-go-test-files/simple_test.go","sha":"53007ca88996e540ddfc503ce42982bdd5e785d2"},{"name":"test.sh","path":"test/fixtures/test-go-test-files/test.sh","sha":"25b8ef156d589c8d088d026b422e3b9c751c4b53"}]},{"name":"test-packer-image","children":[{"name":"hello-world-multiple-builders.json","path":"test/fixtures/test-packer-image/hello-world-multiple-builders.json","sha":"e09479bf9c86e63e69daaac08faf4094c9cc5bf7"},{"name":"hello-world-one-builder.json","path":"test/fixtures/test-packer-image/hello-world-one-builder.json","sha":"499d94ac898e20ddcf62979adff37852892c84a6"}]},{"name":"test-tfvars-files","children":[{"name":"multiple-similar-variables.tfvars","path":"test/fixtures/test-tfvars-files/multiple-similar-variables.tfvars","sha":"8147977dee3d9a196177c575cd664354c601e68f"},{"name":"multiple-variables-and-comments.tfvars","path":"test/fixtures/test-tfvars-files/multiple-variables-and-comments.tfvars","sha":"8b757cfa5ed1d5049c478ed9180b9e9a5743335e"},{"name":"one-variable-extra-whitespace.tfvars","path":"test/fixtures/test-tfvars-files/one-variable-extra-whitespace.tfvars","sha":"743b02f7015bd51232f9c40564c654f424cbb523"},{"name":"one-variable-no-whitespace.tfvars","path":"test/fixtures/test-tfvars-files/one-variable-no-whitespace.tfvars","sha":"39ddb49aa78f683e3e45384d2440a904d0ad7ec9"},{"name":"one-variable.tfvars","path":"test/fixtures/test-tfvars-files/one-variable.tfvars","sha":"82a0cea8ac06d9534dd2549c73ae70afd47336bb"}]},{"name":"test-tghcl-files","children":[{"name":"multiple-similar-variables.hcl","path":"test/fixtures/test-tghcl-files/multiple-similar-variables.hcl","sha":"8224297de9667b6887136c897b473977f7013fc0"},{"name":"multiple-variables-and-comments.hcl","path":"test/fixtures/test-tghcl-files/multiple-variables-and-comments.hcl","sha":"1905719b9208e53d78a9bced9792194f6955f928"},{"name":"one-variable-extra-whitespace.hcl","path":"test/fixtures/test-tghcl-files/one-variable-extra-whitespace.hcl","sha":"aa09bc5beacd10b66660e71173d16f3b093e9415"},{"name":"one-variable-no-whitespace.hcl","path":"test/fixtures/test-tghcl-files/one-variable-no-whitespace.hcl","sha":"8e77e4baf099fdb7f1e1d1571725c835ac92093a"},{"name":"one-variable.hcl","path":"test/fixtures/test-tghcl-files/one-variable.hcl","sha":"0afe11b72b3635feb75d71d7aff4cc28806a7f67"}]}]},{"name":"go.mod","path":"test/go.mod","sha":"02fe7c77376560ed910495b279be0627c32b8b4f"},{"name":"go.sum","path":"test/go.sum","sha":"df9d4c5d5e6cec23fc56918951ea6e3a8c9ccf7d"},{"name":"gruntwork_module_circleci_helpers_integration_test.go","path":"test/gruntwork_module_circleci_helpers_integration_test.go","sha":"d4de824393fad25ae23f1667b1efef30b98ab365"},{"name":"iam_policies_test.go","path":"test/iam_policies_test.go","sha":"75daff44988b41977dcfd064c868f038f77ffbb0"},{"name":"jenkins_test.go","path":"test/jenkins_test.go","sha":"fb2c9a0fd22e496833b7eed5c8821b9e54a6856a"},{"name":"kubernetes_circleci_helpers_test.go","path":"test/kubernetes_circleci_helpers_test.go","sha":"76a87d2854c2c7cf0a57c56582796b9cdb533c1b"},{"name":"publish_ami_test.go","path":"test/publish_ami_test.go","sha":"c5ca4d2b9db3d2bc75f3e732747198efa0c27e66"},{"name":"terraform_update_variable_unit_test.go","path":"test/terraform_update_variable_unit_test.go","sha":"e1469d18b1a1dbdf6c193589549bcac662c61e1e"},{"name":"terragrunt_update_variable_unit_test.go","path":"test/terragrunt_update_variable_unit_test.go","sha":"4adb82100c62f799380dea99f76f22be7f5ebbb2"},{"name":"test-git-add-commit-push.sh","path":"test/test-git-add-commit-push.sh","sha":"95fd142ed3d26e85c2873ee55c0e2718f0927ffd"}]},{"name":"testdep","children":[{"name":"Gopkg.lock","path":"testdep/Gopkg.lock","sha":"f12dfa4652085a0043d69d1b3bff7cc16b64551f"},{"name":"Gopkg.toml","path":"testdep/Gopkg.toml","sha":"092de38583d1bb2aff2b194753b7cc18aecddd87"},{"name":"dep_test.go","path":"testdep/dep_test.go","sha":"b87facc135093c5258a5f2da43e5f9177bc008b7"},{"name":"fixtures","children":[{"name":"hello-world-godep-app","children":[{"name":"Gopkg.lock","path":"testdep/fixtures/hello-world-godep-app/Gopkg.lock","sha":"623c785ee006b1ff3c524d18935ebdeb45395d55"},{"name":"Gopkg.toml","path":"testdep/fixtures/hello-world-godep-app/Gopkg.toml","sha":"26f5a8f783bb942cf6fba93c10b6a09017329526"},{"name":"main.go","path":"testdep/fixtures/hello-world-godep-app/main.go","sha":"0a09ad54ada955edd8e8ae731e0c113cc708766c"}]}]}]}]},"detailsContent":"<h1 class=\"preview__body--title\" id=\"jenkins-example\">Jenkins example</h1><div class=\"preview__body--border\"></div><p>This folder shows an example of how to use the <a href=\"/repos/v0.33.3/module-ci/modules/jenkins-server\" class=\"preview__body--description--blue\">jenkins-server</a>,\n<a href=\"/repos/v0.33.3/module-ci/modules/install-jenkins\" class=\"preview__body--description--blue\">install-jenkins</a>, and <a href=\"/repos/v0.33.3/module-ci/modules/ec2-backup\" class=\"preview__body--description--blue\">ec2-backup</a> modules to deploy a <a href=\"https://jenkins.io\" class=\"preview__body--description--blue\" target=\"_blank\">Jenkins CI\nserver</a> in AWS. The server will run on top of an Auto Scaling Group (for high availability), with\nan ALB and domain name, an EBS volume to persist data between redeploys, and a Lambda function that will take automatic\nnightly snapshots of the EBS volume for backup.</p>\n<h2 class=\"preview__body--subtitle\" id=\"quick-start\">Quick start</h2>\n<p>To run this example, you need to:</p>\n<ol>\n<li>Build a Jenkins AMI</li>\n<li>Deploy the Jenkins AMI with Terraform</li>\n<li>Login to Jenkins</li>\n</ol>\n<h3 class=\"preview__body--subtitle\" id=\"build-a-jenkins-ami\">Build a Jenkins AMI</h3>\n<p>We create an AMI that has Jenkins and its dependencies installed using the <a href=\"https://www.packer.io/\" class=\"preview__body--description--blue\" target=\"_blank\">Packer</a> template\nunder <code>packer/jenkins.json</code>. To build the AMI:</p>\n<ol>\n<li>Set up your <a href=\"https://www.packer.io/docs/builders/amazon.html\" class=\"preview__body--description--blue\" target=\"_blank\">AWS credentials as environment variables</a>.</li>\n<li>Set the <code>GITHUB_OAUTH_TOKEN</code> environment variable to a valid GitHub auth token with "repo" access. You can generate\none here: https://github.com/settings/tokens</li>\n<li>In <code>packer/jenkins.json</code>, configure the AWS region you want to use via the <code>aws_region</code> variable.</li>\n<li>To run Jenkins on Ubuntu: <code>packer build -only=ubuntu-ami packer/jenkins.json</code>.</li>\n<li>To run Jenkins on CentOS: <code>packer build -only=centos-ami packer/jenkins.json</code>.</li>\n</ol>\n<p>Note down the ID of the new AMI, as you'll need it in the next section.</p>\n<h3 class=\"preview__body--subtitle\" id=\"deploy-the-jenkins-ami-with-terraform\">Deploy the Jenkins AMI with Terraform</h3>\n<p>We have created <a href=\"https://www.terraform.io/\" class=\"preview__body--description--blue\" target=\"_blank\">Terraform</a> configurations to deploy the AMI from the previous step in AWS.\nTo deploy the Terraform code:</p>\n<ol>\n<li>Open <code>vars.tf</code>, set the environment variables specified at the top of the file, and fill in any other variables that\ndon't have a default:\n<ol>\n<li><code>ami_id</code>: Set this to the ID of the AMI you built in the previous section.</li>\n<li><code>hosted_zone_domain_name</code>: Set this to a domain name for which you have a <a href=\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/AboutHZWorkingWith.html\" class=\"preview__body--description--blue\" target=\"_blank\">Public Hosted\nZone</a> in <a href=\"https://aws.amazon.com/route53/\" class=\"preview__body--description--blue\" target=\"_blank\">Route\n53</a>. You will also need to request a free wildcard TLS certificate for this\ndomain name using <a href=\"https://aws.amazon.com/certificate-manager/\" class=\"preview__body--description--blue\" target=\"_blank\">AWS Certificate Manager</a>: e.g., if the domain\nname is <code>foo.com</code>, you'll need to request a free certificate for <code>*.foo.com</code>. Getting a cert is a very easy\nprocess that takes only a couple minutes: <a href=\"https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request.html\" class=\"preview__body--description--blue\" target=\"_blank\">instructions</a>.</li>\n<li><code>key_pair_name</code>: The <a href=\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html\" class=\"preview__body--description--blue\" target=\"_blank\">EC2 Key Pair</a> to\nassociate with the Jenkins server. You'll need access to this EC2 Key Pair so you can SSH to the server later.</li>\n</ol>\n</li>\n<li>Run <code>terraform init</code>.</li>\n<li>Run <code>terraform plan</code>.</li>\n<li>If the plan looks good, run <code>terraform apply</code>.</li>\n</ol>\n<p>When <code>apply</code> finishes, it'll output the domain name of your server. Head over to that URL and you'll be prompted to\nlogin to Jenkins.</p>\n<h3 class=\"preview__body--subtitle\" id=\"login-to-jenkins\">Login to Jenkins</h3>\n<p>When you first load Jenkins, it will ask you to enter the initial admin password to unlock it. This password is located\non the Jenkins server itself and the initial login page will show you the path (typically,\n<code>/jenkins/secrets/initialAdminPassword</code>). You'll need to SSH to the server to get the password.</p>\n<h2 class=\"preview__body--subtitle\" id=\"local-testing\">Local testing</h2>\n<p>The Packer template in <code>packer/jenkins.json</code> can build not only an AMI, but also a Docker image with Jenkins installed.\nYou can run this Docker image on your local computer for faster ("unit") testing:</p>\n<ol>\n<li>Set the <code>GITHUB_OAUTH_TOKEN</code> environment variable to a valid GitHub auth token with "repo" access. You can generate\none here: https://github.com/settings/tokens</li>\n<li>To run Jenkins on Ubuntu:\n<ol>\n<li><code>packer build -only=ubuntu-docker packer/jenkins.json</code></li>\n<li><code>docker-compose run --service-ports jenkins_ubuntu</code></li>\n</ol>\n</li>\n<li>To run Jenkins on CentOS:\n<ol>\n<li><code>packer build -only=centos-docker packer/jenkins.json</code></li>\n<li><code>docker-compose run --service-ports jenkins_centos</code></li>\n</ol>\n</li>\n</ol>\n<p>The <code>docker-compose.yml</code> in this folder will run the scripts in the <code>mock</code> folder to mock out a few dependencies and\nboot up Jenkins locally on port 8080. After a few seconds, you should be able to test it by going to\nhttp://localhost:8080.</p>\n","repoName":"module-ci","repoRef":"v0.16.2","serviceDescriptor":{"serviceName":"Jenkins","serviceRepoName":"module-ci","serviceRepoOrg":"gruntwork-io","cloudProviders":["aws"],"description":"Deploy Jenkins and configure CI / CD pipelines for your apps as code using Jenkinsfiles and Gruntwork build and deploy scripts.","imageUrl":"jenkins.png","licenseType":"subscriber","technologies":["Terraform","Bash"],"compliance":[],"tags":[""]},"serviceCategoryName":"CI / CD","fileName":"README.md","filePath":"/examples/jenkins","title":"Repo Browser: Jenkins","description":"Browse the repos in the Gruntwork Infrastructure as Code Library."}