Skip to content

Commit

Permalink
Refactor code (#17)
Browse files Browse the repository at this point in the history
  • Loading branch information
lakkeger authored Jun 4, 2024
1 parent e302a13 commit 4b405a2
Show file tree
Hide file tree
Showing 11 changed files with 490 additions and 86 deletions.
91 changes: 78 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
name: LocalStack Test
on:
push:
paths-ignore:
- ./*.md
- LICENSE
pull_request:
paths-ignore:
- ./*.md
- LICENSE
workflow_dispatch:
schedule:
- cron: '48 23 * * 0'
Expand All @@ -13,17 +19,24 @@ jobs:
steps:
- uses: actions/checkout@v3

# We must hack the action call as remote to be able to use the relative paths
# Could it break with different CWD? 🤔
- name: Start LocalStack
uses: ./
uses: jenseng/dynamic-uses@v1
with:
image-tag: 'latest'
install-awslocal: 'true'
configuration: DEBUG=1
use-pro: 'true'
uses: LocalStack/setup-localstack@${{ env.GH_ACTION_VERSION }}
with: |-
{
"image-tag": "latest",
"install-awslocal": "true",
"configuration": "DEBUG=1",
"use-pro": "true",
}
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
GH_ACTION_VERSION: ${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}

- name: Run Tests against LocalStack
- name: Run Tests Against LocalStack
run: |
awslocal s3 mb s3://test
awslocal s3 ls
Expand All @@ -37,23 +50,75 @@ jobs:
uses: actions/checkout@v3

- name: Start LocalStack
uses: ./
uses: jenseng/dynamic-uses@v1
with:
image-tag: 'latest'
install-awslocal: 'true'
use-pro: 'true'
uses: LocalStack/setup-localstack@${{ env.GH_ACTION_VERSION }}
with: |-
{
"image-tag": "latest",
"install-awslocal": "true",
"configuration": "DEBUG=1",
"use-pro": "true",
}
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
GH_ACTION_VERSION: ${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}

- name: Run AWS commands
run: |
awslocal s3 mb s3://test
awslocal sqs create-queue --queue-name test-queue
- name: Save the Cloud Pod
uses: LocalStack/setup-localstack/cloud-pods@main
uses: jenseng/dynamic-uses@v1
with:
name: cloud-pods-test
action: save
uses: LocalStack/setup-localstack@${{ env.GH_ACTION_VERSION }}
with: |-
{
"state-name": "cloud-pods-test",
"state-action": "save",
}
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
GH_ACTION_VERSION: ${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}

local-state-test:
name: 'Test Local State Action'
runs-on: ubuntu-latest
steps:
- name: ⚡️ Checkout the repository
uses: actions/checkout@v3

- name: Start LocalStack
uses: jenseng/dynamic-uses@v1
with:
uses: LocalStack/setup-localstack@${{ env.GH_ACTION_VERSION }}
with: |-
{
"image-tag": "latest",
"install-awslocal": "true",
"configuration": "DEBUG=1",
"use-pro": "true",
}
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
GH_ACTION_VERSION: ${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}

- name: Run AWS Commands
run: |
awslocal s3 mb s3://test
awslocal sqs create-queue --queue-name test-queue
- name: Save the State Artifact
uses: jenseng/dynamic-uses@v1
with:
uses: LocalStack/setup-localstack@${{ env.GH_ACTION_VERSION }}
with: |-
{
"state-name": "cloud-pods-test",
"state-action": "save",
"state-backend": "local",
}
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
GH_ACTION_VERSION: ${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}
32 changes: 25 additions & 7 deletions .github/workflows/ephemeral.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,32 @@ jobs:
steps:
- uses: actions/checkout@v3

- name: Deploy Preview
uses: ./preview
- name: Deploy Ephemeral Instance
uses: jenseng/dynamic-uses@v1
with:
localstack-api-key: ${{ secrets.LOCALSTACK_API_KEY }}
github-token: ${{ secrets.GITHUB_TOKEN }}
uses: LocalStack/setup-localstack@${{ env.GH_ACTION_VERSION }}
with: |-
{
"github-token": "${{ secrets.GITHUB_TOKEN }}",
"state-backend": "ephemeral",
"state-action": "start",
"skip-ephemeral-stop": "true"
}
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
GH_ACTION_VERSION: ${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}

# We want explicit shutdown
- name: Shutdown ephemeral instance
uses: ./ephemeral/shutdown
uses: jenseng/dynamic-uses@v1
with:
localstack-api-key: ${{ secrets.LOCALSTACK_API_KEY }}
github-token: ${{ secrets.GITHUB_TOKEN }}
uses: LocalStack/setup-localstack@${{ env.GH_ACTION_VERSION }}
with: |-
{
"github-token": "${{ secrets.GITHUB_TOKEN }}",
"state-backend": "ephemeral",
"state-action": "stop"
}
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
GH_ACTION_VERSION: ${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}
119 changes: 109 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,120 @@ A GitHub Action to setup [LocalStack](https://github.com/localstack/localstack)
- Pulling a specific version of the LocalStack Docker Image into the GitHub Action runner.
- Configuring the [LocalStack CLI](https://docs.localstack.cloud/get-started/#localstack-cli) to launch the Docker container with an optional API token for pro usage.
- Installing [LocalStack AWS CLI](https://github.com/localstack/awscli-local), a thin wrapper around the `aws` command line interface for use with LocalStack to run integration tests over AWS services.
- Export/import [LocalStack state](https://docs.localstack.cloud/user-guide/state-management/export-import-state/) as an artifact
- Save/load [LocalStack Cloud Pods](https://docs.localstack.cloud/user-guide/state-management/cloud-pods/)
- Start/stop a [LocalStack Ephemeral Instance](https://docs.localstack.cloud/user-guide/cloud-sandbox/application-previews/) _(EXPERIMENTAL)_

## Usage

To get started, you can use this minimal example:
### Get started with a minimal example

```yml
- name: Start LocalStack
uses: LocalStack/setup-localstack@v0.1.2
uses: LocalStack/setup-localstack@v0.2.0
with:
image-tag: 'latest'
install-awslocal: 'true'
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
```
> **NOTE**: The `LOCALSTACK_API_KEY` environment variable is required to be set if `use-pro` is set to `true`.
If the key is not found LocalStack by default falls back to the CE edition and displays a warning.

### Inputs
### Install only CLIs and startup later
```yml
- name: Install LocalStack CLIs
uses: LocalStack/[email protected]
with:
skip-startup: 'true'
install-awslocal: 'true'
...
- name: Start LocalStack
uses: LocalStack/[email protected]
with:
image-tag: 'latest'
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
```

### Save a state later on in the pipeline
```yml
- name: Save LocalStack State
uses: LocalStack/[email protected]
with:
install-awslocal: 'true'
state-backend: cloud-pods
state-action: save
state-name: my-cloud-pod
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
```
> **NOTE**: The `LOCALSTACK_API_KEY` environment variable is required to be set to save/load LocalStack's state either as a Cloud Pod or as a file artifact.

### Load an already saved state
```yml
- name: Start LocalStack and Load State
uses: LocalStack/[email protected]
with:
install-awslocal: 'true'
state-backend: cloud-pods
state-action: load
state-name: my-cloud-pod
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
```
> **NOTE**: To load a **local state** from a different GitHub Actions workflow, one must set the `WORKFLOW_ID` environment variable.

> **NOTE**: The `LOCALSTACK_API_KEY` environment variable is required to be set to **save/load** LocalStack's state either as a Cloud Pod or as a file artifact.

### Manage App Preview (Ephemeral Instance)
```yml
uses: LocalStack/setup-localstack@$v0.2.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
state-backend: ephemeral
state-action: start
# Adding this option prevents Ephemeral Instance to be stopped after the `preview-cmd` run
skip-ephemeral-stop: 'true'
# Optional script/command to run
preview-cmd: deploy.sh
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}

...

with:
uses: LocalStack/setup-localstack@${{ env.GH_ACTION_VERSION }}
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
state-backend: ephemeral
state-action: stop
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
```
## Inputs
| Input | Description | Default |
| ------------------ | -------------------------------------------------------------------------------- | -------- |
| `ci-project` | Name of the CI project to track in LocalStack Cloud | |
| `configuration` | Configuration variables to use while starting LocalStack container | `None` |
| `github-token` | Github token used to create PR comments | |
| `image-tag` | Tag of the LocalStack Docker image to use | `latest` |
| `include-preview` | Whether to include the created Ephemeral Instance URL in the PR comment | `false` |
| `install-awslocal` | Whether to install the `awslocal` CLI into the build environment | `true` |
| `configuration` | Configuration variables to use while starting LocalStack container | `None` |
| `preview-cmd` | Command(s) used to create a Ephemeral Instance of the PR (can use `$AWS_ENDPOINT_URL`) | |
| `skip-ephemeral-stop` | Skip stopping LocalStack Ephemeral Instance | `false` |
| `skip-startup` | Explicitly prevent LocalStack start up, only installs CLI(s). Recommended to manage state later on in the pipeline or start up an ephemeral instance. | `false` |
| `skip-wait` | Skip waiting for LocalStack to start up | `false` |
| `state-action` | Valid values are `load`, `save`, `start`, `stop`, `` (empty, don't manage state). Values `start`/`stop` only usable with app previews. | `` |
| `state-backend` | Either store the state of LocalStack locally, as a Cloud Pod or start an Ephemeral Instance. Valid values are `cloud-pods`, `ephemeral` or `local`. Use this option in unison with `state-action` to control behaviour. | `cloud-pods` |
| `state-name` | Name of the state artifact (without extension) | `false` |
| `use-pro` | Whether to use the Pro version of LocalStack (requires API key to be configured) | `false` |

> **NOTE**: The `LOCALSTACK_API_KEY` environment variable is required to be set if `use-pro` is set to `true`.

### Example workflow

## Example workflow
```yml
name: LocalStack Test
on: [ push, pull_request ]
Expand All @@ -48,20 +134,33 @@ jobs:
- uses: actions/checkout@v3
- name: Start LocalStack
uses: LocalStack/setup-localstack@v0.1.2
uses: LocalStack/setup-localstack@v0.2.0
with:
image-tag: 'latest'
install-awslocal: 'true'
configuration: DEBUG=1
use-pro: 'true'
state-backend: cloud-pods
state-action: load
state-name: my-cloud-pod
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
- name: Run Tests against LocalStack
run: |
awslocal s3 mb s3://test
awslocal s3 ls
echo "Test Execution complete!"
echo "Test Execution complete!"
- name: Save LocalStack State
uses: LocalStack/[email protected]
with:
state-backend: local
state-action: save
state-name: my-ls-state-artifact
env:
LOCALSTACK_API_KEY: ${{ secrets.LOCALSTACK_API_KEY }}
WORKFLOW_ID: ${{ env.MY_GOLDEN_LS_STATE }}
```

## License
Expand Down
Loading

0 comments on commit 4b405a2

Please sign in to comment.