From 84e265f032945683f06ef618eb15ad5024ed974f Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Thu, 6 Oct 2022 16:07:26 -0500 Subject: [PATCH 01/32] Create build-images.yaml --- .github/workflows/build-images.yaml | 171 ++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 .github/workflows/build-images.yaml diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml new file mode 100644 index 00000000..603ce552 --- /dev/null +++ b/.github/workflows/build-images.yaml @@ -0,0 +1,171 @@ +name: Build PR Image +on: + pull_request: + types: [opened,synchronize,reopened,closed] + +jobs: + build-vote: + name: Build and Push `vote` + runs-on: ubuntu-latest + if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} + outputs: + tags: ${{ steps.meta.outputs.tags }} + steps: + - name: Checkout git repo + uses: actions/checkout@v3 + - name: Generate UUID image name + id: uuid + run: echo "::set-output name=uuid::$(uuidgen)" + - name: Docker metadata + id: meta + uses: docker/metadata-action@v3 + with: + images: ttl.sh/${{ steps.uuid.outputs.uuid }} + tags: type=raw,value=24h + - name: Build and Push Image to ttl.sh ephemeral registry + uses: docker/build-push-action@v2 + with: + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + context: ./vote + + build-worker: + name: Build and Push `worker` + runs-on: ubuntu-latest + if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} + outputs: + tags: ${{ steps.meta.outputs.tags }} + steps: + - name: Checkout git repo + uses: actions/checkout@v3 + - name: Generate UUID image name + id: uuid + run: echo "::set-output name=uuid::$(uuidgen)" + - name: Docker metadata + id: meta + uses: docker/metadata-action@v3 + with: + images: ttl.sh/${{ steps.uuid.outputs.uuid }} + tags: type=raw,value=24h + - name: Build and Push Image to ttl.sh Ephemeral Registry + uses: docker/build-push-action@v2 + with: + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + context: ./worker + + build-result: + name: Build and Push `result` + runs-on: ubuntu-latest + if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} + outputs: + tags: ${{ steps.meta.outputs.tags }} + steps: + - name: Checkout git repo + uses: actions/checkout@v3 + - name: Generate UUID image name + id: uuid + run: echo "::set-output name=uuid::$(uuidgen)" + - name: Docker metadata + id: meta + uses: docker/metadata-action@v3 + with: + images: ttl.sh/${{ steps.uuid.outputs.uuid }} + tags: type=raw,value=24h + - name: Build and Push Image to ttl.sh Ephemeral Registry + uses: docker/build-push-action@v2 + with: + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + context: ./result + + build-loadbalancer: + name: Build and Push `loadbalancer` + runs-on: ubuntu-latest + if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} + outputs: + tags: ${{ steps.meta.outputs.tags }} + steps: + - name: Checkout git repo + uses: actions/checkout@v3 + - name: Generate UUID image name + id: uuid + run: echo "::set-output name=uuid::$(uuidgen)" + - name: Docker metadata + id: meta + uses: docker/metadata-action@v3 + with: + images: ttl.sh/${{ steps.uuid.outputs.uuid }} + tags: type=raw,value=24h + - name: Build and Push Image to ttl.sh Ephemeral Registry + uses: docker/build-push-action@v2 + with: + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + context: ./loadbalancer + + render-compose-file: + name: Render Docker Compose File + # Pass output of this workflow to another triggered by `workflow_run` event. + runs-on: ubuntu-latest + needs: + - build-backstage + outputs: + compose-file-cache-key: ${{ steps.hash.outputs.hash }} + steps: + - name: Checkout git repo + uses: actions/checkout@v3 + - name: Render Compose File + run: | + VOTE_IMAGE=$(echo ${{ needs.build-vote.outputs.tags }}) + export VOTE_IMAGE + WORKER_IMAGE=$(echo ${{ needs.build-worker.outputs.tags }}) + export WORKER_IMAGE + RESULT_IMAGE=$(echo ${{ needs.build-result.outputs.tags }}) + export RESULT_IMAGE + LOADBALANCER_IMAGE=$(echo ${{ needs.build-loadbalancer.outputs.tags }}) + export LOADBALANCER_IMAGE + PGUSER=${{ secrets.PGUSER }} + export PGUSER + PGPASSWORD=${{ secrets.PGPASSWORD }} + export PGPASSWORD + # Render simple template from environment variables. + envsubst < .github/uffizzi/docker-compose.uffizzi.yml > docker-compose.rendered.yml + cat docker-compose.rendered.yml + - name: Upload Rendered Compose File as Artifact + uses: actions/upload-artifact@v3 + with: + name: preview-spec + path: docker-compose.rendered.yml + retention-days: 2 + - name: Serialize PR Event to File + run: | + cat << EOF > event.json + ${{ toJSON(github.event) }} + + EOF + - name: Upload PR Event as Artifact + uses: actions/upload-artifact@v3 + with: + name: preview-spec + path: event.json + retention-days: 2 + + delete-preview: + name: Call for Preview Deletion + runs-on: ubuntu-latest + if: ${{ github.event.action == 'closed' }} + steps: + # If this PR is closing, we will not render a compose file nor pass it to the next workflow. + - name: Serialize PR Event to File + run: echo '${{ toJSON(github.event) }}' > event.json + - name: Upload PR Event as Artifact + uses: actions/upload-artifact@v3 + with: + name: preview-spec + path: event.json + retention-days: 2 From 559c23f4124ee96c49dec79a52e4cefced9f4906 Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Thu, 6 Oct 2022 16:10:35 -0500 Subject: [PATCH 02/32] Added two-stage workflow for forks --- .github/workflows/uffizzi-preview.yaml | 209 +++++++------------------ 1 file changed, 55 insertions(+), 154 deletions(-) diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml index e15a23f4..acd3c98b 100644 --- a/.github/workflows/uffizzi-preview.yaml +++ b/.github/workflows/uffizzi-preview.yaml @@ -1,183 +1,84 @@ -name: Build Images and Handle Uffizzi Previews. +name: Deploy Uffizzi Preview on: - push: - branches: - - main - - master - - staging - - qa - pull_request: - types: [opened,reopened,synchronize,closed] + workflow_run: + workflows: + - "Build PR Image" + types: + - completed jobs: - build-vote: - name: Build and Push `vote` + cache-compose-file: + name: Cache Compose File runs-on: ubuntu-latest - if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} outputs: - tags: ${{ steps.meta.outputs.tags }} - steps: - - name: Checkout git repo - uses: actions/checkout@v3 - - name: Generate UUID image name - id: uuid - run: echo "::set-output name=uuid::$(uuidgen)" - - name: Docker metadata - id: meta - uses: docker/metadata-action@v3 - with: - images: ttl.sh/${{ steps.uuid.outputs.uuid }} - tags: type=raw,value=24h - - name: Build and Push Image to ttl.sh ephemeral registry - uses: docker/build-push-action@v2 - with: - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - context: ./vote - - build-worker: - name: Build and Push `worker` - runs-on: ubuntu-latest - if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} - outputs: - tags: ${{ steps.meta.outputs.tags }} - steps: - - name: Checkout git repo - uses: actions/checkout@v3 - - name: Generate UUID image name - id: uuid - run: echo "::set-output name=uuid::$(uuidgen)" - - name: Docker metadata - id: meta - uses: docker/metadata-action@v3 - with: - images: ttl.sh/${{ steps.uuid.outputs.uuid }} - tags: type=raw,value=24h - - name: Build and Push Image to ttl.sh Ephemeral Registry - uses: docker/build-push-action@v2 - with: - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - context: ./worker - - build-result: - name: Build and Push `result` - runs-on: ubuntu-latest - if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} - outputs: - tags: ${{ steps.meta.outputs.tags }} - steps: - - name: Checkout git repo - uses: actions/checkout@v3 - - name: Generate UUID image name - id: uuid - run: echo "::set-output name=uuid::$(uuidgen)" - - name: Docker metadata - id: meta - uses: docker/metadata-action@v3 - with: - images: ttl.sh/${{ steps.uuid.outputs.uuid }} - tags: type=raw,value=24h - - name: Build and Push Image to ttl.sh Ephemeral Registry - uses: docker/build-push-action@v2 - with: - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - context: ./result - - build-loadbalancer: - name: Build and Push `loadbalancer` - runs-on: ubuntu-latest - if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} - outputs: - tags: ${{ steps.meta.outputs.tags }} + compose-file-cache-key: ${{ steps.hash.outputs.hash }} + pr-number: ${{ steps.pr.outputs.number }} steps: - - name: Checkout git repo - uses: actions/checkout@v3 - - name: Generate UUID image name - id: uuid - run: echo "::set-output name=uuid::$(uuidgen)" - - name: Docker metadata - id: meta - uses: docker/metadata-action@v3 - with: - images: ttl.sh/${{ steps.uuid.outputs.uuid }} - tags: type=raw,value=24h - - name: Build and Push Image to ttl.sh Ephemeral Registry - uses: docker/build-push-action@v2 + - name: 'Download artifacts' + # Fetch output (zip archive) from the workflow run that triggered this workflow. + uses: actions/github-script@v6 with: - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - context: ./loadbalancer + script: | + let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: context.payload.workflow_run.id, + }); + let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => { + return artifact.name == "preview-spec" + })[0]; + let download = await github.rest.actions.downloadArtifact({ + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: matchArtifact.id, + archive_format: 'zip', + }); + let fs = require('fs'); + fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/preview-spec.zip`, Buffer.from(download.data)); - render-compose-file: - name: Render Docker Compose File - runs-on: ubuntu-latest - if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} - needs: - - build-vote - - build-worker - - build-result - - build-loadbalancer - outputs: - compose-file-cache-key: ${{ steps.hash.outputs.hash }} - steps: - - name: Checkout git repo - uses: actions/checkout@v3 - - name: Render Compose File + - name: 'Unzip artifact' + run: unzip preview-spec.zip + - name: Read Event into ENV run: | - VOTE_IMAGE=$(echo ${{ needs.build-vote.outputs.tags }}) - export VOTE_IMAGE - WORKER_IMAGE=$(echo ${{ needs.build-worker.outputs.tags }}) - export WORKER_IMAGE - RESULT_IMAGE=$(echo ${{ needs.build-result.outputs.tags }}) - export RESULT_IMAGE - LOADBALANCER_IMAGE=$(echo ${{ needs.build-loadbalancer.outputs.tags }}) - export LOADBALANCER_IMAGE - PGUSER=${{ secrets.PGUSER }} - export PGUSER - PGPASSWORD=${{ secrets.PGPASSWORD }} - export PGPASSWORD - # Render simple template from environment variables. - envsubst < docker-compose.uffizzi.yml > docker-compose.rendered.yml - cat docker-compose.rendered.yml + echo 'EVENT_JSON<> $GITHUB_ENV + cat event.json >> $GITHUB_ENV + echo 'EOF' >> $GITHUB_ENV + - name: Hash Rendered Compose File id: hash + # If the previous workflow was triggered by a PR close event, we will not have a compose file artifact. + if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }} run: echo "::set-output name=hash::$(md5sum docker-compose.rendered.yml | awk '{ print $1 }')" - name: Cache Rendered Compose File + if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }} uses: actions/cache@v3 with: path: docker-compose.rendered.yml key: ${{ steps.hash.outputs.hash }} + - name: Read PR Number From Event Object + id: pr + run: echo "::set-output name=number::${{ fromJSON(env.EVENT_JSON).number }}" + - name: DEBUG - Print Job Outputs + if: ${{ runner.debug }} + run: | + echo "PR number: ${{ steps.pr.outputs.number }}" + echo "Compose file hash: ${{ steps.hash.outputs.hash }}" + cat event.json + deploy-uffizzi-preview: name: Use Remote Workflow to Preview on Uffizzi needs: - - render-compose-file - uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2 - if: ${{ github.event_name == 'pull_request' && github.event.action != 'closed' }} - with: - compose-file-cache-key: ${{ needs.render-compose-file.outputs.compose-file-cache-key }} - compose-file-cache-path: docker-compose.rendered.yml - server: https://app.uffizzi.com/ - permissions: - contents: read - pull-requests: write - id-token: write - - delete-uffizzi-preview: - name: Use Remote Workflow to Delete an Existing Preview + - cache-compose-file uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2 - if: ${{ github.event_name == 'pull_request' && github.event.action == 'closed' }} with: - compose-file-cache-key: '' + # If this workflow was triggered by a PR close event, cache-key will be an empty string + # and this reusable workflow will delete the preview deployment. + compose-file-cache-key: ${{ needs.cache-compose-file.outputs.compose-file-cache-key }} compose-file-cache-path: docker-compose.rendered.yml server: https://app.uffizzi.com/ + pr-number: ${{ needs.cache-compose-file.outputs.pr-number }} permissions: contents: read pull-requests: write From c0d68d844780c2848b9eddc1a4977479b58cd917 Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Thu, 6 Oct 2022 23:03:50 -0500 Subject: [PATCH 03/32] Update build-images.yaml Add job dependencies --- .github/workflows/build-images.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 603ce552..54c0b112 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -113,7 +113,10 @@ jobs: # Pass output of this workflow to another triggered by `workflow_run` event. runs-on: ubuntu-latest needs: - - build-backstage + - build-vote + - build-worker + - build-result + - build-loadbalancer outputs: compose-file-cache-key: ${{ steps.hash.outputs.hash }} steps: From a1d4145a4dc6a54dcb7cd65ad9a6fed67913332a Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Thu, 6 Oct 2022 23:20:19 -0500 Subject: [PATCH 04/32] Correct file path --- .github/workflows/build-images.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 54c0b112..7996099d 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -137,7 +137,7 @@ jobs: PGPASSWORD=${{ secrets.PGPASSWORD }} export PGPASSWORD # Render simple template from environment variables. - envsubst < .github/uffizzi/docker-compose.uffizzi.yml > docker-compose.rendered.yml + envsubst < docker-compose.uffizzi.yml > docker-compose.rendered.yml cat docker-compose.rendered.yml - name: Upload Rendered Compose File as Artifact uses: actions/upload-artifact@v3 From 66a456fc339a2559fcc2db28ce6b69a561cdfee6 Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Mon, 10 Oct 2022 14:23:21 -0500 Subject: [PATCH 05/32] Update description for two-stage workflow --- README.md | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index f6d6408e..c3445a61 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Uffizzi Quickstart (~ 1 minute) -Get started using Uffizzi Preview Environments in 3 simple steps... +Go from pull request to Uffizzi Preview Environment in less than one minute... ### 1. Fork this repo @@ -10,13 +10,13 @@ Be sure to uncheck the option **Copy the `main` branch only**. This ensures that ### 2. Enable GitHub Actions workflows for your fork -Select **Actions**, then select **I understand my workflows, go ahead and enable them**. GitHub Actions is free in public repositories. +Select **Actions**, then select **I understand my workflows, go ahead and enable them**. ### 3. Open a pull request for `try-uffizzi` branch against `main` in your fork -Be sure that you're opening a PR on the branches of _your fork_ (i.e. `your-account/main` ← `your-account/try-uffizzi`). If you try to open a PR for `UffizziCloud/main` ← `your-account/try-uffizzi`, the Actions workflow will not run in this example. +Be sure that you're opening a PR on the branches of _your fork_ (i.e. `your-account/main` ← `your-account/try-uffizzi`). If you try to open a PR for `UffizziCloud/main` ← `your-account/try-uffizzi`, the Actions workflow will not run. That's it! This will kick off a GitHub Actions workflow and post the Preview Environment URL as a comment to your PR issue. @@ -28,16 +28,21 @@ The PR will trigger a [GitHub Actions workflow](https://github.com/UffizziCloud/ ## How it works -#### Configuration +### Configuration -Previews are configured with a [Docker Compose template](https://github.com/UffizziCloud/quickstart/blob/main/docker-compose.uffizzi.yml) that describes the application components and a [GitHub Actions workflow](https://github.com/UffizziCloud/quickstart/blob/main/.github/workflows/uffizzi-preview.yaml) that includes a series of jobs triggered by a `pull_request` event and subsequent `push` events: +Previews are configured with a [Docker Compose template](docker-compose.uffizzi.yml) that describes the application components and two [GitHub Actions workflows](.github/workflows), `uffizzi-build.yaml` and `uffizzi-preview.yaml`. The build workflow runs on `pull_request` events, while the preview workflow triggers only if the build is successful: -1. [Build and push images to a container registry](https://github.com/UffizziCloud/quickstart/blob/5699f461f752b0bd787d69abc2cfad3b79e0308b/.github/workflows/uffizzi-preview.yaml#L14-L116) -2. [Render a Docker Compose file](https://github.com/UffizziCloud/quickstart/blob/5699f461f752b0bd787d69abc2cfad3b79e0308b/.github/workflows/uffizzi-preview.yaml#L118-L156) from the Docker Compose template and the built images -3. [Deploy the application (per the Docker Compose file) to a Uffizzi Preview Environment](https://github.com/UffizziCloud/quickstart/blob/5699f461f752b0bd787d69abc2cfad3b79e0308b/.github/workflows/uffizzi-preview.yaml#L158-L171) and post a comment to the PR issue -4. [Delete the Preview Environment](https://github.com/UffizziCloud/quickstart/blob/5699f461f752b0bd787d69abc2cfad3b79e0308b/.github/workflows/uffizzi-preview.yaml#L173-L184) when the PR is merged/closed or after `1h` +#### `uffizzi-build.yaml` +(1) [Build and push images to a container registry](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/build-images.yaml#L7-L109) if a pull request is opened, reopend, or synchronized. +(2) [Render a Docker Compose file](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/build-images.yaml#L111-L159) from the [Docker Compose template](docker-compose.uffizzi.yml) and the built images; store rendered Compose as an artifact. -#### Uffizzi Cloud +#### `uffizzi-preview.yaml` +(3) [Download and extract the Docker Compose artifact](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/uffizzi-preview.yaml#L11-L68) +(4) [Deploy the application to a Uffizzi Preview Environment](https://github.com/UffizziCloud/quickstart/blob/5699f461f752b0bd787d69abc2cfad3b79e0308b/.github/workflows/uffizzi-preview.yaml#L158-L171) and post a comment to the PR issue. + +[Delete the Preview Environment](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/build-images.yaml#L161-L174), if the pull request is closed. + +### Uffizzi Cloud Running this workflow will create a [Uffizzi Cloud](https://uffizzi.com) account and project from your GitHub user and repo information, respectively. If you sign in to the [Uffizzi Dashboard](https://app.uffizzi.com/sign_in) you can view logs, password protect your Preview Environments, manage projects and team members, set role-based access controls, and configure single-sign on (SSO). From b46f1b5872af8dd816e48b00f5d2962a1d60eaac Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Mon, 10 Oct 2022 14:33:29 -0500 Subject: [PATCH 06/32] Fixed typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c3445a61..1dd7c5ad 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ The PR will trigger a [GitHub Actions workflow](https://github.com/UffizziCloud/ Previews are configured with a [Docker Compose template](docker-compose.uffizzi.yml) that describes the application components and two [GitHub Actions workflows](.github/workflows), `uffizzi-build.yaml` and `uffizzi-preview.yaml`. The build workflow runs on `pull_request` events, while the preview workflow triggers only if the build is successful: #### `uffizzi-build.yaml` -(1) [Build and push images to a container registry](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/build-images.yaml#L7-L109) if a pull request is opened, reopend, or synchronized. +(1) [Build and push images to a container registry](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/build-images.yaml#L7-L109) if a pull request is opened, reopened, or synchronized. (2) [Render a Docker Compose file](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/build-images.yaml#L111-L159) from the [Docker Compose template](docker-compose.uffizzi.yml) and the built images; store rendered Compose as an artifact. #### `uffizzi-preview.yaml` From 9ce07307b13063b57c5b046873a300f90bb4fc7f Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Mon, 10 Oct 2022 14:49:21 -0500 Subject: [PATCH 07/32] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1dd7c5ad..8fefc6df 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,9 @@ The PR will trigger a [GitHub Actions workflow](https://github.com/UffizziCloud/ ### Configuration -Previews are configured with a [Docker Compose template](docker-compose.uffizzi.yml) that describes the application components and two [GitHub Actions workflows](.github/workflows), `uffizzi-build.yaml` and `uffizzi-preview.yaml`. The build workflow runs on `pull_request` events, while the preview workflow triggers only if the build is successful: +Previews are configured with a [Docker Compose template](docker-compose.uffizzi.yml) that describes the application components and two [GitHub Actions workflows](.github/workflows), `build-images.yaml` and `uffizzi-preview.yaml`. The build workflow runs on `pull_request` events, while the preview workflow triggers only if the build is successful: -#### `uffizzi-build.yaml` +#### `build-images.yaml` (1) [Build and push images to a container registry](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/build-images.yaml#L7-L109) if a pull request is opened, reopened, or synchronized. (2) [Render a Docker Compose file](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/build-images.yaml#L111-L159) from the [Docker Compose template](docker-compose.uffizzi.yml) and the built images; store rendered Compose as an artifact. From d94b4931289aa4b76891424a0c8c5903390f1436 Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Thu, 13 Oct 2022 15:40:29 -0500 Subject: [PATCH 08/32] Consolidate workflow --- .github/workflows/uffizzi-preview.yaml | 207 ++++++++++++++++++------- 1 file changed, 151 insertions(+), 56 deletions(-) diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml index acd3c98b..0ef0b398 100644 --- a/.github/workflows/uffizzi-preview.yaml +++ b/.github/workflows/uffizzi-preview.yaml @@ -1,84 +1,179 @@ -name: Deploy Uffizzi Preview +name: Build Images and Handle Uffizzi Previews on: - workflow_run: - workflows: - - "Build PR Image" - types: - - completed + pull_request: + types: [opened,reopened,synchronize,closed] jobs: - cache-compose-file: - name: Cache Compose File + build-vote: + name: Build and Push `vote` runs-on: ubuntu-latest + if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} outputs: - compose-file-cache-key: ${{ steps.hash.outputs.hash }} - pr-number: ${{ steps.pr.outputs.number }} + tags: ${{ steps.meta.outputs.tags }} steps: - - name: 'Download artifacts' - # Fetch output (zip archive) from the workflow run that triggered this workflow. - uses: actions/github-script@v6 + - name: Checkout git repo + uses: actions/checkout@v3 + - name: Generate UUID image name + id: uuid + run: echo "::set-output name=uuid::$(uuidgen)" + - name: Docker metadata + id: meta + uses: docker/metadata-action@v3 + with: + # An anonymous, emphemeral registry built on ttl.sh + images: ephemeron.uffizzi.com/${{ steps.uuid.outputs.uuid }} + tags: type=raw,value=24h + - name: Build and Push Image to Uffizzi Ephemeral Registry + uses: docker/build-push-action@v2 with: - script: | - let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: context.payload.workflow_run.id, - }); - let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => { - return artifact.name == "preview-spec" - })[0]; - let download = await github.rest.actions.downloadArtifact({ - owner: context.repo.owner, - repo: context.repo.repo, - artifact_id: matchArtifact.id, - archive_format: 'zip', - }); - let fs = require('fs'); - fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/preview-spec.zip`, Buffer.from(download.data)); + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + context: ./vote - - name: 'Unzip artifact' - run: unzip preview-spec.zip - - name: Read Event into ENV + build-worker: + name: Build and Push `worker` + runs-on: ubuntu-latest + if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} + outputs: + tags: ${{ steps.meta.outputs.tags }} + steps: + - name: Checkout git repo + uses: actions/checkout@v3 + - name: Generate UUID image name + id: uuid + run: echo "::set-output name=uuid::$(uuidgen)" + - name: Docker metadata + id: meta + uses: docker/metadata-action@v3 + with: + # An anonymous, emphemeral registry built on ttl.sh + images: ephemeron.uffizzi.com/${{ steps.uuid.outputs.uuid }} + tags: type=raw,value=24h + - name: Build and Push Image to Uffizzi Ephemeral Registry + uses: docker/build-push-action@v2 + with: + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + context: ./worker + + build-result: + name: Build and Push `result` + runs-on: ubuntu-latest + if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} + outputs: + tags: ${{ steps.meta.outputs.tags }} + steps: + - name: Checkout git repo + uses: actions/checkout@v3 + - name: Generate UUID image name + id: uuid + run: echo "::set-output name=uuid::$(uuidgen)" + - name: Docker metadata + id: meta + uses: docker/metadata-action@v3 + with: + # An anonymous, emphemeral registry built on ttl.sh + images: ephemeron.uffizzi.com/${{ steps.uuid.outputs.uuid }} + tags: type=raw,value=24h + - name: Build and Push Image to Uffizzi Ephemeral Registry + uses: docker/build-push-action@v2 + with: + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + context: ./result + + build-loadbalancer: + name: Build and Push `loadbalancer` + runs-on: ubuntu-latest + if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} + outputs: + tags: ${{ steps.meta.outputs.tags }} + steps: + - name: Checkout git repo + uses: actions/checkout@v3 + - name: Generate UUID image name + id: uuid + run: echo "::set-output name=uuid::$(uuidgen)" + - name: Docker metadata + id: meta + uses: docker/metadata-action@v3 + with: + # An anonymous, emphemeral registry built on ttl.sh + images: ephemeron.uffizzi.com/${{ steps.uuid.outputs.uuid }} + tags: type=raw,value=24h + - name: Build and Push Image to Uffizzi Ephemeral Registry + uses: docker/build-push-action@v2 + with: + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + context: ./loadbalancer + + render-compose-file: + name: Render Docker Compose File + runs-on: ubuntu-latest + needs: + - build-vote + - build-worker + - build-result + - build-loadbalancer + outputs: + compose-file-cache-key: ${{ steps.hash.outputs.hash }} + compose-file-cache-path: docker-compose.rendered.yml + steps: + - name: Checkout git repo + uses: actions/checkout@v3 + - name: Render Compose File run: | - echo 'EVENT_JSON<> $GITHUB_ENV - cat event.json >> $GITHUB_ENV - echo 'EOF' >> $GITHUB_ENV - + VOTE_IMAGE=$(echo ${{ needs.build-vote.outputs.tags }}) + export VOTE_IMAGE + WORKER_IMAGE=$(echo ${{ needs.build-worker.outputs.tags }}) + export WORKER_IMAGE + RESULT_IMAGE=$(echo ${{ needs.build-result.outputs.tags }}) + export RESULT_IMAGE + LOADBALANCER_IMAGE=$(echo ${{ needs.build-loadbalancer.outputs.tags }}) + export LOADBALANCER_IMAGE + PGUSER=${{ secrets.PGUSER }} + export PGUSER + PGPASSWORD=${{ secrets.PGPASSWORD }} + export PGPASSWORD + # Render simple template from environment variables. + envsubst < docker-compose.uffizzi.yml > docker-compose.rendered.yml + cat docker-compose.rendered.yml - name: Hash Rendered Compose File id: hash - # If the previous workflow was triggered by a PR close event, we will not have a compose file artifact. - if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }} run: echo "::set-output name=hash::$(md5sum docker-compose.rendered.yml | awk '{ print $1 }')" - name: Cache Rendered Compose File - if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }} uses: actions/cache@v3 with: path: docker-compose.rendered.yml key: ${{ steps.hash.outputs.hash }} - - name: Read PR Number From Event Object - id: pr - run: echo "::set-output name=number::${{ fromJSON(env.EVENT_JSON).number }}" - - name: DEBUG - Print Job Outputs - if: ${{ runner.debug }} - run: | - echo "PR number: ${{ steps.pr.outputs.number }}" - echo "Compose file hash: ${{ steps.hash.outputs.hash }}" - cat event.json - deploy-uffizzi-preview: name: Use Remote Workflow to Preview on Uffizzi - needs: - - cache-compose-file + needs: render-compose-file + uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2 + with: + compose-file-cache-key: ${{ needs.render-compose-file.outputs.compose-file-cache-key }} + compose-file-cache-path: ${{ needs.render-compose-file.outputs.compose-file-cache-path }} + server: https://app.uffizzi.com/ + permissions: + contents: read + pull-requests: write + id-token: write + + delete-uffizzi-preview: + name: Use Remote Workflow to Delete an Existing Preview uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2 + if: ${{ github.event_name == 'pull_request' && github.event.action == 'closed' }} with: - # If this workflow was triggered by a PR close event, cache-key will be an empty string - # and this reusable workflow will delete the preview deployment. - compose-file-cache-key: ${{ needs.cache-compose-file.outputs.compose-file-cache-key }} + compose-file-cache-key: '' compose-file-cache-path: docker-compose.rendered.yml server: https://app.uffizzi.com/ - pr-number: ${{ needs.cache-compose-file.outputs.pr-number }} permissions: contents: read pull-requests: write From 6de856a910cd40d3eab760b418bc4c5eda657507 Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Thu, 13 Oct 2022 15:42:15 -0500 Subject: [PATCH 09/32] Delete build-images.yaml --- .github/workflows/build-images.yaml | 174 ---------------------------- 1 file changed, 174 deletions(-) delete mode 100644 .github/workflows/build-images.yaml diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml deleted file mode 100644 index 7996099d..00000000 --- a/.github/workflows/build-images.yaml +++ /dev/null @@ -1,174 +0,0 @@ -name: Build PR Image -on: - pull_request: - types: [opened,synchronize,reopened,closed] - -jobs: - build-vote: - name: Build and Push `vote` - runs-on: ubuntu-latest - if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} - outputs: - tags: ${{ steps.meta.outputs.tags }} - steps: - - name: Checkout git repo - uses: actions/checkout@v3 - - name: Generate UUID image name - id: uuid - run: echo "::set-output name=uuid::$(uuidgen)" - - name: Docker metadata - id: meta - uses: docker/metadata-action@v3 - with: - images: ttl.sh/${{ steps.uuid.outputs.uuid }} - tags: type=raw,value=24h - - name: Build and Push Image to ttl.sh ephemeral registry - uses: docker/build-push-action@v2 - with: - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - context: ./vote - - build-worker: - name: Build and Push `worker` - runs-on: ubuntu-latest - if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} - outputs: - tags: ${{ steps.meta.outputs.tags }} - steps: - - name: Checkout git repo - uses: actions/checkout@v3 - - name: Generate UUID image name - id: uuid - run: echo "::set-output name=uuid::$(uuidgen)" - - name: Docker metadata - id: meta - uses: docker/metadata-action@v3 - with: - images: ttl.sh/${{ steps.uuid.outputs.uuid }} - tags: type=raw,value=24h - - name: Build and Push Image to ttl.sh Ephemeral Registry - uses: docker/build-push-action@v2 - with: - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - context: ./worker - - build-result: - name: Build and Push `result` - runs-on: ubuntu-latest - if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} - outputs: - tags: ${{ steps.meta.outputs.tags }} - steps: - - name: Checkout git repo - uses: actions/checkout@v3 - - name: Generate UUID image name - id: uuid - run: echo "::set-output name=uuid::$(uuidgen)" - - name: Docker metadata - id: meta - uses: docker/metadata-action@v3 - with: - images: ttl.sh/${{ steps.uuid.outputs.uuid }} - tags: type=raw,value=24h - - name: Build and Push Image to ttl.sh Ephemeral Registry - uses: docker/build-push-action@v2 - with: - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - context: ./result - - build-loadbalancer: - name: Build and Push `loadbalancer` - runs-on: ubuntu-latest - if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} - outputs: - tags: ${{ steps.meta.outputs.tags }} - steps: - - name: Checkout git repo - uses: actions/checkout@v3 - - name: Generate UUID image name - id: uuid - run: echo "::set-output name=uuid::$(uuidgen)" - - name: Docker metadata - id: meta - uses: docker/metadata-action@v3 - with: - images: ttl.sh/${{ steps.uuid.outputs.uuid }} - tags: type=raw,value=24h - - name: Build and Push Image to ttl.sh Ephemeral Registry - uses: docker/build-push-action@v2 - with: - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - context: ./loadbalancer - - render-compose-file: - name: Render Docker Compose File - # Pass output of this workflow to another triggered by `workflow_run` event. - runs-on: ubuntu-latest - needs: - - build-vote - - build-worker - - build-result - - build-loadbalancer - outputs: - compose-file-cache-key: ${{ steps.hash.outputs.hash }} - steps: - - name: Checkout git repo - uses: actions/checkout@v3 - - name: Render Compose File - run: | - VOTE_IMAGE=$(echo ${{ needs.build-vote.outputs.tags }}) - export VOTE_IMAGE - WORKER_IMAGE=$(echo ${{ needs.build-worker.outputs.tags }}) - export WORKER_IMAGE - RESULT_IMAGE=$(echo ${{ needs.build-result.outputs.tags }}) - export RESULT_IMAGE - LOADBALANCER_IMAGE=$(echo ${{ needs.build-loadbalancer.outputs.tags }}) - export LOADBALANCER_IMAGE - PGUSER=${{ secrets.PGUSER }} - export PGUSER - PGPASSWORD=${{ secrets.PGPASSWORD }} - export PGPASSWORD - # Render simple template from environment variables. - envsubst < docker-compose.uffizzi.yml > docker-compose.rendered.yml - cat docker-compose.rendered.yml - - name: Upload Rendered Compose File as Artifact - uses: actions/upload-artifact@v3 - with: - name: preview-spec - path: docker-compose.rendered.yml - retention-days: 2 - - name: Serialize PR Event to File - run: | - cat << EOF > event.json - ${{ toJSON(github.event) }} - - EOF - - name: Upload PR Event as Artifact - uses: actions/upload-artifact@v3 - with: - name: preview-spec - path: event.json - retention-days: 2 - - delete-preview: - name: Call for Preview Deletion - runs-on: ubuntu-latest - if: ${{ github.event.action == 'closed' }} - steps: - # If this PR is closing, we will not render a compose file nor pass it to the next workflow. - - name: Serialize PR Event to File - run: echo '${{ toJSON(github.event) }}' > event.json - - name: Upload PR Event as Artifact - uses: actions/upload-artifact@v3 - with: - name: preview-spec - path: event.json - retention-days: 2 From 6cbbb0f65e899cb05c96ea42531280f8d959df1d Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Thu, 13 Oct 2022 15:44:10 -0500 Subject: [PATCH 10/32] Rename workflow --- .github/workflows/uffizzi-preview.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml index 0ef0b398..2e4fce66 100644 --- a/.github/workflows/uffizzi-preview.yaml +++ b/.github/workflows/uffizzi-preview.yaml @@ -1,4 +1,4 @@ -name: Build Images and Handle Uffizzi Previews +name: Build Images and Deploy Preview Environment on: pull_request: From 58b21fbd7a32bb0f6b4009fee709c9afdb3ce56b Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Thu, 13 Oct 2022 15:57:34 -0500 Subject: [PATCH 11/32] Update README.md --- README.md | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 8fefc6df..404f1f04 100644 --- a/README.md +++ b/README.md @@ -24,23 +24,18 @@ That's it! This will kick off a GitHub Actions workflow and post the Preview Env ## What to expect -The PR will trigger a [GitHub Actions workflow](https://github.com/UffizziCloud/quickstart/blob/main/.github/workflows/uffizzi-preview.yaml) that creates a Uffizzi Preview Environment for the [microservices application](#architecture-of-this-example-app) defined by this repo. The Preview Environment URL will be posted as a comment in your PR issue when the workflow completes, along with a link to the Uffizzi Dashboard where you can view application logs. The Preview Environment will be deleted when the PR is merged/closed or after 1 hour ([configurable](https://github.com/UffizziCloud/quickstart/blob/6aba97b1e27c8fafba2d6461087abfe06becf9ce/docker-compose.uffizzi.yml#L7)). +The PR will trigger a [GitHub Actions workflow](.github/workflows/uffizzi-preview.yaml) that creates a Uffizzi Preview Environment for the [microservices application](#architecture-of-this-example-app) defined by this repo. The Preview Environment URL will be posted as a comment in your PR issue when the workflow completes, along with a link to the Uffizzi Dashboard where you can view application logs. The Preview Environment will be deleted when the PR is merged/closed or after 1 hour ([configurable](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/docker-compose.uffizzi.yml#L7)). ## How it works ### Configuration -Previews are configured with a [Docker Compose template](docker-compose.uffizzi.yml) that describes the application components and two [GitHub Actions workflows](.github/workflows), `build-images.yaml` and `uffizzi-preview.yaml`. The build workflow runs on `pull_request` events, while the preview workflow triggers only if the build is successful: +Preview Environments are configured with a [Docker Compose template](docker-compose.uffizzi.yml) that describes the application components and a [GitHub Actions workflow](.github/workflows/uffizzi-preview.yaml) that includes a series of jobs triggered by a `pull_request` event and subsequent `push` events: -#### `build-images.yaml` -(1) [Build and push images to a container registry](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/build-images.yaml#L7-L109) if a pull request is opened, reopened, or synchronized. -(2) [Render a Docker Compose file](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/build-images.yaml#L111-L159) from the [Docker Compose template](docker-compose.uffizzi.yml) and the built images; store rendered Compose as an artifact. - -#### `uffizzi-preview.yaml` -(3) [Download and extract the Docker Compose artifact](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/uffizzi-preview.yaml#L11-L68) -(4) [Deploy the application to a Uffizzi Preview Environment](https://github.com/UffizziCloud/quickstart/blob/5699f461f752b0bd787d69abc2cfad3b79e0308b/.github/workflows/uffizzi-preview.yaml#L158-L171) and post a comment to the PR issue. - -[Delete the Preview Environment](https://github.com/UffizziCloud/quickstart/blob/0b8e9aaf641924d93edc753e051928e95f3e7ef4/.github/workflows/build-images.yaml#L161-L174), if the pull request is closed. +1. [Build and push images to a container registry](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L8-L114) +2. [Render a Docker Compose file](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L116-L154) from the Docker Compose template and the built images +3. [Deploy the application to a Uffizzi Preview Environment](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L156-L167) and post a comment to the PR issue +4. [Delete the Preview Environment](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L169-L180) when the PR is merged/closed or after [`1h`](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/docker-compose.uffizzi.yml#L7). ### Uffizzi Cloud From 31b13690162218d0ee8414e6a2647aaff358a00b Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Thu, 13 Oct 2022 15:58:31 -0500 Subject: [PATCH 12/32] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 404f1f04..0810a610 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Select **Actions**, then select **I understand my workflows, go ahead and enable ### 3. Open a pull request for `try-uffizzi` branch against `main` in your fork -Be sure that you're opening a PR on the branches of _your fork_ (i.e. `your-account/main` ← `your-account/try-uffizzi`). If you try to open a PR for `UffizziCloud/main` ← `your-account/try-uffizzi`, the Actions workflow will not run. +Be sure that you're opening a PR on the branches of _your fork_ (i.e. `your-account/main` ← `your-account/try-uffizzi`). If you try to open a PR for `UffizziCloud/main` ← `your-account/try-uffizzi`, the Actions workflow will not run in this example. That's it! This will kick off a GitHub Actions workflow and post the Preview Environment URL as a comment to your PR issue. @@ -35,7 +35,7 @@ Preview Environments are configured with a [Docker Compose template](docker-comp 1. [Build and push images to a container registry](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L8-L114) 2. [Render a Docker Compose file](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L116-L154) from the Docker Compose template and the built images 3. [Deploy the application to a Uffizzi Preview Environment](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L156-L167) and post a comment to the PR issue -4. [Delete the Preview Environment](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L169-L180) when the PR is merged/closed or after [`1h`](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/docker-compose.uffizzi.yml#L7). +4. [Delete the Preview Environment](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L169-L180) when the PR is merged/closed or after [`1h`](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/docker-compose.uffizzi.yml#L7) ### Uffizzi Cloud From b272785a785423972092101734dfe8221b10b781 Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Thu, 13 Oct 2022 16:08:59 -0500 Subject: [PATCH 13/32] Update registry domain --- .github/workflows/uffizzi-preview.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml index 2e4fce66..237264ba 100644 --- a/.github/workflows/uffizzi-preview.yaml +++ b/.github/workflows/uffizzi-preview.yaml @@ -22,7 +22,7 @@ jobs: uses: docker/metadata-action@v3 with: # An anonymous, emphemeral registry built on ttl.sh - images: ephemeron.uffizzi.com/${{ steps.uuid.outputs.uuid }} + images: registry.uffizzi.com/${{ steps.uuid.outputs.uuid }} tags: type=raw,value=24h - name: Build and Push Image to Uffizzi Ephemeral Registry uses: docker/build-push-action@v2 @@ -49,7 +49,7 @@ jobs: uses: docker/metadata-action@v3 with: # An anonymous, emphemeral registry built on ttl.sh - images: ephemeron.uffizzi.com/${{ steps.uuid.outputs.uuid }} + images: registry.uffizzi.com/${{ steps.uuid.outputs.uuid }} tags: type=raw,value=24h - name: Build and Push Image to Uffizzi Ephemeral Registry uses: docker/build-push-action@v2 @@ -76,7 +76,7 @@ jobs: uses: docker/metadata-action@v3 with: # An anonymous, emphemeral registry built on ttl.sh - images: ephemeron.uffizzi.com/${{ steps.uuid.outputs.uuid }} + images: registry.uffizzi.com/${{ steps.uuid.outputs.uuid }} tags: type=raw,value=24h - name: Build and Push Image to Uffizzi Ephemeral Registry uses: docker/build-push-action@v2 @@ -103,7 +103,7 @@ jobs: uses: docker/metadata-action@v3 with: # An anonymous, emphemeral registry built on ttl.sh - images: ephemeron.uffizzi.com/${{ steps.uuid.outputs.uuid }} + images: registry.uffizzi.com/${{ steps.uuid.outputs.uuid }} tags: type=raw,value=24h - name: Build and Push Image to Uffizzi Ephemeral Registry uses: docker/build-push-action@v2 From 65cb8690ea71ff37c4542328ac3957157a8edc2c Mon Sep 17 00:00:00 2001 From: Adam Vollrath Date: Tue, 18 Oct 2022 14:55:08 -0500 Subject: [PATCH 14/32] fix reusable workflow version to tag. --- .github/workflows/uffizzi-preview.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml index 237264ba..4c04215f 100644 --- a/.github/workflows/uffizzi-preview.yaml +++ b/.github/workflows/uffizzi-preview.yaml @@ -156,7 +156,7 @@ jobs: deploy-uffizzi-preview: name: Use Remote Workflow to Preview on Uffizzi needs: render-compose-file - uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2 + uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.5.0 with: compose-file-cache-key: ${{ needs.render-compose-file.outputs.compose-file-cache-key }} compose-file-cache-path: ${{ needs.render-compose-file.outputs.compose-file-cache-path }} @@ -168,7 +168,7 @@ jobs: delete-uffizzi-preview: name: Use Remote Workflow to Delete an Existing Preview - uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2 + uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.5.0 if: ${{ github.event_name == 'pull_request' && github.event.action == 'closed' }} with: compose-file-cache-key: '' From a31e67559d7f885fd04dacfebe33b4a3139afa0a Mon Sep 17 00:00:00 2001 From: Adam Vollrath Date: Thu, 27 Oct 2022 16:08:06 +0000 Subject: [PATCH 15/32] Use latest release of reusable workflow. --- .github/workflows/uffizzi-preview.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml index 4c04215f..ab59c0c4 100644 --- a/.github/workflows/uffizzi-preview.yaml +++ b/.github/workflows/uffizzi-preview.yaml @@ -156,7 +156,7 @@ jobs: deploy-uffizzi-preview: name: Use Remote Workflow to Preview on Uffizzi needs: render-compose-file - uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.5.0 + uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.6.0 with: compose-file-cache-key: ${{ needs.render-compose-file.outputs.compose-file-cache-key }} compose-file-cache-path: ${{ needs.render-compose-file.outputs.compose-file-cache-path }} @@ -168,7 +168,7 @@ jobs: delete-uffizzi-preview: name: Use Remote Workflow to Delete an Existing Preview - uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.5.0 + uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.6.0 if: ${{ github.event_name == 'pull_request' && github.event.action == 'closed' }} with: compose-file-cache-key: '' From 9b382616479534d6aca358f141b2693db040620c Mon Sep 17 00:00:00 2001 From: Adam Vollrath Date: Thu, 27 Oct 2022 16:09:01 +0000 Subject: [PATCH 16/32] Remove trailing whitespace from README. --- README.md | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 0810a610..0a744403 100644 --- a/README.md +++ b/README.md @@ -2,40 +2,40 @@ Go from pull request to Uffizzi Preview Environment in less than one minute... -### 1. Fork this repo +### 1. Fork this repo -Be sure to uncheck the option **Copy the `main` branch only**. This ensures that the `try-uffizzi` branch will be included in your fork. +Be sure to uncheck the option **Copy the `main` branch only**. This ensures that the `try-uffizzi` branch will be included in your fork. - + ### 2. Enable GitHub Actions workflows for your fork -Select **Actions**, then select **I understand my workflows, go ahead and enable them**. +Select **Actions**, then select **I understand my workflows, go ahead and enable them**. - + -### 3. Open a pull request for `try-uffizzi` branch against `main` in your fork +### 3. Open a pull request for `try-uffizzi` branch against `main` in your fork -Be sure that you're opening a PR on the branches of _your fork_ (i.e. `your-account/main` ← `your-account/try-uffizzi`). If you try to open a PR for `UffizziCloud/main` ← `your-account/try-uffizzi`, the Actions workflow will not run in this example. +Be sure that you're opening a PR on the branches of _your fork_ (i.e. `your-account/main` ← `your-account/try-uffizzi`). If you try to open a PR for `UffizziCloud/main` ← `your-account/try-uffizzi`, the Actions workflow will not run in this example. -That's it! This will kick off a GitHub Actions workflow and post the Preview Environment URL as a comment to your PR issue. +That's it! This will kick off a GitHub Actions workflow and post the Preview Environment URL as a comment to your PR issue. uffizzi-bot -## What to expect +## What to expect -The PR will trigger a [GitHub Actions workflow](.github/workflows/uffizzi-preview.yaml) that creates a Uffizzi Preview Environment for the [microservices application](#architecture-of-this-example-app) defined by this repo. The Preview Environment URL will be posted as a comment in your PR issue when the workflow completes, along with a link to the Uffizzi Dashboard where you can view application logs. The Preview Environment will be deleted when the PR is merged/closed or after 1 hour ([configurable](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/docker-compose.uffizzi.yml#L7)). +The PR will trigger a [GitHub Actions workflow](.github/workflows/uffizzi-preview.yaml) that creates a Uffizzi Preview Environment for the [microservices application](#architecture-of-this-example-app) defined by this repo. The Preview Environment URL will be posted as a comment in your PR issue when the workflow completes, along with a link to the Uffizzi Dashboard where you can view application logs. The Preview Environment will be deleted when the PR is merged/closed or after 1 hour ([configurable](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/docker-compose.uffizzi.yml#L7)). -## How it works +## How it works ### Configuration -Preview Environments are configured with a [Docker Compose template](docker-compose.uffizzi.yml) that describes the application components and a [GitHub Actions workflow](.github/workflows/uffizzi-preview.yaml) that includes a series of jobs triggered by a `pull_request` event and subsequent `push` events: +Preview Environments are configured with a [Docker Compose template](docker-compose.uffizzi.yml) that describes the application components and a [GitHub Actions workflow](.github/workflows/uffizzi-preview.yaml) that includes a series of jobs triggered by a `pull_request` event and subsequent `push` events: -1. [Build and push images to a container registry](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L8-L114) -2. [Render a Docker Compose file](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L116-L154) from the Docker Compose template and the built images -3. [Deploy the application to a Uffizzi Preview Environment](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L156-L167) and post a comment to the PR issue -4. [Delete the Preview Environment](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L169-L180) when the PR is merged/closed or after [`1h`](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/docker-compose.uffizzi.yml#L7) +1. [Build and push images to a container registry](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L8-L114) +2. [Render a Docker Compose file](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L116-L154) from the Docker Compose template and the built images +3. [Deploy the application to a Uffizzi Preview Environment](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L156-L167) and post a comment to the PR issue +4. [Delete the Preview Environment](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/.github/workflows/uffizzi-preview.yaml#L169-L180) when the PR is merged/closed or after [`1h`](https://github.com/UffizziCloud/quickstart/blob/6cbbb0f65e899cb05c96ea42531280f8d959df1d/docker-compose.uffizzi.yml#L7) ### Uffizzi Cloud @@ -45,25 +45,25 @@ Each account receives 10,000 preview minutes per month for free. If you exceed t ## Acceptable Use -We strive to keep Uffizzi Cloud free or inexpensive for individuals and small teams. Therefore, activities such as crypto mining, filesharing, bots, and similar uses that lead to increased cost and intermittent issues for other users are strictly prohibited per the [Acceptable Use Policy](https://uffizzi.zendesk.com/hc/en-us/articles/4410657390999-Acceptable-Use-Policy). Violators of this policy are subject to permanent ban. +We strive to keep Uffizzi Cloud free or inexpensive for individuals and small teams. Therefore, activities such as crypto mining, filesharing, bots, and similar uses that lead to increased cost and intermittent issues for other users are strictly prohibited per the [Acceptable Use Policy](https://uffizzi.zendesk.com/hc/en-us/articles/4410657390999-Acceptable-Use-Policy). Violators of this policy are subject to permanent ban. ## Architecture of this Example App -The application defined by this repo allows users to vote for dogs or cats and see the results. It consists of the following microservices: +The application defined by this repo allows users to vote for dogs or cats and see the results. It consists of the following microservices: -* **voting-app** - A frontend web app in [Python](/vote) which lets you vote between two options -* **redis** - A [Redis](https://hub.docker.com/_/redis/) queue which collects new votes -* **worker** - A [.NET Core](/worker/src/Worker) worker which consumes votes and stores them in… +* **voting-app** - A frontend web app in [Python](/vote) which lets you vote between two options +* **redis** - A [Redis](https://hub.docker.com/_/redis/) queue which collects new votes +* **worker** - A [.NET Core](/worker/src/Worker) worker which consumes votes and stores them in… * **db** - A [PostgreSQL](https://hub.docker.com/_/postgres/) database backed by a Docker volume * **result-app** - A [Node.js](/result) web app which shows the results of the voting in real time ## Set up Preview Environments for your application -You can follow this [step-by-step guide](https://docs.uffizzi.com/set-up-uffizzi-for-your-application) to configure Preview Environments for your own application. The required components are: +You can follow this [step-by-step guide](https://docs.uffizzi.com/set-up-uffizzi-for-your-application) to configure Preview Environments for your own application. The required components are: -- **A Docker Compose template (`docker-compose.uffizzi.yml`) committed to your repo** - This template must include [`ingress`](https://github.com/UffizziCloud/quickstart/blob/6aba97b1e27c8fafba2d6461087abfe06becf9ce/docker-compose.uffizzi.yml#L2-L5) and `services` definitions. For a full list of supported keywords, see [Docker Compose for Uffizzi](https://docs.uffizzi.com/references/compose-spec/). +- **A Docker Compose template (`docker-compose.uffizzi.yml`) committed to your repo** - This template must include [`ingress`](https://github.com/UffizziCloud/quickstart/blob/6aba97b1e27c8fafba2d6461087abfe06becf9ce/docker-compose.uffizzi.yml#L2-L5) and `services` definitions. For a full list of supported keywords, see [Docker Compose for Uffizzi](https://docs.uffizzi.com/references/compose-spec/). - **A Uffizzi preview job added to your pipeline** - In the example app used by this quickstart guide, we use GitHub and GitHub Actions, but Uffizzi is designed to work with any version control system or CI platform. As a convenience, we've written actions/jobs for [these popular CI platforms](https://github.com/UffizziCloud/uffizzi_app/tree/develop/ci/). If your platform is not listed, you can still add Uffizzi to your pipeline by wrapping the [Uffizzi CLI](https://github.com/UffizziCloud/uffizzi_cli), which is distributed as a container image [available on Docker Hub](https://hub.docker.com/r/uffizzi/cli). See our GitHub [`preview-action`](https://github.com/UffizziCloud/preview-action/blob/master/action.yaml) and [reusable workflow](https://github.com/UffizziCloud/preview-action/blob/master/.github/workflows/reusable.yaml) as examples. @@ -95,9 +95,9 @@ Uffizzi does not replace GitHub Actions or any other CI provider. Uffizzi previe
Can I connect Uffizzi with Netlify/Vercel? -Yes. While Uffizzi supports full-stack previews, some users who already leverage frontend platforms like Netlify or Vercel want to add Uffizzi previews for their APIs/backend. For help configuring this scenario see: +Yes. While Uffizzi supports full-stack previews, some users who already leverage frontend platforms like Netlify or Vercel want to add Uffizzi previews for their APIs/backend. For help configuring this scenario see:
@@ -109,4 +109,4 @@ Yes. Check out the main re ## Get in touch -For questions, concerns, issues, or feature requests, please join our fast growing [community](https://uffizzi.slack.com/join/shared_invite/zt-ffr4o3x0-J~0yVT6qgFV~wmGm19Ux9A#/shared-invite/email) on Slack. +For questions, concerns, issues, or feature requests, please join our fast growing [community](https://uffizzi.slack.com/join/shared_invite/zt-ffr4o3x0-J~0yVT6qgFV~wmGm19Ux9A#/shared-invite/email) on Slack. From 13314f2c8909f367416ae734519ac3237e7a5bc3 Mon Sep 17 00:00:00 2001 From: Adam Vollrath Date: Mon, 7 Nov 2022 11:37:26 -0600 Subject: [PATCH 17/32] Upgrade actions and avoid using deprecated `set-output` command. (#29) https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/ --- .github/workflows/uffizzi-preview.yaml | 42 +++++++++++++------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml index ab59c0c4..3509540e 100644 --- a/.github/workflows/uffizzi-preview.yaml +++ b/.github/workflows/uffizzi-preview.yaml @@ -16,16 +16,16 @@ jobs: uses: actions/checkout@v3 - name: Generate UUID image name id: uuid - run: echo "::set-output name=uuid::$(uuidgen)" + run: echo "UUID_VOTE=$(uuidgen)" >> $GITHUB_ENV - name: Docker metadata id: meta - uses: docker/metadata-action@v3 + uses: docker/metadata-action@v4 with: # An anonymous, emphemeral registry built on ttl.sh - images: registry.uffizzi.com/${{ steps.uuid.outputs.uuid }} + images: registry.uffizzi.com/${{ env.UUID_VOTE }} tags: type=raw,value=24h - name: Build and Push Image to Uffizzi Ephemeral Registry - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: push: true tags: ${{ steps.meta.outputs.tags }} @@ -43,16 +43,16 @@ jobs: uses: actions/checkout@v3 - name: Generate UUID image name id: uuid - run: echo "::set-output name=uuid::$(uuidgen)" + run: echo "UUID_WORKER=$(uuidgen)" >> $GITHUB_ENV - name: Docker metadata id: meta - uses: docker/metadata-action@v3 + uses: docker/metadata-action@v4 with: # An anonymous, emphemeral registry built on ttl.sh - images: registry.uffizzi.com/${{ steps.uuid.outputs.uuid }} + images: registry.uffizzi.com/${{ env.UUID_WORKER }} tags: type=raw,value=24h - name: Build and Push Image to Uffizzi Ephemeral Registry - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: push: true tags: ${{ steps.meta.outputs.tags }} @@ -70,16 +70,16 @@ jobs: uses: actions/checkout@v3 - name: Generate UUID image name id: uuid - run: echo "::set-output name=uuid::$(uuidgen)" + run: echo "UUID_RESULT=$(uuidgen)" >> $GITHUB_ENV - name: Docker metadata id: meta - uses: docker/metadata-action@v3 + uses: docker/metadata-action@v4 with: # An anonymous, emphemeral registry built on ttl.sh - images: registry.uffizzi.com/${{ steps.uuid.outputs.uuid }} + images: registry.uffizzi.com/${{ env.UUID_RESULT }} tags: type=raw,value=24h - name: Build and Push Image to Uffizzi Ephemeral Registry - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: push: true tags: ${{ steps.meta.outputs.tags }} @@ -97,16 +97,16 @@ jobs: uses: actions/checkout@v3 - name: Generate UUID image name id: uuid - run: echo "::set-output name=uuid::$(uuidgen)" + run: echo "UUID_LOADBALANCER=$(uuidgen)" >> $GITHUB_ENV - name: Docker metadata id: meta - uses: docker/metadata-action@v3 + uses: docker/metadata-action@v4 with: # An anonymous, emphemeral registry built on ttl.sh - images: registry.uffizzi.com/${{ steps.uuid.outputs.uuid }} + images: registry.uffizzi.com/${{ env.UUID_LOADBALANCER }} tags: type=raw,value=24h - name: Build and Push Image to Uffizzi Ephemeral Registry - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v3 with: push: true tags: ${{ steps.meta.outputs.tags }} @@ -122,7 +122,7 @@ jobs: - build-result - build-loadbalancer outputs: - compose-file-cache-key: ${{ steps.hash.outputs.hash }} + compose-file-cache-key: ${{ env.COMPOSE_FILE_HASH }} compose-file-cache-path: docker-compose.rendered.yml steps: - name: Checkout git repo @@ -146,12 +146,12 @@ jobs: cat docker-compose.rendered.yml - name: Hash Rendered Compose File id: hash - run: echo "::set-output name=hash::$(md5sum docker-compose.rendered.yml | awk '{ print $1 }')" + run: echo "COMPOSE_FILE_HASH=$(md5sum docker-compose.rendered.yml | awk '{ print $1 }')" >> $GITHUB_ENV - name: Cache Rendered Compose File uses: actions/cache@v3 with: path: docker-compose.rendered.yml - key: ${{ steps.hash.outputs.hash }} + key: ${{ env.COMPOSE_FILE_HASH }} deploy-uffizzi-preview: name: Use Remote Workflow to Preview on Uffizzi @@ -160,7 +160,7 @@ jobs: with: compose-file-cache-key: ${{ needs.render-compose-file.outputs.compose-file-cache-key }} compose-file-cache-path: ${{ needs.render-compose-file.outputs.compose-file-cache-path }} - server: https://app.uffizzi.com/ + server: https://app.uffizzi.com permissions: contents: read pull-requests: write @@ -173,7 +173,7 @@ jobs: with: compose-file-cache-key: '' compose-file-cache-path: docker-compose.rendered.yml - server: https://app.uffizzi.com/ + server: https://app.uffizzi.com permissions: contents: read pull-requests: write From aadb91b021d9047e2319d47c7990db6aebbf231b Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Wed, 9 Nov 2022 16:10:19 -0600 Subject: [PATCH 18/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0a744403..8b85c14d 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Preview Environments are configured with a [Docker Compose template](docker-comp Running this workflow will create a [Uffizzi Cloud](https://uffizzi.com) account and project from your GitHub user and repo information, respectively. If you sign in to the [Uffizzi Dashboard](https://app.uffizzi.com/sign_in) you can view logs, password protect your Preview Environments, manage projects and team members, set role-based access controls, and configure single-sign on (SSO). -Each account receives 10,000 preview minutes per month for free. If you exceed this amount, your Preview Environments will be paused unless you add a credit card. See [our pricing](https://uffizzi.com/pricing) for details. Alternatively, you can [install open-source Uffizzi](https://github.com/UffizziCloud/uffizzi_app/blob/develop/INSTALL.md) if you have your own Kubernetes cluster. +Open-source projects preview for free on Uffizzi Cloud. All other accounts receive 10,000 preview minutes per month for free. If you exceed this amount, your Preview Environments will be paused unless you add a credit card. See [our pricing](https://uffizzi.com/pricing) for details. Alternatively, you can [install open-source Uffizzi](https://github.com/UffizziCloud/uffizzi_app/blob/develop/INSTALL.md) if you have your own Kubernetes cluster. ## Acceptable Use From 68a3819657e184092116f29c38b82ae13721c645 Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Wed, 9 Nov 2022 16:28:31 -0600 Subject: [PATCH 19/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b85c14d..6ca942a0 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Preview Environments are configured with a [Docker Compose template](docker-comp Running this workflow will create a [Uffizzi Cloud](https://uffizzi.com) account and project from your GitHub user and repo information, respectively. If you sign in to the [Uffizzi Dashboard](https://app.uffizzi.com/sign_in) you can view logs, password protect your Preview Environments, manage projects and team members, set role-based access controls, and configure single-sign on (SSO). -Open-source projects preview for free on Uffizzi Cloud. All other accounts receive 10,000 preview minutes per month for free. If you exceed this amount, your Preview Environments will be paused unless you add a credit card. See [our pricing](https://uffizzi.com/pricing) for details. Alternatively, you can [install open-source Uffizzi](https://github.com/UffizziCloud/uffizzi_app/blob/develop/INSTALL.md) if you have your own Kubernetes cluster. +Open-source projects preview for free on Uffizzi Cloud. All other accounts receive 10,000 preview minutes per month for free. If you exceed this amount, your Preview Environments will be paused unless you add a credit card. See [our pricing](https://uffizzi.com/pricing) for details or to request free access as an open-source maintainer. Alternatively, you can [install open-source Uffizzi](https://github.com/UffizziCloud/uffizzi_app/blob/develop/INSTALL.md) if you have your own Kubernetes cluster. ## Acceptable Use From 355840760150012524f907a87f4c5f11d898bac3 Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Wed, 9 Nov 2022 16:29:36 -0600 Subject: [PATCH 20/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6ca942a0..484e3282 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Preview Environments are configured with a [Docker Compose template](docker-comp Running this workflow will create a [Uffizzi Cloud](https://uffizzi.com) account and project from your GitHub user and repo information, respectively. If you sign in to the [Uffizzi Dashboard](https://app.uffizzi.com/sign_in) you can view logs, password protect your Preview Environments, manage projects and team members, set role-based access controls, and configure single-sign on (SSO). -Open-source projects preview for free on Uffizzi Cloud. All other accounts receive 10,000 preview minutes per month for free. If you exceed this amount, your Preview Environments will be paused unless you add a credit card. See [our pricing](https://uffizzi.com/pricing) for details or to request free access as an open-source maintainer. Alternatively, you can [install open-source Uffizzi](https://github.com/UffizziCloud/uffizzi_app/blob/develop/INSTALL.md) if you have your own Kubernetes cluster. +Open-source projects preview for free on Uffizzi Cloud. All other accounts receive 10,000 preview minutes per month for free. If you exceed this amount, your Preview Environments will be paused unless you add a credit card. See [our pricing](https://uffizzi.com/pricing) for details or to request free access as an open-source maintainer. Alternatively, if you don't want to use Uffizzi Cloud, you can [install open-source Uffizzi](https://github.com/UffizziCloud/uffizzi_app/blob/develop/INSTALL.md) if you have your own Kubernetes cluster. ## Acceptable Use From 091538b43277c40d096d72ab1f41be45d21824d5 Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Wed, 9 Nov 2022 16:30:06 -0600 Subject: [PATCH 21/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 484e3282..522fca30 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Preview Environments are configured with a [Docker Compose template](docker-comp Running this workflow will create a [Uffizzi Cloud](https://uffizzi.com) account and project from your GitHub user and repo information, respectively. If you sign in to the [Uffizzi Dashboard](https://app.uffizzi.com/sign_in) you can view logs, password protect your Preview Environments, manage projects and team members, set role-based access controls, and configure single-sign on (SSO). -Open-source projects preview for free on Uffizzi Cloud. All other accounts receive 10,000 preview minutes per month for free. If you exceed this amount, your Preview Environments will be paused unless you add a credit card. See [our pricing](https://uffizzi.com/pricing) for details or to request free access as an open-source maintainer. Alternatively, if you don't want to use Uffizzi Cloud, you can [install open-source Uffizzi](https://github.com/UffizziCloud/uffizzi_app/blob/develop/INSTALL.md) if you have your own Kubernetes cluster. +Open-source projects preview for free on Uffizzi Cloud. All other accounts receive 10,000 preview minutes per month for free. If you exceed this amount, your Preview Environments will be paused unless you add a credit card. See [our pricing](https://uffizzi.com/pricing) for details or to request free access as an open-source maintainer. Alternatively, if you don't want to use Uffizzi Cloud, you can [install open-source Uffizzi](https://github.com/UffizziCloud/uffizzi_app/blob/develop/INSTALL.md) on your own Kubernetes cluster. ## Acceptable Use From 0a32203c853d8572040157037f2518cdc933c4d8 Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Mon, 28 Nov 2022 15:43:18 -0600 Subject: [PATCH 22/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 522fca30..62289895 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Go from pull request to Uffizzi Preview Environment in less than one minute... ### 1. Fork this repo -Be sure to uncheck the option **Copy the `main` branch only**. This ensures that the `try-uffizzi` branch will be included in your fork. +Be sure to **uncheck** the option **Copy the `main` branch only**. This ensures that the `try-uffizzi` branch will be included in your fork. From 59eb2a14357d03faf1984f59a0f291935f846ed9 Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Mon, 28 Nov 2022 15:48:48 -0600 Subject: [PATCH 23/32] Added emphasis --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 62289895..8c53f837 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,10 @@ Go from pull request to Uffizzi Preview Environment in less than one minute... ### 1. Fork this repo -Be sure to **uncheck** the option **Copy the `main` branch only**. This ensures that the `try-uffizzi` branch will be included in your fork. +⚠️ Be sure to **uncheck** the option **Copy the `main` branch only**. +This ensures that the `try-uffizzi` branch will be included in your fork. +  ### 2. Enable GitHub Actions workflows for your fork @@ -16,7 +18,9 @@ Select **Actions**, then select **I understand my workflows, go ahead and enable ### 3. Open a pull request for `try-uffizzi` branch against `main` in your fork -Be sure that you're opening a PR on the branches of _your fork_ (i.e. `your-account/main` ← `your-account/try-uffizzi`). If you try to open a PR for `UffizziCloud/main` ← `your-account/try-uffizzi`, the Actions workflow will not run in this example. +⚠️ Be sure that you're opening a PR on the branches of _your fork_ (i.e. `your-account/main` ← `your-account/try-uffizzi`). + +If you try to open a PR for `UffizziCloud/main` ← `your-account/try-uffizzi`, the Actions workflow will not run in this example. That's it! This will kick off a GitHub Actions workflow and post the Preview Environment URL as a comment to your PR issue. From 946adbc64412d8f3e18b86006c4813555b498108 Mon Sep 17 00:00:00 2001 From: Adam Vollrath Date: Thu, 2 Mar 2023 11:25:56 -0600 Subject: [PATCH 24/32] Update reusable workflow. --- .github/workflows/uffizzi-preview.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml index 3509540e..3e3dd602 100644 --- a/.github/workflows/uffizzi-preview.yaml +++ b/.github/workflows/uffizzi-preview.yaml @@ -156,7 +156,7 @@ jobs: deploy-uffizzi-preview: name: Use Remote Workflow to Preview on Uffizzi needs: render-compose-file - uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.6.0 + uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2 with: compose-file-cache-key: ${{ needs.render-compose-file.outputs.compose-file-cache-key }} compose-file-cache-path: ${{ needs.render-compose-file.outputs.compose-file-cache-path }} @@ -168,7 +168,7 @@ jobs: delete-uffizzi-preview: name: Use Remote Workflow to Delete an Existing Preview - uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.6.0 + uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2 if: ${{ github.event_name == 'pull_request' && github.event.action == 'closed' }} with: compose-file-cache-key: '' From 6154f9d97fd0759b9bfbe8dfe2c84acaee252d83 Mon Sep 17 00:00:00 2001 From: Grayson Adkins Date: Tue, 28 Mar 2023 09:39:30 -0500 Subject: [PATCH 25/32] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c53f837..d28a9e7e 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Preview Environments are configured with a [Docker Compose template](docker-comp Running this workflow will create a [Uffizzi Cloud](https://uffizzi.com) account and project from your GitHub user and repo information, respectively. If you sign in to the [Uffizzi Dashboard](https://app.uffizzi.com/sign_in) you can view logs, password protect your Preview Environments, manage projects and team members, set role-based access controls, and configure single-sign on (SSO). -Open-source projects preview for free on Uffizzi Cloud. All other accounts receive 10,000 preview minutes per month for free. If you exceed this amount, your Preview Environments will be paused unless you add a credit card. See [our pricing](https://uffizzi.com/pricing) for details or to request free access as an open-source maintainer. Alternatively, if you don't want to use Uffizzi Cloud, you can [install open-source Uffizzi](https://github.com/UffizziCloud/uffizzi_app/blob/develop/INSTALL.md) on your own Kubernetes cluster. +Open-source projects preview for free on Uffizzi Cloud. All other accounts can subscribe to our Starter or Pro plans. See [our pricing](https://uffizzi.com/pricing) for details. Or if you're an open-source maintainer, you can request free access as by sending an email to opensource@uffizzi.com. Alternatively, if you don't want to use Uffizzi Cloud, you can [install open-source Uffizzi](https://github.com/UffizziCloud/uffizzi_app/blob/develop/INSTALL.md) on your own Kubernetes cluster. ## Acceptable Use From bf188ee7d169c7a3487e3605854a5c3ec5457c5e Mon Sep 17 00:00:00 2001 From: Lidia Mokevnina Date: Wed, 26 Apr 2023 10:06:38 +0200 Subject: [PATCH 26/32] added option to body-parser --- result/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/result/server.js b/result/server.js index e9217ff4..efd7fdb3 100644 --- a/result/server.js +++ b/result/server.js @@ -82,7 +82,7 @@ function collectVotesFromResult(result) { } app.use(cookieParser()); -app.use(bodyParser()); +app.use(bodyParser.urlencoded({ extended: true })); app.use(methodOverride('X-HTTP-Method-Override')); app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); From 5a93966c4e88b18e95aea0c9f8a24fbeb4879975 Mon Sep 17 00:00:00 2001 From: Lidia Mokevnina Date: Wed, 26 Apr 2023 10:09:35 +0200 Subject: [PATCH 27/32] updated node version --- result/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/result/Dockerfile b/result/Dockerfile index c4bce0f4..c9933e39 100644 --- a/result/Dockerfile +++ b/result/Dockerfile @@ -1,4 +1,4 @@ -FROM node:10-slim +FROM node:18-slim # add curl for healthcheck # add wait-for-it to delay start From 4b49d16b4943d0c1da4f6d79d2018c7490644b12 Mon Sep 17 00:00:00 2001 From: Lidia Mokevnina Date: Wed, 26 Apr 2023 11:29:44 +0200 Subject: [PATCH 28/32] fixed the result container restarts --- result/server.js | 1 + 1 file changed, 1 insertion(+) diff --git a/result/server.js b/result/server.js index efd7fdb3..eb3bfb04 100644 --- a/result/server.js +++ b/result/server.js @@ -13,6 +13,7 @@ var express = require('express'), io.set('transports', ['polling']); var port = process.env.PORT || 4000; +app.listen(port) // Environment variables for PostgreSQL connection var pghost = process.env.PGHOST || 'localhost'; From 31b801eb20e7b2437ac665dadb75f9d1a32e4658 Mon Sep 17 00:00:00 2001 From: Lidia Mokevnina Date: Wed, 26 Apr 2023 12:33:07 +0200 Subject: [PATCH 29/32] updated pg version --- result/package-lock.json | 751 ++++++++++++++++++++++++--------------- result/package.json | 2 +- result/server.js | 1 - 3 files changed, 475 insertions(+), 279 deletions(-) diff --git a/result/package-lock.json b/result/package-lock.json index e879f966..c2d5504f 100644 --- a/result/package-lock.json +++ b/result/package-lock.json @@ -1,63 +1,87 @@ { "name": "result", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "accepts": { + "packages": { + "": { + "name": "result", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "async": "^3.1.0", + "body-parser": "^1.19.0", + "cookie-parser": "^1.4.4", + "express": "^4.17.1", + "method-override": "^3.0.0", + "pg": "^8.0.3", + "socket.io": "^2.2.0", + "stoppable": "^1.1.0" + } + }, + "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { + "dependencies": { "mime-types": "~2.1.24", "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" } }, - "after": { + "node_modules/after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" }, - "array-flatten": { + "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "arraybuffer.slice": { + "node_modules/arraybuffer.slice": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" }, - "async": { + "node_modules/async": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==" }, - "backo2": { + "node_modules/backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" }, - "base64-arraybuffer": { + "node_modules/base64-arraybuffer": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "engines": { + "node": ">= 0.6.0" + } }, - "base64id": { + "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } }, - "blob": { + "node_modules/blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" }, - "body-parser": { + "node_modules/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { + "dependencies": { "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", @@ -68,98 +92,125 @@ "qs": "6.7.0", "raw-body": "2.4.0", "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" } }, - "buffer-writer": { + "node_modules/buffer-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } }, - "bytes": { + "node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } }, - "component-bind": { + "node_modules/component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" }, - "component-emitter": { + "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, - "component-inherit": { + "node_modules/component-inherit": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" }, - "content-disposition": { + "node_modules/content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { + "dependencies": { "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" } }, - "content-type": { + "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } }, - "cookie": { + "node_modules/cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "engines": { + "node": ">= 0.6" + } }, - "cookie-parser": { + "node_modules/cookie-parser": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz", "integrity": "sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==", - "requires": { + "dependencies": { "cookie": "0.3.1", "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" } }, - "cookie-signature": { + "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "debug": { + "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { + "dependencies": { "ms": "2.0.0" } }, - "depd": { + "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } }, - "destroy": { + "node_modules/destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "ee-first": { + "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "encodeurl": { + "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } }, - "engine.io": { + "node_modules/engine.io": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", - "requires": { + "dependencies": { "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", @@ -167,32 +218,15 @@ "engine.io-parser": "~2.2.0", "ws": "~7.4.2" }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } + "engines": { + "node": ">=8.0.0" } }, - "engine.io-client": { + "node_modules/engine.io-client": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", - "requires": { + "dependencies": { "component-emitter": "~1.3.0", "component-inherit": "0.0.3", "debug": "~3.1.0", @@ -204,23 +238,21 @@ "ws": "~7.4.2", "xmlhttprequest-ssl": "~1.5.4", "yeast": "0.1.2" - }, + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } + "ms": "2.0.0" } }, - "engine.io-parser": { + "node_modules/engine.io-parser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "requires": { + "dependencies": { "after": "0.8.2", "arraybuffer.slice": "~0.0.7", "base64-arraybuffer": "0.1.4", @@ -228,21 +260,46 @@ "has-binary2": "~1.0.2" } }, - "escape-html": { + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, - "etag": { + "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } }, - "express": { + "node_modules/express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { + "dependencies": { "accepts": "~1.3.7", "array-flatten": "1.1.1", "body-parser": "1.19.0", @@ -274,19 +331,23 @@ "utils-merge": "1.0.1", "vary": "~1.1.2" }, - "dependencies": { - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - } + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" } }, - "finalhandler": { + "node_modules/finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { + "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -294,290 +355,380 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "forwarded": { + "node_modules/forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } }, - "fresh": { + "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } }, - "has-binary2": { + "node_modules/has-binary2": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "requires": { + "dependencies": { "isarray": "2.0.1" } }, - "has-cors": { + "node_modules/has-cors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" }, - "http-errors": { + "node_modules/http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { + "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" } }, - "iconv-lite": { + "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "indexof": { + "node_modules/indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" }, - "inherits": { + "node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "ipaddr.js": { + "node_modules/ipaddr.js": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "engines": { + "node": ">= 0.10" + } }, - "isarray": { + "node_modules/isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" }, - "media-typer": { + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } }, - "merge-descriptors": { + "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, - "method-override": { + "node_modules/method-override": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", - "requires": { + "dependencies": { "debug": "3.1.0", "methods": "~1.1.2", "parseurl": "~1.3.2", "vary": "~1.1.2" }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/method-override/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - } + "ms": "2.0.0" } }, - "methods": { + "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } }, - "mime": { + "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/mime-types": { "version": "2.1.24", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { + "dependencies": { "mime-db": "1.40.0" + }, + "engines": { + "node": ">= 0.6" } }, - "ms": { + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "negotiator": { + "node_modules/negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } }, - "on-finished": { + "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "packet-reader": { + "node_modules/packet-reader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" }, - "parseqs": { + "node_modules/parseqs": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" }, - "parseuri": { + "node_modules/parseuri": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" }, - "parseurl": { + "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } }, - "path-to-regexp": { + "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "pg": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-7.12.1.tgz", - "integrity": "sha512-l1UuyfEvoswYfcUe6k+JaxiN+5vkOgYcVSbSuw3FvdLqDbaoa2RJo1zfJKfPsSYPFVERd4GHvX3s2PjG1asSDA==", - "requires": { + "node_modules/pg": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", + "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", + "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-connection-string": "0.1.3", - "pg-pool": "^2.0.4", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.6.0", + "pg-protocol": "^1.6.0", "pg-types": "^2.1.0", - "pgpass": "1.x", - "semver": "4.3.2" + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } } }, - "pg-connection-string": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", - "integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=" + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" }, - "pg-int8": { + "node_modules/pg-int8": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", + "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", + "peerDependencies": { + "pg": ">=8.0" + } }, - "pg-pool": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.7.tgz", - "integrity": "sha512-UiJyO5B9zZpu32GSlP0tXy8J2NsJ9EFGFfz5v6PSbdz/1hBLX1rNiiy5+mAm5iJJYwfCv4A0EBcQLGWwjbpzZw==" + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" }, - "pg-types": { + "node_modules/pg-types": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "requires": { + "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "pgpass": { + "node_modules/pgpass": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz", "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=", - "requires": { + "dependencies": { "split": "^1.0.0" } }, - "postgres-array": { + "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } }, - "postgres-bytea": { + "node_modules/postgres-bytea": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=", + "engines": { + "node": ">=0.10.0" + } }, - "postgres-date": { + "node_modules/postgres-date": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.4.tgz", - "integrity": "sha512-bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA==" + "integrity": "sha512-bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA==", + "engines": { + "node": ">=0.10.0" + } }, - "postgres-interval": { + "node_modules/postgres-interval": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "requires": { + "dependencies": { "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "proxy-addr": { + "node_modules/proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "requires": { + "dependencies": { "forwarded": "~0.1.2", "ipaddr.js": "1.9.0" + }, + "engines": { + "node": ">= 0.10" } }, - "qs": { + "node_modules/qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } }, - "range-parser": { + "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } }, - "raw-body": { + "node_modules/raw-body": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { + "dependencies": { "bytes": "3.1.0", "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "semver": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", - "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" - }, - "send": { + "node_modules/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { + "dependencies": { "debug": "2.6.9", "depd": "~1.1.2", "destroy": "~1.0.4", @@ -592,68 +743,57 @@ "range-parser": "~1.2.1", "statuses": "~1.5.0" }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } + "engines": { + "node": ">= 0.8.0" } }, - "serve-static": { + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { + "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "setprototypeof": { + "node_modules/setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, - "socket.io": { + "node_modules/socket.io": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", - "requires": { + "dependencies": { "debug": "~4.1.0", "engine.io": "~3.5.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", "socket.io-client": "2.4.0", "socket.io-parser": "~3.4.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } } }, - "socket.io-adapter": { + "node_modules/socket.io-adapter": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" }, - "socket.io-client": { + "node_modules/socket.io-client": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "requires": { + "dependencies": { "backo2": "1.0.2", "component-bind": "1.0.0", "component-emitter": "~1.3.0", @@ -665,131 +805,188 @@ "parseuri": "0.0.6", "socket.io-parser": "~3.3.0", "to-array": "0.1.4" - }, + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - } + "ms": "2.0.0" + } + }, + "node_modules/socket.io-client/node_modules/socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "dependencies": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" } }, - "socket.io-parser": { + "node_modules/socket.io-parser": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "requires": { + "dependencies": { "component-emitter": "1.2.1", "debug": "~4.1.0", "isarray": "2.0.1" - }, + } + }, + "node_modules/socket.io-parser/node_modules/component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } + "ms": "^2.1.1" + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dependencies": { + "ms": "^2.1.1" } }, - "split": { + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "requires": { + "dependencies": { "through": "2" + }, + "engines": { + "node": "*" } }, - "statuses": { + "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } }, - "stoppable": { + "node_modules/stoppable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==" + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "engines": { + "node": ">=4", + "npm": ">=6" + } }, - "through": { + "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, - "to-array": { + "node_modules/to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" }, - "toidentifier": { + "node_modules/toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } }, - "type-is": { + "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { + "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "unpipe": { + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } }, - "utils-merge": { + "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } }, - "vary": { + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } }, - "ws": { + "node_modules/ws": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", - "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==" + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "xmlhttprequest-ssl": { + "node_modules/xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "engines": { + "node": ">=0.4.0" + } }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } }, - "yeast": { + "node_modules/yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" diff --git a/result/package.json b/result/package.json index 53a37e57..3d9dacba 100644 --- a/result/package.json +++ b/result/package.json @@ -14,7 +14,7 @@ "cookie-parser": "^1.4.4", "express": "^4.17.1", "method-override": "^3.0.0", - "pg": "^7.12.1", + "pg": "^8.0.3", "socket.io": "^2.2.0", "stoppable": "^1.1.0" } diff --git a/result/server.js b/result/server.js index eb3bfb04..efd7fdb3 100644 --- a/result/server.js +++ b/result/server.js @@ -13,7 +13,6 @@ var express = require('express'), io.set('transports', ['polling']); var port = process.env.PORT || 4000; -app.listen(port) // Environment variables for PostgreSQL connection var pghost = process.env.PGHOST || 'localhost'; From 0853b7ce5f973c5162a562dd840b96a46fc29b6b Mon Sep 17 00:00:00 2001 From: Lidia Date: Wed, 26 Apr 2023 15:56:58 +0200 Subject: [PATCH 30/32] Update style.css --- result/views/stylesheets/style.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/result/views/stylesheets/style.css b/result/views/stylesheets/style.css index 6528cf8a..976bd916 100644 --- a/result/views/stylesheets/style.css +++ b/result/views/stylesheets/style.css @@ -41,7 +41,7 @@ body { margin: 0 auto; display: table; padding: 10px; - max-width: 940px; + max-width: 1000px; height: 100%; } @@ -121,4 +121,4 @@ body { margin-bottom: -4px; width: 50%; height: 100%; -} \ No newline at end of file +} From be83e99ee1ee729544df1593be636832f4050512 Mon Sep 17 00:00:00 2001 From: Lidia Date: Wed, 26 Apr 2023 15:57:58 +0200 Subject: [PATCH 31/32] Update style.css --- result/views/stylesheets/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/result/views/stylesheets/style.css b/result/views/stylesheets/style.css index 976bd916..9401847e 100644 --- a/result/views/stylesheets/style.css +++ b/result/views/stylesheets/style.css @@ -41,7 +41,7 @@ body { margin: 0 auto; display: table; padding: 10px; - max-width: 1000px; + max-width: 940px; height: 100%; } From 21a88acb3ab024c7a1c3f836e10a35cbc12f2184 Mon Sep 17 00:00:00 2001 From: Lidia Date: Wed, 5 Jul 2023 13:42:53 +0200 Subject: [PATCH 32/32] Use different workflow major version --- .github/workflows/uffizzi-preview.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/uffizzi-preview.yaml b/.github/workflows/uffizzi-preview.yaml index 3e3dd602..0b7dbe5e 100644 --- a/.github/workflows/uffizzi-preview.yaml +++ b/.github/workflows/uffizzi-preview.yaml @@ -156,7 +156,7 @@ jobs: deploy-uffizzi-preview: name: Use Remote Workflow to Preview on Uffizzi needs: render-compose-file - uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2 + uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v3 with: compose-file-cache-key: ${{ needs.render-compose-file.outputs.compose-file-cache-key }} compose-file-cache-path: ${{ needs.render-compose-file.outputs.compose-file-cache-path }} @@ -168,7 +168,7 @@ jobs: delete-uffizzi-preview: name: Use Remote Workflow to Delete an Existing Preview - uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2 + uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v3 if: ${{ github.event_name == 'pull_request' && github.event.action == 'closed' }} with: compose-file-cache-key: ''