diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml new file mode 100644 index 0000000..c4e9e8b --- /dev/null +++ b/.github/workflows/pull-request.yaml @@ -0,0 +1,30 @@ +on: + pull_request: + branches: + - master + +jobs: + wait_for_it: + runs-on: ubuntu-latest + name: Ensure action works + services: + test-site-80: + image: httpd + options: >- + -p 3000 + test-site-3000: + image: httpd + options: >- + -p 3000 + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Defaults + uses: ./ + with: + host: test-site-80 + - name: Non-default port + uses: ./ + with: + host: test-site-3000 + port: 3000 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..68377d8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +# Container image that runs your code +FROM alpine:3.15 +RUN apk add bash +# Copies your code file from your action repository to the filesystem path `/` of the container +COPY wait-for-it.sh /wait-for-it.sh +RUN chmod +x wait-for-it.sh + +# Code file to execute when the docker container starts up (`entrypoint.sh`) +ENTRYPOINT ["/bin/bash", "-c", "/wait-for-it.sh"] \ No newline at end of file diff --git a/README.md b/README.md index d08d5a2..472ad00 100644 --- a/README.md +++ b/README.md @@ -1,75 +1,28 @@ -# wait-for-it +# wait-for-it.sh Github Action -`wait-for-it.sh` is a pure bash script that will wait on the availability of a -host and TCP port. It is useful for synchronizing the spin-up of -interdependent services, such as linked docker containers. Since it is a pure -bash script, it does not have any external dependencies. - -## Usage +`wait-for-it.sh` is a pure bash script to wait on the availability of a host and TCP port. -```text -wait-for-it.sh host:port [-s] [-t timeout] [-- command args] --h HOST | --host=HOST Host or IP under test --p PORT | --port=PORT TCP port under test - Alternatively, you specify the host and port as host:port --s | --strict Only execute subcommand if the test succeeds --q | --quiet Don't output any status messages --t TIMEOUT | --timeout=TIMEOUT - Timeout in seconds, zero for no timeout --- COMMAND ARGS Execute command with args after the test finishes -``` - -## Examples +Since it is a pure +bash script, it does not have any external dependencies. -For example, let's test to see if we can access port 80 on `www.google.com`, -and if it is available, echo the message `google is up`. +This Github Action is based on a fork of the original [wait-for-it.sh](https://github.com/vishnubob/wait-for-it), and simply adds the `Dockerfile` and `action.yaml` needed to configure the shell script for use. -```text -$ ./wait-for-it.sh www.google.com:80 -- echo "google is up" -wait-for-it.sh: waiting 15 seconds for www.google.com:80 -wait-for-it.sh: www.google.com:80 is available after 0 seconds -google is up +## Usage ``` - -You can set your own timeout with the `-t` or `--timeout=` option. Setting -the timeout value to 0 will disable the timeout: - -```text -$ ./wait-for-it.sh -t 0 www.google.com:80 -- echo "google is up" -wait-for-it.sh: waiting for www.google.com:80 without a timeout -wait-for-it.sh: www.google.com:80 is available after 0 seconds -google is up +- id: wait-for-it + runs: elijahboston/wait-for-it + with: + host: localhost + port: 80 + timeout: 60 + strict: false + quiet: false ``` -The subcommand will be executed regardless if the service is up or not. If you -wish to execute the subcommand only if the service is up, add the `--strict` -argument. In this example, we will test port 81 on `www.google.com` which will -fail: - -```text -$ ./wait-for-it.sh www.google.com:81 --timeout=1 --strict -- echo "google is up" -wait-for-it.sh: waiting 1 seconds for www.google.com:81 -wait-for-it.sh: timeout occurred after waiting 1 seconds for www.google.com:81 -wait-for-it.sh: strict mode, refusing to execute subprocess +Most parameters are optional, only the host is required: ``` - -If you don't want to execute a subcommand, leave off the `--` argument. This -way, you can test the exit condition of `wait-for-it.sh` in your own scripts, -and determine how to proceed: - -```text -$ ./wait-for-it.sh www.google.com:80 -wait-for-it.sh: waiting 15 seconds for www.google.com:80 -wait-for-it.sh: www.google.com:80 is available after 0 seconds -$ echo $? -0 -$ ./wait-for-it.sh www.google.com:81 -wait-for-it.sh: waiting 15 seconds for www.google.com:81 -wait-for-it.sh: timeout occurred after waiting 15 seconds for www.google.com:81 -$ echo $? -124 +- id: wait-for-it + runs: elijahboston/wait-for-it + with: + host: localhost ``` - -## Community - -*Debian*: There is a [Debian package](https://tracker.debian.org/pkg/wait-for-it). diff --git a/action.yaml b/action.yaml new file mode 100644 index 0000000..ebda214 --- /dev/null +++ b/action.yaml @@ -0,0 +1,35 @@ +name: 'wait-for-it' +description: 'Wait for a response' +inputs: + host: + description: 'Host or IP under test' + required: true + port: + description: 'TCP port under test, default: 80' + required: false + default: '80' + strict: + description: 'Only execute subcommand if the test succeeds' + required: false + default: 'false' + timeout: + description: 'Timeout in seconds, zero for no timeout' + required: false + default: '60' + command: + description: 'Execute command after the test has completed' + required: false + quiet: + description: "Don't output any status messages" + required: false + default: 'false' +runs: + using: 'docker' + image: 'Dockerfile' + args: + - --host=${{ inputs.host }} + - --port=${{ inputs.port }} + - --strict=${{ inputs.strict }} + - --timeout=${{ inputs.timeout }} + - --quiet=${{ inputs.quiet }} + - -- ${{ inputs.command }} \ No newline at end of file