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":"a84097c44e1f76dc9f80279d5c9db2de70bd8e19"}]},{"name":".gitignore","path":".gitignore","sha":"1cd2e7ca72e5102b6b85a0c1de82d28c99d4287e"},{"name":".pre-commit-config.yaml","path":".pre-commit-config.yaml","sha":"5ed0bc7f2115f7400ca8e1dff435c584323c2694"},{"name":"CODEOWNERS","path":"CODEOWNERS","sha":"8756b38c5d955dfa04e10eda748ee62fc361d244"},{"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-Terraform-Terragrunt-Pipeline.adoc","path":"README-Terraform-Terragrunt-Pipeline.adoc","sha":"1ad99530c6cf984aa638e7c2fcd0bf4d4987ce12"},{"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":"c41fc3ee5a4ad6b6a9fd0e4a09e7ee4219d18e6a"},{"name":"output-debug-values.sh","path":"_ci/output-debug-values.sh","sha":"fa613638c76c2031b1427c2daa1d66f71fedad68"}]},{"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":"terraform-icon.png","path":"_docs/terraform-icon.png","sha":"85602f11c76fd989788112ba40c08d979ddb1164"},{"name":"tftg-pipeline-architecture.png","path":"_docs/tftg-pipeline-architecture.png","sha":"a95ebd4883285ae616c62e767e346c036c97389e"},{"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":"ecs-deploy-runner","children":[{"name":"README.md","path":"examples/ecs-deploy-runner/README.md","sha":"f7dbc2c05f78cdeaff779eecfef93594f7a9c175"},{"name":"main.tf","path":"examples/ecs-deploy-runner/main.tf","sha":"deb1a19a18e25342377451940b566aa6e031c287"},{"name":"outputs.tf","path":"examples/ecs-deploy-runner/outputs.tf","sha":"5d043c276e64e390f78fd92f89683423b87812cf"},{"name":"variables.tf","path":"examples/ecs-deploy-runner/variables.tf","sha":"a6512d265d355af883b7a3efe290ca09698bd51c"}]},{"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":"e1f8f860a255eb25cf8411e328c1495d33d2a26f"},{"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":"7f9600fe86cc66496911e24a4c39d14e5dd92ddb"},{"name":"outputs.tf","path":"modules/ec2-backup/outputs.tf","sha":"770744637fcd7cafd98991397b26a82d01524192"},{"name":"vars.tf","path":"modules/ec2-backup/vars.tf","sha":"dd8d61875d9f68596d05bf677a51119750f512e8"}]},{"name":"ecs-deploy-runner-invoke-iam-policy","children":[{"name":"README.md","path":"modules/ecs-deploy-runner-invoke-iam-policy/README.md","sha":"66152227a29ea201358ced76a359bb5f2cfd7c9d"},{"name":"main.tf","path":"modules/ecs-deploy-runner-invoke-iam-policy/main.tf","sha":"4feb1fb6e2e4a1a526a83dd8d8981e3108abe781"},{"name":"outputs.tf","path":"modules/ecs-deploy-runner-invoke-iam-policy/outputs.tf","sha":"8703d962acdf4584375558aa59831c1c873fe606"},{"name":"variables.tf","path":"modules/ecs-deploy-runner-invoke-iam-policy/variables.tf","sha":"566d414f7ef8621e8c7613847d92b77c3e08cbb6"}]},{"name":"ecs-deploy-runner","children":[{"name":"README.adoc","path":"modules/ecs-deploy-runner/README.adoc","sha":"022f8c42447bb64214ecc80dd7bb41b455cb6850"},{"name":"_docs","children":[{"name":"images","children":[{"name":"sequence-diagram.png","path":"modules/ecs-deploy-runner/_docs/images/sequence-diagram.png","sha":"15c9ea45ff27d20fdc23cf918f8c9ba64c0601a3"}]}]},{"name":"core-concepts.md","path":"modules/ecs-deploy-runner/core-concepts.md","sha":"30940f80946ed959dbc974cc35c3b66034d6a64b"},{"name":"docker","children":[{"name":"Dockerfile","path":"modules/ecs-deploy-runner/docker/Dockerfile","sha":"fa5bbaccbfc7baa58f767e90d31f793123fcd04f"},{"name":"known_hosts","path":"modules/ecs-deploy-runner/docker/known_hosts","sha":"de69cda4803d693eacf310c76b900af40a054255"}]},{"name":"invoker-lambda","children":[{"name":"dev_requirements.txt","path":"modules/ecs-deploy-runner/invoker-lambda/dev_requirements.txt","sha":"dcf16d182a3956a52a02581e1602042ba3c5b864"},{"name":"invoker","children":[{"name":"__init__.py","path":"modules/ecs-deploy-runner/invoker-lambda/invoker/__init__.py","sha":"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"},{"name":"exceptions.py","path":"modules/ecs-deploy-runner/invoker-lambda/invoker/exceptions.py","sha":"a0ce583c334ea9b8690384c91cd85e53f4ac74ba"},{"name":"index.py","path":"modules/ecs-deploy-runner/invoker-lambda/invoker/index.py","sha":"7f32d408df0f1762db666233ec9661ade7d1790a"},{"name":"project_logging.py","path":"modules/ecs-deploy-runner/invoker-lambda/invoker/project_logging.py","sha":"7073c22d7c70ee8940a3ab194a2edc3aef554055"},{"name":"types.py","path":"modules/ecs-deploy-runner/invoker-lambda/invoker/types.py","sha":"b797adf4db623fa74d19383a644248723808142c"}]},{"name":"test","children":[{"name":"test_invoker.py","path":"modules/ecs-deploy-runner/invoker-lambda/test/test_invoker.py","sha":"03fd463202e13201c703e07d9dc75e03d20fdf11"}]}]},{"name":"main.tf","path":"modules/ecs-deploy-runner/main.tf","sha":"a18611618f57805f6dd734b6c723d38e7305d43b"},{"name":"main_ecs.tf","path":"modules/ecs-deploy-runner/main_ecs.tf","sha":"76686c7287c37af92896f699f9f36908ee9eb336"},{"name":"main_lambda.tf","path":"modules/ecs-deploy-runner/main_lambda.tf","sha":"57f43f86121ad64a9ddaeebf48f91208fb867a5a"},{"name":"outputs.tf","path":"modules/ecs-deploy-runner/outputs.tf","sha":"60a1ad73865ab89210316c9f61d8a294c57e5e77"},{"name":"variables.tf","path":"modules/ecs-deploy-runner/variables.tf","sha":"bbabd17704b4a8b8057b289533186b147960fc78"}]},{"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":"e6e1d1714bec031d434ff158a99891fb6f9dc8d9"},{"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":"a7f380698b134afecd89d3c3187c021fb2ae170d"},{"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":"1339a8f20e8b96343790f3861a5f0bc85125f4d7"},{"name":"outputs.tf","path":"modules/iam-policies/ecr-docker-push/outputs.tf","sha":"91c35371bd190c90b7e48a23273923f3205447a2"},{"name":"vars.tf","path":"modules/iam-policies/ecr-docker-push/vars.tf","sha":"d8aaeae6205750961e3deaba741ee68180a32ca7"}]},{"name":"ecs-service-deployment","children":[{"name":"README.md","path":"modules/iam-policies/ecs-service-deployment/README.md","sha":"77bb1df6db0d7cd886ee665f1d6566944521b00c"},{"name":"main.tf","path":"modules/iam-policies/ecs-service-deployment/main.tf","sha":"73dd267d5e16b853b6c233f962df8ec8ac50303f"},{"name":"outputs.tf","path":"modules/iam-policies/ecs-service-deployment/outputs.tf","sha":"456e432ea1ac303f0e3f6d72e5a38ef0c4fdd126"},{"name":"vars.tf","path":"modules/iam-policies/ecs-service-deployment/vars.tf","sha":"78c2705c906b853f0e4b18b6c8f2c05e164109bf"}]},{"name":"terraform-remote-state-s3","children":[{"name":"README.md","path":"modules/iam-policies/terraform-remote-state-s3/README.md","sha":"b7892fd6dabecb66909706dbb8941e63e2c56954"},{"name":"main.tf","path":"modules/iam-policies/terraform-remote-state-s3/main.tf","sha":"36b7ceb572efcf59c447f1a8ae34279cb6d8bd3b"},{"name":"outputs.tf","path":"modules/iam-policies/terraform-remote-state-s3/outputs.tf","sha":"19c52170f58f07dced95687dab8b6e6f134d225c"},{"name":"vars.tf","path":"modules/iam-policies/terraform-remote-state-s3/vars.tf","sha":"720084fa0f9cf944b19ba30f59e78efc2e7b96b9"}]},{"name":"terragrunt","children":[{"name":"README.md","path":"modules/iam-policies/terragrunt/README.md","sha":"eccacc553810fa838b23d24718ffb8f70a9a39e5"},{"name":"main.tf","path":"modules/iam-policies/terragrunt/main.tf","sha":"efbcfe3f7ce1e4001588ef1b14625b8c2273d7d8"},{"name":"outputs.tf","path":"modules/iam-policies/terragrunt/outputs.tf","sha":"fbfd6010c9f952f65248fc42897d976a2e26b4e8"},{"name":"vars.tf","path":"modules/iam-policies/terragrunt/vars.tf","sha":"52f0480b69a57d0ff43e76ae26cb17d77dab5069"}]}]},{"name":"infrastructure-deploy-script","children":[{"name":"README.adoc","path":"modules/infrastructure-deploy-script/README.adoc","sha":"bdc742de962f03859b43866ea46e4383ad32f10f"},{"name":"core-concepts.md","path":"modules/infrastructure-deploy-script/core-concepts.md","sha":"e617d3dd528507993c8162811cb6de16328e9ed3"},{"name":"dev_requirements.txt","path":"modules/infrastructure-deploy-script/dev_requirements.txt","sha":"5eaa61caa1ebf937a016037606bb0d2faeb17888"},{"name":"infrastructure_deploy_script","children":[{"name":"__init__.py","path":"modules/infrastructure-deploy-script/infrastructure_deploy_script/__init__.py","sha":"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"},{"name":"deploy.py","path":"modules/infrastructure-deploy-script/infrastructure_deploy_script/deploy.py","sha":"642229cf87f3d9dc4329964d1a64230775a229a5"},{"name":"exceptions.py","path":"modules/infrastructure-deploy-script/infrastructure_deploy_script/exceptions.py","sha":"44e5f7173e4e2aba1abb4b2923c94aa8534f60da"},{"name":"git.py","path":"modules/infrastructure-deploy-script/infrastructure_deploy_script/git.py","sha":"749ace8d9812e8a906eba2d14b6eef4f90c97e02"},{"name":"project_logging.py","path":"modules/infrastructure-deploy-script/infrastructure_deploy_script/project_logging.py","sha":"a72c2a19962838f3375390380dcf444b73e1fcef"},{"name":"py.typed","path":"modules/infrastructure-deploy-script/infrastructure_deploy_script/py.typed","sha":"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"},{"name":"shell.py","path":"modules/infrastructure-deploy-script/infrastructure_deploy_script/shell.py","sha":"f9b98a99686b214a68c8c99d23fd8019a9f68213"},{"name":"ssh.py","path":"modules/infrastructure-deploy-script/infrastructure_deploy_script/ssh.py","sha":"3db8994be058bfa590bbbbdd0476128c44ad5979"},{"name":"terra.py","path":"modules/infrastructure-deploy-script/infrastructure_deploy_script/terra.py","sha":"38a5b01a023142bd0af2064a13ccb7168045434c"}]},{"name":"install.sh","path":"modules/infrastructure-deploy-script/install.sh","sha":"c958f1065315b16e9f0474ee39728a4556c18247"},{"name":"requirements.txt","path":"modules/infrastructure-deploy-script/requirements.txt","sha":"ebe0f49e006828d7147c8ee540a278142e44e618"},{"name":"scripts","children":[{"name":"infrastructure-deploy-script","path":"modules/infrastructure-deploy-script/scripts/infrastructure-deploy-script","sha":"f29cb3f8976d7987e5877565d3b4a106f866c4cb"}]},{"name":"setup.py","path":"modules/infrastructure-deploy-script/setup.py","sha":"0885421ba85af260d5e2d97ebc75e26c76fb25da"},{"name":"test","children":[{"name":"conftest.py","path":"modules/infrastructure-deploy-script/test/conftest.py","sha":"ebae81d85a6ce4997c9d6f4a3d833c617822a0a0"},{"name":"fixtures","children":[{"name":"terraform","children":[{"name":"main.tf","path":"modules/infrastructure-deploy-script/test/fixtures/terraform/main.tf","sha":"362851fda16747e2a39abba071646933e51fbbdf"}]},{"name":"terragrunt","children":[{"name":"terragrunt.hcl","path":"modules/infrastructure-deploy-script/test/fixtures/terragrunt/terragrunt.hcl","sha":"2359b15bc6a698e481a8e99fdb352e174203b925"}]}]},{"name":"test_deploy.py","path":"modules/infrastructure-deploy-script/test/test_deploy.py","sha":"8be69b5d758bec2318a52d5eb7c4a31e5b914085"},{"name":"test_git.py","path":"modules/infrastructure-deploy-script/test/test_git.py","sha":"862852a92b7a7edb7276cdd3cf212e500ca3c8d9"},{"name":"test_shell.py","path":"modules/infrastructure-deploy-script/test/test_shell.py","sha":"fa0f984c4ce6218303d7f9c38c4c20d018411318"}]}]},{"name":"infrastructure-deployer","children":[{"name":"README.adoc","path":"modules/infrastructure-deployer/README.adoc","sha":"a6ba378b13dbe19060f491b23774557cc3abf09c"},{"name":"core-concepts.md","path":"modules/infrastructure-deployer/core-concepts.md","sha":"6d5dffe58cee8ec78c9fcb6ee4783d3127ebd10f"},{"name":"deploy","children":[{"name":"aws.go","path":"modules/infrastructure-deployer/deploy/aws.go","sha":"87815214bc2c690373bace2702631a040c0b2a19"},{"name":"aws_ecs.go","path":"modules/infrastructure-deployer/deploy/aws_ecs.go","sha":"302bb0dfd75838a847b47dc71c290a48ac6e3c5f"},{"name":"deploy.go","path":"modules/infrastructure-deployer/deploy/deploy.go","sha":"444121a8fe44413b11e217bf28b57baf02e291a6"},{"name":"errors.go","path":"modules/infrastructure-deployer/deploy/errors.go","sha":"74d73d20144cbbac68ebe4a7c50a53b204151fb4"}]},{"name":"go.mod","path":"modules/infrastructure-deployer/go.mod","sha":"3ff9d1d2acc87e9dfb6a2ca319307d7c17ccdb14"},{"name":"go.sum","path":"modules/infrastructure-deployer/go.sum","sha":"3ac57b5b909b4991198c08a0c29f9acde9812151"},{"name":"logging","children":[{"name":"logging.go","path":"modules/infrastructure-deployer/logging/logging.go","sha":"a381e79c9e66c762322d49d2a3726a8c66c7ef65"}]},{"name":"main.go","path":"modules/infrastructure-deployer/main.go","sha":"6b630a56fe6992bc7cc1523580193bd2db132f15"}]},{"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":"d6004df66f3b9684ea901f0d41592fca2aceb874"},{"name":"bin","children":[{"name":"git-updated-folders","path":"modules/terraform-helpers/bin/git-updated-folders","sha":"781a8c0348578af693a9430824c29e590bb1922a"},{"name":"terraform-update-variable","path":"modules/terraform-helpers/bin/terraform-update-variable","sha":"8ac66d5d7ac52076ae645d76ae48f5d7c6c58a25"}]},{"name":"install.sh","path":"modules/terraform-helpers/install.sh","sha":"6b7e40c382ec391f64e54efab3367d202b123883"}]}]},{"name":"setup.cfg","path":"setup.cfg","sha":"dbcd773df9356e74782ad58e0a2255ffa188df49"},{"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":"ecs_deploy_runner_test.go","path":"test/ecs_deploy_runner_test.go","sha":"eaea4585025abe421144b6a4a5acd1a2d6ac087e"},{"name":"ecs_deploy_runner_test_helpers.go","path":"test/ecs_deploy_runner_test_helpers.go","sha":"8c323d2e82797044b2686c90547b066535e2fa3e"},{"name":"fixtures","children":[{"name":"git-add-commit-push","children":[{"name":"auto-committed.txt","path":"test/fixtures/git-add-commit-push/auto-committed.txt","sha":"fdb8c850993480e4b4c7fea8c041b7fc1c7c0830"}]},{"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":"tfpipeline","children":[{"name":"failure","children":[{"name":"terraform","children":[{"name":"main.tf","path":"test/fixtures/tfpipeline/failure/terraform/main.tf","sha":"5488bde3fbd03a58398aeeb904cfef74d7200aae"}]},{"name":"terragrunt","children":[{"name":"terragrunt.hcl","path":"test/fixtures/tfpipeline/failure/terragrunt/terragrunt.hcl","sha":"2359b15bc6a698e481a8e99fdb352e174203b925"}]}]},{"name":"nested","children":[{"name":"terraform","children":[{"name":"main.tf","path":"test/fixtures/tfpipeline/nested/terraform/main.tf","sha":"19538a8d8cb3820ffc99138ecf3b19004e7afa8f"}]},{"name":"terragrunt","children":[{"name":"terragrunt.hcl","path":"test/fixtures/tfpipeline/nested/terragrunt/terragrunt.hcl","sha":"2359b15bc6a698e481a8e99fdb352e174203b925"}]}]},{"name":"root","children":[{"name":"terraform","children":[{"name":"main.tf","path":"test/fixtures/tfpipeline/root/terraform/main.tf","sha":"4c38ad94d4d10a46cb1acd012f9b3e5513757ac2"}]},{"name":"terragrunt","children":[{"name":"terragrunt.hcl","path":"test/fixtures/tfpipeline/root/terragrunt/terragrunt.hcl","sha":"2359b15bc6a698e481a8e99fdb352e174203b925"}]}]}]}]},{"name":"git_updated_folders_test.go","path":"test/git_updated_folders_test.go","sha":"f8429b385809cfe3beb234a5fd24de1fef05d29c"},{"name":"go.mod","path":"test/go.mod","sha":"84d6920105974c5ecbc19118f1e17bc91bb55952"},{"name":"go.sum","path":"test/go.sum","sha":"c15a58ff8e3eee155d265b8dc0db9e9ba3bedf1b"},{"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":"infrastructure_deploy_script_test.go","path":"test/infrastructure_deploy_script_test.go","sha":"b22f63ba905480fc3c4a54eb5d523e40f8610c6a"},{"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.31.0/module-ci/modules/jenkins-server\" class=\"preview__body--description--blue\">jenkins-server</a>,\n<a href=\"/repos/v0.31.0/module-ci/modules/install-jenkins\" class=\"preview__body--description--blue\">install-jenkins</a>, and <a href=\"/repos/v0.31.0/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.17.0","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."}