Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/eddywashere/codebuilder
An AWS CodeBuild project optimized for multiple source repos & any combination of buildspec based scripts from config values
https://github.com/eddywashere/codebuilder
aws aws-codebuild aws-lambda aws-step-function codebuild lambda state-machine stepfunctions
Last synced: 25 days ago
JSON representation
An AWS CodeBuild project optimized for multiple source repos & any combination of buildspec based scripts from config values
- Host: GitHub
- URL: https://github.com/eddywashere/codebuilder
- Owner: eddywashere
- Created: 2017-06-19T00:18:08.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2017-06-19T03:05:26.000Z (over 7 years ago)
- Last Synced: 2024-09-19T14:13:57.073Z (about 2 months ago)
- Topics: aws, aws-codebuild, aws-lambda, aws-step-function, codebuild, lambda, state-machine, stepfunctions
- Language: JavaScript
- Size: 73.2 KB
- Stars: 5
- Watchers: 2
- Forks: 6
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# codebuilder
An AWS CodeBuild project optimized for multiple source repos & any combination of buildspec based scripts from config values. This is achieved by pointing a single CodeBuild project to this projects CI tooling and moving `buildspec.yml` build phases to environment variables.
Inspiration:
- I wanted to be able to execute longer running scripts (lambda limits 3)
- I wanted to [avoid](https://blog.travis-ci.com/2017-05-08-security-advisory) having AWS credentials on third party services
- I also wanted something like deploybot.com, or a chatbot for running one off scripts like publishing npm packages
- I want a cheaper alternative to paid versions of circle/travis ci, and code pipeline didn't work out for me## AWS Services Overview
- CodeBuild - we'll utilize this service for it's per-minute based pricing <3
- S3 - A single bucket to host the CI tooling scripts that we'll point the CodeBuild project
- Lambda - A single lambda to handle the Step Function State transitions
- Step Function State Machine - Creates a CodeBuild execution, waits for completion, logs completion status![state-machine-preview](./state-machine-preview.png)
## Getting started
### Provision AWS resources with Terraform
Read through `terraform/main.tf` and update variable names for your environment and remote state s3 bucket.
Create the s3 bucket for terraform remote state:
```
BUCKET=codebuilder-tf npm run tf:create:remote
```Initialize the terraform state
```
npm run tf:init
```Run `terraform plan` to see what resources will be provisioned
```
npm run tf:plan
```If that looks right, run `terraform apply` to create the resources in AWS
```
npm run tf:apply
```### Upload CI tooling to S3
Replace bucket name with the bucket created via terraform.
```
BUCKET=codebuilder-tools npm run upload-tools
```### Deploy Lambda
Replace the placeholder lambda function code that terraform uploaded by deploying the new code with claudia.js.
```
npm run claudia:update
```### Run an example codebuilder step function
This example will clone, test, build, and deploy a [static react site](https://github.com/eddywashere/sample-create-react-app) to s3.
First create a bucket and configure it for static site hosting. (For convenience I've added those scripts to this project)
```
BUCKET=sample-create-react-app npm run s3:create-bucket
BUCKET=sample-create-react-app npm run s3:configure-bucket
```Start your first codebuilder state function by running:
```
npm run codebuilder
```## codebuilder config
The following config variables determine which project and branch to build
```
CI_REPO
# example: CI_REPO=eddywashere/sample-create-react-appCI_COMMIT
# example: CI_COMMIT=feature-branch
# example: CI_COMMIT=c420de0
```The following config variables are available to dynamically set your scripts in the CodeBuild execution.
```
CI_SCRIPT_INSTALL
# example: CI_SCRIPT_INSTALL="npm install yarn -g && yarn install --silent"CI_SCRIPT_PRE_BUILD
# example: CI_SCRIPT_PRE_BUILD="npm run test"CI_SCRIPT_BUILD
# example: CI_SCRIPT_BUILD="npm run build"CI_SCRIPT_POST_BUILD
# example: CI_SCRIPT_POST_BUILD="npm run s3:upload"
```## Working with Secrets
Each project that you'd like to run scripts against should use parameter store to get encrypted secrets.
### Ideas
- Looking into setting up an SNS topic and or github pr status integration