summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAramayis <>2022-10-26 16:39:23 +0400
committerAramayis <19995164+daramayis@users.noreply.github.com>2023-01-10 19:29:45 +0400
commitb90af5461abb8109553ca89f824747a5196525b0 (patch)
tree5a6e0d72979028605a038067d1d10a1926126163
parentc4e71356bbb0bff7ba4d12d4b86f2959f32fed47 (diff)
feat: uffizzi integration
-rw-r--r--.github/workflows/uffizzi-build.yml89
-rw-r--r--.github/workflows/uffizzi-preview.yml84
-rw-r--r--uffizzi/DockerfileTtyd17
-rw-r--r--uffizzi/docker-compose.uffizzi.yml20
4 files changed, 210 insertions, 0 deletions
diff --git a/.github/workflows/uffizzi-build.yml b/.github/workflows/uffizzi-build.yml
new file mode 100644
index 000000000..58c7e5866
--- /dev/null
+++ b/.github/workflows/uffizzi-build.yml
@@ -0,0 +1,89 @@
+name: Build PR Image
+on:
+ pull_request:
+ types: [opened, synchronize, reopened, closed]
+
+jobs:
+ build-application:
+ name: Build and Push `lazygit`
+ 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: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v2
+ - name: Generate UUID image name
+ id: uuid
+ run: echo "UUID_APP_TAG=$(uuidgen)" >> $GITHUB_ENV
+ - name: Docker metadata
+ id: meta
+ uses: docker/metadata-action@v3
+ with:
+ images: registry.uffizzi.com/${{ env.UUID_APP_TAG }}
+ tags: type=raw,value=60d
+ - name: Build and Push Image to registry.uffizzi.com ephemeral registry
+ uses: docker/build-push-action@v2
+ with:
+ push: true
+ context: ./
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ file: ./uffizzi/DockerfileTtyd
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+
+
+ 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-application
+ outputs:
+ compose-file-cache-key: ${{ steps.hash.outputs.hash }}
+ steps:
+ - name: Checkout git repo
+ uses: actions/checkout@v3
+ - name: Render Compose File
+ run: |
+ APP_IMAGE=$(echo ${{ needs.build-application.outputs.tags }})
+ export APP_IMAGE
+ # Render simple template from environment variables.
+ envsubst < ./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
diff --git a/.github/workflows/uffizzi-preview.yml b/.github/workflows/uffizzi-preview.yml
new file mode 100644
index 000000000..ce8a9c46f
--- /dev/null
+++ b/.github/workflows/uffizzi-preview.yml
@@ -0,0 +1,84 @@
+name: Deploy Uffizzi Preview
+
+on:
+ workflow_run:
+ workflows:
+ - "Build PR Image"
+ types:
+ - completed
+
+
+jobs:
+ cache-compose-file:
+ name: Cache Compose File
+ runs-on: ubuntu-latest
+ outputs:
+ compose-file-cache-key: ${{ env.COMPOSE_FILE_HASH }}
+ pr-number: ${{ env.PR_NUMBER }}
+ steps:
+ - name: 'Download artifacts'
+ # Fetch output (zip archive) from the workflow run that triggered this workflow.
+ uses: actions/github-script@v6
+ 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));
+ - name: 'Unzip artifact'
+ run: unzip preview-spec.zip
+ - name: Read Event into ENV
+ run: |
+ echo 'EVENT_JSON<<EOF' >> $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 "COMPOSE_FILE_HASH=$(md5sum docker-compose.rendered.yml | awk '{ print $1 }')" >> $GITHUB_ENV
+ - name: Cache Rendered Compose File
+ if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }}
+ uses: actions/cache@v3
+ with:
+ path: docker-compose.rendered.yml
+ key: ${{ env.COMPOSE_FILE_HASH }}
+
+ - name: Read PR Number From Event Object
+ id: pr
+ run: echo "PR_NUMBER=${{ fromJSON(env.EVENT_JSON).number }}" >> $GITHUB_ENV
+
+ - name: DEBUG - Print Job Outputs
+ if: ${{ runner.debug }}
+ run: |
+ echo "PR number: ${{ env.PR_NUMBER }}"
+ echo "Compose file hash: ${{ env.COMPOSE_FILE_HASH }}"
+ cat event.json
+ deploy-uffizzi-preview:
+ name: Use Remote Workflow to Preview on Uffizzi
+ needs:
+ - cache-compose-file
+ uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2.6.1
+ 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-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
+ id-token: write \ No newline at end of file
diff --git a/uffizzi/DockerfileTtyd b/uffizzi/DockerfileTtyd
new file mode 100644
index 000000000..274c58037
--- /dev/null
+++ b/uffizzi/DockerfileTtyd
@@ -0,0 +1,17 @@
+
+FROM uffizzi/ttyd:golang1.18-alpine as build
+
+WORKDIR /go/src/github.com/jesseduffield/lazygit/
+COPY go.mod go.sum ./
+RUN go mod download
+COPY . .
+RUN CGO_ENABLED=0 GOOS=linux go build
+
+RUN apk update --quiet && \
+ apk add -q --no-cache libgcc tini
+
+
+EXPOSE 7700/tcp
+
+ENTRYPOINT ["tini", "--"]
+CMD ["ttyd", "/bin/zsh"] \ No newline at end of file
diff --git a/uffizzi/docker-compose.uffizzi.yml b/uffizzi/docker-compose.uffizzi.yml
new file mode 100644
index 000000000..859a315ff
--- /dev/null
+++ b/uffizzi/docker-compose.uffizzi.yml
@@ -0,0 +1,20 @@
+version: "3"
+
+x-uffizzi:
+ ingress:
+ service: application
+ port: 7681
+
+services:
+
+ application:
+ image: "${APP_IMAGE}"
+ entrypoint: ["/bin/bash", "-c"]
+ command: ["ttyd /usr/local/go/bin/go run /go/src/github.com/jesseduffield/lazygit/cmd/integration_test/main.go tui"]
+ ports:
+ - "7700:7700"
+ - "7681:7681"
+ deploy:
+ resources:
+ limits:
+ memory: 2000M