diff --git a/.github/workflows/ecs-deployment.yml b/.github/workflows/ecs-deployment.yml new file mode 100644 index 0000000000..99b33ea707 --- /dev/null +++ b/.github/workflows/ecs-deployment.yml @@ -0,0 +1,131 @@ +name: ECS + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +on: + push: + branches: + - main +env: + # Use docker.io for Docker Hub if empty + REGISTRY: ghcr.io + # github.repository as / + IMAGE_NAME: ${{ github.repository }}/formbricks-experimental + DATABASE_URL: "postgresql://postgres:postgres@localhost:5432/formbricks?schema=public" + +jobs: + build: + if: github.event_name == 'pull_request' && github.event.pull_request.base.ref == 'main' && github.event.pull_request.merged == true + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + # This is used to complete the identity challenge + # with sigstore/fulcio when running outside of PRs. + id-token: write + + steps: + - name: Generate Random NEXTAUTH_SECRET + run: | + SECRET=$(openssl rand -hex 32) + echo "NEXTAUTH_SECRET=$SECRET" >> $GITHUB_ENV + + - name: Generate Random ENCRYPTION_KEY + run: | + SECRET=$(openssl rand -hex 32) + echo "ENCRYPTION_KEY=$SECRET" >> $GITHUB_ENV + + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Depot CLI + uses: depot/setup-action@v1 + + # https://github.com/sigstore/cosign-installer + - name: Install cosign + uses: sigstore/cosign-installer@6e04d228eb30da1757ee4e1dd75a0ec73a653e06 #v3.1.1 + with: + cosign-release: "v2.1.1" + + # https://github.com/docker/login-action + - name: Log into registry + uses: docker/login-action@v3 # v3.0.0 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + # Extract metadata (tags, labels) for Docker + # https://github.com/docker/metadata-action + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@v5 # v5.0.0 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + # Build and push Docker image with Buildx + + # https://github.com/docker/build-push-action + - name: Build and push Docker image + id: build-and-push + uses: depot/build-push-action@v1 + env: + NEXT_PUBLIC_SENTRY_DSN: ${{ secrets.NEXT_PUBLIC_SENTRY_DSN }} + with: + project: tw0fqmsx3c + token: ${{ secrets.DEPOT_PROJECT_TOKEN }} + context: . + file: ./apps/web/Dockerfile + platforms: linux/amd64,linux/arm64 + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + build-args: | + NEXTAUTH_SECRET=${{ env.NEXTAUTH_SECRET }} + DATABASE_URL=${{ env.DATABASE_URL }} + ENCRYPTION_KEY=${{ env.ENCRYPTION_KEY }} + NEXT_PUBLIC_SENTRY_DSN=${{ env.NEXT_PUBLIC_SENTRY_DSN }} + + - name: Sign the published Docker image + env: + # https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable + TAGS: ${{ steps.meta.outputs.tags }} + DIGEST: ${{ steps.build-and-push.outputs.digest }} + # This step uses the identity token to provision an ephemeral certificate + # against the sigstore community Fulcio instance. + run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}${DIGEST} + + deploy: + needs: build + runs-on: ubuntu-latest + steps: + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ secrets.AWS_REGION }} + + - name: Download task definition + run: | + aws ecs describe-task-definition --task-definition prod-webapp-ecs-service --query taskDefinition > task-definition.json + + - name: Fill in the new image ID in the Amazon ECS task definition + id: task-def + uses: aws-actions/amazon-ecs-render-task-definition@v1 + with: + task-definition: task-definition.json + container-name: prod-webapp-container + image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:main + + - name: Deploy Amazon ECS task definition + uses: aws-actions/amazon-ecs-deploy-task-definition@v1 + with: + task-definition: ${{ steps.task-def.outputs.task-definition }} + service: prod-webapp-ecs-service + cluster: prod-core-infra-ecs-cluster + wait-for-service-stability: true diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile index bd97986415..12cdc63a57 100644 --- a/apps/web/Dockerfile +++ b/apps/web/Dockerfile @@ -23,6 +23,8 @@ ENV NEXTAUTH_SECRET=$NEXTAUTH_SECRET ARG ENCRYPTION_KEY ENV ENCRYPTION_KEY=$ENCRYPTION_KEY +ARG NEXT_PUBLIC_SENTRY_DSN + # Set the working directory WORKDIR /app @@ -76,4 +78,4 @@ CMD supercronic -quiet /app/docker/cronjobs & \ else \ echo "ERROR: Please set a value for NEXTAUTH_SECRET in your docker compose variables!" >&2; \ exit 1; \ - fi \ No newline at end of file + fi