Merge pull request #35 from bradyjoslin/pre-post-commands

Add support for running pre and post commands
This commit is contained in:
Kristian Freeman 2020-08-21 11:31:16 -05:00 committed by GitHub
commit 3424d15af2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 115 additions and 19 deletions

View file

@ -10,6 +10,28 @@ jobs:
uses: azohra/shell-linter@v0.3.0 uses: azohra/shell-linter@v0.3.0
with: with:
path: "entrypoint.sh" 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: publish:
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: Publish app name: Publish app
@ -60,6 +82,10 @@ jobs:
secrets: | secrets: |
SECRET1 SECRET1
SECRET2 SECRET2
preCommands: echo "*** pre command ***"
postCommands: |
echo "*** post commands ***"
echo "******"
env: env:
SECRET1: ${{ secrets.SECRET1 }} SECRET1: ${{ secrets.SECRET1 }}
SECRET2: ${{ secrets.SECRET2 }} SECRET2: ${{ secrets.SECRET2 }}

View file

@ -110,6 +110,35 @@ jobs:
SECRET2: ${{ secrets.SECRET2 }} 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 ## Use cases
### Deploying when commits are merged to master ### Deploying when commits are merged to master
@ -228,4 +257,4 @@ jobs:
uses: cloudflare/wrangler-action@1.2.0 uses: cloudflare/wrangler-action@1.2.0
with: with:
apiToken: ${{ secrets.CF_API_TOKEN }} apiToken: ${{ secrets.CF_API_TOKEN }}
``` ```

View file

@ -22,3 +22,12 @@ inputs:
secrets: secrets:
description: "A new line deliminated string of environment variable names that should be configured as Worker secrets" description: "A new line deliminated string of environment variable names that should be configured as Worker secrets"
required: false 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

View file

@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
set -e set -e
@ -10,6 +10,27 @@ chmod -R 770 "$HOME/.wrangler"
export API_CREDENTIALS="" 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 an API token is detected as input
if [ -n "$INPUT_APITOKEN" ] if [ -n "$INPUT_APITOKEN" ]
then then
@ -58,28 +79,39 @@ then
cd "$INPUT_WORKINGDIRECTORY" cd "$INPUT_WORKINGDIRECTORY"
fi fi
secret_not_found() { # If precommands is detected as input
echo "::error::Specified secret \"$1\" not found in environment variables." if [ -n "$INPUT_PRECOMMANDS" ]
exit 1 then
} execute_commands "$INPUT_PRECOMMANDS"
fi
# If an environment is detected as input, for each secret specified get the value of # 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. # 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 then
wrangler publish if [ -z "$INPUT_ENVIRONMENT" ]
then
wrangler publish
for SECRET in $INPUT_SECRETS; do for SECRET in $INPUT_SECRETS; do
VALUE=$(printenv "$SECRET") || secret_not_found "$SECRET" VALUE=$(printenv "$SECRET") || secret_not_found "$SECRET"
echo "$VALUE" | wrangler secret put "$SECRET" echo "$VALUE" | wrangler secret put "$SECRET"
done done
else else
wrangler publish -e "$INPUT_ENVIRONMENT" wrangler publish -e "$INPUT_ENVIRONMENT"
for SECRET in $INPUT_SECRETS; do for SECRET in $INPUT_SECRETS; do
VALUE=$(printenv "$SECRET") || secret_not_found "$SECRET" VALUE=$(printenv "$SECRET") || secret_not_found "$SECRET"
echo "$VALUE" | wrangler secret put "$SECRET" --env "$INPUT_ENVIRONMENT" echo "$VALUE" | wrangler secret put "$SECRET" --env "$INPUT_ENVIRONMENT"
done done
fi
fi
# If postcommands is detected as input
if [ -n "$INPUT_POSTCOMMANDS" ]
then
execute_commands "$INPUT_POSTCOMMANDS"
fi fi
# If a working directory is detected as input, revert to the # If a working directory is detected as input, revert to the