diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1140052..2b5377d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -10,6 +10,28 @@ jobs: uses: azohra/shell-linter@v0.3.0 with: path: "entrypoint.sh" + build-only: + runs-on: ubuntu-latest + name: Only build the app + steps: + - uses: actions/checkout@v2 + - name: Build app + uses: ./ + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + workingDirectory: "test" + publish: false + secrets: | + SECRET1 + SECRET2 + preCommands: echo "*** pre commands ***" + postCommands: | + echo "*** post commands ***" + wrangler build + echo "******" + env: + SECRET1: ${{ secrets.SECRET1 }} + SECRET2: ${{ secrets.SECRET2 }} publish: runs-on: ubuntu-latest name: Publish app @@ -60,6 +82,10 @@ jobs: secrets: | SECRET1 SECRET2 + preCommands: echo "*** pre command ***" + postCommands: | + echo "*** post commands ***" + echo "******" env: SECRET1: ${{ secrets.SECRET1 }} - SECRET2: ${{ secrets.SECRET2 }} + SECRET2: ${{ secrets.SECRET2 }} \ No newline at end of file diff --git a/README.md b/README.md index 4fc6530..1874c10 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,35 @@ jobs: SECRET2: ${{ secrets.SECRET2 }} ``` +If you need to run additional shell commands before or after `wrangler publish`, you can specify them as input to `preCommands` (before publish) or `postCommands` (after publish). These can include additional `wrangler` commands (i.e. `build`, `kv:key put`) or any other commands available inside the `wrangler-action` context. + +```yaml +jobs: + deploy: + steps: + uses: cloudflare/wrangler-action@1.2.0 + with: + apiToken: ${{ secrets.CF_API_TOKEN }} + preCommands: echo "*** pre command ***" + postCommands: | + echo "*** post commands ***" + wrangler kv:key put --binding=MY_KV key2 value2 + echo "******" +``` + +Set the optional `publish` input to false to skip publishing your Worker project and secrets. Useful in conjunction with pre and post commands. For example, if you only wanted to run `wrangler build` against your project: + +```yaml +jobs: + deploy: + steps: + uses: cloudflare/wrangler-action@1.2.0 + with: + apiToken: ${{ secrets.CF_API_TOKEN }} + publish: false + preCommands: wrangler build +``` + ## Use cases ### Deploying when commits are merged to master @@ -228,4 +257,4 @@ jobs: uses: cloudflare/wrangler-action@1.2.0 with: apiToken: ${{ secrets.CF_API_TOKEN }} -``` +``` \ No newline at end of file diff --git a/action.yml b/action.yml index 57d8764..4f038db 100644 --- a/action.yml +++ b/action.yml @@ -22,3 +22,12 @@ inputs: secrets: description: "A new line deliminated string of environment variable names that should be configured as Worker secrets" required: false + preCommands: + description: "Commands to execute before publishing the Workers project" + required: false + postCommands: + description: "Commands to execute after publishing the Workers project" + required: false + publish: + description: "Set to false to skip publishing your Worker project and secrets. Defaults to true." + required: false \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh index ffa0580..7b68e34 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash set -e @@ -10,6 +10,27 @@ chmod -R 770 "$HOME/.wrangler" export API_CREDENTIALS="" +# Used to execute any specified pre and post commands +execute_commands() { + COMMANDS=$1 + while IFS= read -r COMMAND; do + CHUNKS=() + + for CHUNK in $COMMAND; do + CHUNKS+=("$CHUNK") + done + + eval "${CHUNKS[@]}" + + CHUNKS=() + done <<< "$COMMANDS" +} + +secret_not_found() { + echo "::error::Specified secret \"$1\" not found in environment variables." + exit 1 +} + # If an API token is detected as input if [ -n "$INPUT_APITOKEN" ] then @@ -58,28 +79,39 @@ then cd "$INPUT_WORKINGDIRECTORY" fi -secret_not_found() { - echo "::error::Specified secret \"$1\" not found in environment variables." - exit 1 -} +# If precommands is detected as input +if [ -n "$INPUT_PRECOMMANDS" ] +then + execute_commands "$INPUT_PRECOMMANDS" +fi # If an environment is detected as input, for each secret specified get the value of # the matching named environment variable then configure using wrangler secret put. -if [ -z "$INPUT_ENVIRONMENT" ] +# Skip if publish is set to false. +if [ "$INPUT_PUBLISH" != "false" ] then - wrangler publish - - for SECRET in $INPUT_SECRETS; do - VALUE=$(printenv "$SECRET") || secret_not_found "$SECRET" - echo "$VALUE" | wrangler secret put "$SECRET" - done -else - wrangler publish -e "$INPUT_ENVIRONMENT" + if [ -z "$INPUT_ENVIRONMENT" ] + then + wrangler publish + + for SECRET in $INPUT_SECRETS; do + VALUE=$(printenv "$SECRET") || secret_not_found "$SECRET" + echo "$VALUE" | wrangler secret put "$SECRET" + done + else + wrangler publish -e "$INPUT_ENVIRONMENT" + + for SECRET in $INPUT_SECRETS; do + VALUE=$(printenv "$SECRET") || secret_not_found "$SECRET" + echo "$VALUE" | wrangler secret put "$SECRET" --env "$INPUT_ENVIRONMENT" + done + fi +fi - for SECRET in $INPUT_SECRETS; do - VALUE=$(printenv "$SECRET") || secret_not_found "$SECRET" - echo "$VALUE" | wrangler secret put "$SECRET" --env "$INPUT_ENVIRONMENT" - done +# If postcommands is detected as input +if [ -n "$INPUT_POSTCOMMANDS" ] +then + execute_commands "$INPUT_POSTCOMMANDS" fi # If a working directory is detected as input, revert to the