From b687525a76549d116987c2f4c3b7044666fe1643 Mon Sep 17 00:00:00 2001 From: rasswanth-s <43314053+rasswanth-s@users.noreply.github.com> Date: Sat, 11 Nov 2023 16:25:31 +0530 Subject: [PATCH 1/4] merge docker manifests build for different platforms --- .github/workflows/cd-syft.yml | 133 ++++++++++++++++++++++------------ 1 file changed, 87 insertions(+), 46 deletions(-) diff --git a/.github/workflows/cd-syft.yml b/.github/workflows/cd-syft.yml index 0c9f2991b1a..758c990e3db 100644 --- a/.github/workflows/cd-syft.yml +++ b/.github/workflows/cd-syft.yml @@ -43,6 +43,11 @@ jobs: matrix: runner: [sh-arc-linux-x64, sh-arc-linux-arm64] runs-on: ${{ matrix.runner }} + + outputs: + release_tag: ${{ steps.release_metadata.outputs.release_tag }} + grid_version: ${{ steps.release_metadata.outputs.grid_version }} + steps: - uses: actions/checkout@v3 @@ -98,7 +103,7 @@ jobs: else echo "release_platform=linux/arm64" >> $GITHUB_OUTPUT fi - echo "GRID_VERSION=$(python packages/grid/VERSION)" >> $GITHUB_OUTPUT + echo "grid_version=$(python packages/grid/VERSION)" >> $GITHUB_OUTPUT - name: Set up Docker Buildx id: buildx @@ -110,79 +115,120 @@ jobs: username: ${{ secrets.DOCKER_LOGIN }} password: ${{ secrets.DOCKER_PASSWORD }} - - name: Docker meta for Grid-Backend - id: meta_grid_backend - uses: docker/metadata-action@v5 - with: - images: openmined/grid-backend - tags: | - type=raw,value=${{ steps.release_metadata.outputs.GRID_VERSION }} - type=raw,value=${{ steps.release_metadata.outputs.release_tag }} - - name: Build and push `grid-backend` image to DockerHub + id: grid-backend-build uses: docker/build-push-action@v5 with: context: ./packages file: ./packages/grid/backend/backend.dockerfile - push: true platforms: ${{ steps.release_metadata.outputs.release_platform }} - tags: ${{ steps.meta_grid_backend.outputs.tags }} target: backend + outputs: type=image,name=openmined/grid-backend,push-by-digest=true,name-canonical=true,push=true cache-from: type=gha cache-to: type=gha,mode=max - - name: Docker meta for Grid-Frontend - id: meta_grid_frontend - uses: docker/metadata-action@v5 - with: - images: openmined/grid-frontend - tags: | - type=raw,value=${{ steps.release_metadata.outputs.GRID_VERSION }} - type=raw,value=${{ steps.release_metadata.outputs.release_tag }} + - name: Export digest for grid-backend + run: | + mkdir -p /tmp/digests/grid-backend + digest="${{ steps.grid-backend-build.outputs.digest }}" + touch "/tmp/digests/grid-backend/${digest#sha256:}" - name: Build and push `grid-frontend` image to DockerHub + id: grid-frontend-build uses: docker/build-push-action@v5 with: context: ./packages/grid/frontend file: ./packages/grid/frontend/frontend.dockerfile - push: true platforms: ${{ steps.release_metadata.outputs.release_platform }} - tags: ${{ steps.meta_grid_frontend.outputs.tags }} + outputs: type=image,name=openmined/grid-frontend,push-by-digest=true,name-canonical=true,push=true target: grid-ui-development cache-from: type=gha cache-to: type=gha,mode=max - - name: Docker meta for Grid-Enclave - id: meta_grid_enclave - uses: docker/metadata-action@v5 - with: - images: openmined/grid-enclave - tags: | - type=raw,value=${{ steps.release_metadata.outputs.GRID_VERSION }} - type=raw,value=${{ steps.release_metadata.outputs.release_tag }} + - name: Export digest for grid-frontend + run: | + mkdir -p /tmp/digests/grid-frontend + digest="${{ steps.grid-frontend-build.outputs.digest }}" + touch "/tmp/digests/grid-frontend/${digest#sha256:}" - name: Build and push `grid-enclave` image to DockerHub + id: grid-enclave-build uses: docker/build-push-action@v5 with: context: ./packages file: ./packages/grid/worker/worker.dockerfile - push: true platforms: ${{ steps.release_metadata.outputs.release_platform }} - tags: ${{ steps.meta_grid_enclave.outputs.tags }} + outputs: type=image,name=openmined/grid-enclave,push-by-digest=true,name-canonical=true,push=true target: worker cache-from: type=gha cache-to: type=gha,mode=max + - name: Export digest for grid-enclave + run: | + mkdir -p /tmp/digests/grid-enclave + digest="${{ steps.grid-enclave-build.outputs.digest }}" + touch "/tmp/digests/grid-enclave/${digest#sha256:}" + + - name: Upload digest for grid-backend, grid-frontend and grid-enclave + uses: actions/upload-artifact@v3 + with: + name: digests-${{ steps.release_metadata.outputs.grid_version }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + #Used to merge x64 and arm64 into one docker image + merge-docker-images: + needs: [build-and-push-docker-images] + if: always() && (needs.build-and-push-docker-images.result == 'success') + + runs-on: sh-arc-linux-x64 + + steps: + - name: Download digests + uses: actions/download-artifact@v3 + with: + name: digests-${{ needs.build-and-push-docker-images.outputs.grid_version }} + path: /tmp/digests + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_LOGIN }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Create manifest list and push for grid-backend + working-directory: /tmp/digests/grid-backend + run: | + docker buildx imagetools create \ + -t openmined/grid-backend:${{ needs.build-and-push-docker-images.outputs.grid_version }} \ + -t openmined/grid-backend:${{ needs.build-and-push-docker-images.outputs.release_tag }} \ + $(printf 'opemined/grid-backend@sha256:%s ' *) + + - name: Create manifest list and push for grid-frontend + working-directory: /tmp/digests/grid-frontend + run: | + docker buildx imagetools create \ + -t openmined/grid-frontend:${{ needs.build-and-push-docker-images.outputs.grid_version }} \ + -t openmined/grid-frontend:${{ needs.build-and-push-docker-images.outputs.release_tag }} \ + $(printf 'opemined/grid-frontend@sha256:%s ' *) + + - name: Create manifest list and push for grid-enclave + working-directory: /tmp/digests/grid-enclave + run: | + docker buildx imagetools create \ + -t openmined/grid-enclave:${{ needs.build-and-push-docker-images.outputs.grid_version }} \ + -t openmined/grid-enclave:${{ needs.build-and-push-docker-images.outputs.release_tag }} \ + $(printf 'opemined/grid-enclave@sha256:%s ' *) + deploy-syft: - needs: - [ - call-pr-tests-linting, - call-pr-tests-syft, - call-pr-tests-stack, - build-and-push-docker-images, - ] - if: always() && (needs.call-pr-tests-linting.result == 'success' && needs.call-pr-tests-syft.result == 'success' && needs.call-pr-tests-stack.result == 'success' || github.event.inputs.skip_tests == 'true') && needs.build-and-push-docker-images.result == 'success' - # runs-on: [self-hosted, Linux] + needs: [merge-docker-images] + if: always() && needs.merge-docker-images.result == 'success' + runs-on: ubuntu-latest permissions: contents: write # For tag and release notes. @@ -305,11 +351,6 @@ jobs: twine upload -r testpypi -u __token__ -p ${{ secrets.OM_SYFT_TEST_PYPI_TOKEN }} packages/syft/dist/* fi - - name: Set Grid package version - id: grid-version - shell: bash - run: echo "GRID_VERSION=$(python packages/grid/VERSION)" >> $GITHUB_OUTPUT - # Checkout Infra repo (nested) - name: Checkout Infra Repo uses: actions/checkout@v3 From 2cd618e1be901343d107c0551ba4aaad628442b3 Mon Sep 17 00:00:00 2001 From: rasswanth-s <43314053+rasswanth-s@users.noreply.github.com> Date: Sat, 11 Nov 2023 16:34:42 +0530 Subject: [PATCH 2/4] fix openmined spelling --- .github/workflows/cd-syft.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cd-syft.yml b/.github/workflows/cd-syft.yml index 758c990e3db..85cc33a2809 100644 --- a/.github/workflows/cd-syft.yml +++ b/.github/workflows/cd-syft.yml @@ -207,7 +207,7 @@ jobs: docker buildx imagetools create \ -t openmined/grid-backend:${{ needs.build-and-push-docker-images.outputs.grid_version }} \ -t openmined/grid-backend:${{ needs.build-and-push-docker-images.outputs.release_tag }} \ - $(printf 'opemined/grid-backend@sha256:%s ' *) + $(printf 'openmined/grid-backend@sha256:%s ' *) - name: Create manifest list and push for grid-frontend working-directory: /tmp/digests/grid-frontend @@ -215,7 +215,7 @@ jobs: docker buildx imagetools create \ -t openmined/grid-frontend:${{ needs.build-and-push-docker-images.outputs.grid_version }} \ -t openmined/grid-frontend:${{ needs.build-and-push-docker-images.outputs.release_tag }} \ - $(printf 'opemined/grid-frontend@sha256:%s ' *) + $(printf 'openmined/grid-frontend@sha256:%s ' *) - name: Create manifest list and push for grid-enclave working-directory: /tmp/digests/grid-enclave @@ -223,7 +223,7 @@ jobs: docker buildx imagetools create \ -t openmined/grid-enclave:${{ needs.build-and-push-docker-images.outputs.grid_version }} \ -t openmined/grid-enclave:${{ needs.build-and-push-docker-images.outputs.release_tag }} \ - $(printf 'opemined/grid-enclave@sha256:%s ' *) + $(printf 'openmined/grid-enclave@sha256:%s ' *) deploy-syft: needs: [merge-docker-images] From b67ebd360fb8a0832597ecb61e31ab079b0ab437 Mon Sep 17 00:00:00 2001 From: rasswanth-s <43314053+rasswanth-s@users.noreply.github.com> Date: Sat, 11 Nov 2023 16:42:17 +0530 Subject: [PATCH 3/4] temporarily modified worker to use cpu torch file --- packages/grid/worker/worker.dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/grid/worker/worker.dockerfile b/packages/grid/worker/worker.dockerfile index cc87d13b2bb..f0bbb3ad860 100644 --- a/packages/grid/worker/worker.dockerfile +++ b/packages/grid/worker/worker.dockerfile @@ -49,6 +49,7 @@ COPY syft/src/syft/capnp /app/syft/src/syft/capnp # install syft RUN --mount=type=cache,target=/root/.cache \ + pip install --user torch==2.1.0 -f https://download.pytorch.org/whl/cpu/torch_stable.html && \ pip install --user -e /app/syft && \ pip uninstall ansible ansible-core -y && \ rm -rf ~/.local/lib/python3.11/site-packages/ansible_collections From 56a163c2633506c4c50a0c917fb846361ebea405 Mon Sep 17 00:00:00 2001 From: alfred-openmined-bot <145415986+alfred-openmined-bot@users.noreply.github.com> Date: Sat, 11 Nov 2023 11:38:24 +0000 Subject: [PATCH 4/4] [syft]bump version --- .bumpversion.cfg | 2 +- VERSION | 2 +- packages/grid/VERSION | 2 +- packages/grid/devspace.yaml | 4 +- packages/grid/frontend/package.json | 2 +- packages/grid/helm/repo/index.yaml | 58 +++++++++++------- .../grid/helm/repo/syft-0.8.2-beta.56.tgz | Bin 0 -> 14856 bytes packages/grid/helm/syft/Chart.yaml | 4 +- .../podman-kube/podman-syft-kube-config.yaml | 2 +- .../podman/podman-kube/podman-syft-kube.yaml | 4 +- packages/hagrid/hagrid/deps.py | 2 +- packages/hagrid/hagrid/manifest_template.yml | 6 +- packages/syft/setup.cfg | 2 +- packages/syft/src/syft/VERSION | 2 +- packages/syft/src/syft/__init__.py | 2 +- packages/syftcli/manifest.yml | 8 +-- 16 files changed, 59 insertions(+), 43 deletions(-) create mode 100644 packages/grid/helm/repo/syft-0.8.2-beta.56.tgz diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 8027b3e0731..3989a010e8a 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.8.2-beta.55 +current_version = 0.8.2-beta.56 tag = False tag_name = {new_version} commit = True diff --git a/VERSION b/VERSION index d7f12d8ff9b..ffd40daf3ef 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,5 @@ # Mono Repo Global Version -__version__ = "0.8.2-beta.55" +__version__ = "0.8.2-beta.56" # elsewhere we can call this file: `python VERSION` and simply take the stdout # stdlib diff --git a/packages/grid/VERSION b/packages/grid/VERSION index d7f12d8ff9b..ffd40daf3ef 100644 --- a/packages/grid/VERSION +++ b/packages/grid/VERSION @@ -1,5 +1,5 @@ # Mono Repo Global Version -__version__ = "0.8.2-beta.55" +__version__ = "0.8.2-beta.56" # elsewhere we can call this file: `python VERSION` and simply take the stdout # stdlib diff --git a/packages/grid/devspace.yaml b/packages/grid/devspace.yaml index 6f8b1305061..11141a8974c 100644 --- a/packages/grid/devspace.yaml +++ b/packages/grid/devspace.yaml @@ -15,13 +15,13 @@ pipelines: run: |- run_dependencies --all ensure_pull_secrets --all - build_images --all -t $(git rev-parse --short=6 HEAD) -t 0.8.2-beta.55 -t dev-latest + build_images --all -t $(git rev-parse --short=6 HEAD) -t 0.8.2-beta.56 -t dev-latest create_deployments --all vars: DEVSPACE_ENV_FILE: "default.env" CONTAINER_REGISTRY: "docker.io" - VERSION: "0.8.2-beta.55" + VERSION: "0.8.2-beta.56" # This is a list of `images` that DevSpace can build for this project # We recommend to skip image building during development (devspace dev) as much as possible diff --git a/packages/grid/frontend/package.json b/packages/grid/frontend/package.json index b1794df2ca9..eda3b0d0e78 100644 --- a/packages/grid/frontend/package.json +++ b/packages/grid/frontend/package.json @@ -1,6 +1,6 @@ { "name": "pygrid-ui", - "version": "0.8.2-beta.55", + "version": "0.8.2-beta.56", "private": true, "scripts": { "dev": "pnpm i && vite dev --host --port 80", diff --git a/packages/grid/helm/repo/index.yaml b/packages/grid/helm/repo/index.yaml index 6b8ad4c0fcb..9c4dc45605a 100644 --- a/packages/grid/helm/repo/index.yaml +++ b/packages/grid/helm/repo/index.yaml @@ -1,9 +1,25 @@ apiVersion: v1 entries: syft: + - apiVersion: v2 + appVersion: 0.8.2-beta.56 + created: "2023-11-11T11:37:51.902408204Z" + dependencies: + - name: component-chart + repository: https://charts.devspace.sh + version: 0.9.1 + description: Perform numpy-like analysis on data that remains in someone elses + server + digest: 210e2ffad436b892001bc8acd0598dbb79041dc2e3dc8179e7359b317eed7d23 + icon: https://raw.githubusercontent.com/OpenMined/PySyft/dev/docs/img/title_syft_light.png + name: syft + type: application + urls: + - https://openmined.github.io/PySyft/helm/syft-0.8.2-beta.56.tgz + version: 0.8.2-beta.56 - apiVersion: v2 appVersion: 0.8.2-beta.55 - created: "2023-11-11T07:42:20.118319829Z" + created: "2023-11-11T11:37:51.901730093Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -19,7 +35,7 @@ entries: version: 0.8.2-beta.55 - apiVersion: v2 appVersion: 0.8.2-beta.54 - created: "2023-11-11T07:42:20.116881305Z" + created: "2023-11-11T11:37:51.900839426Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -35,7 +51,7 @@ entries: version: 0.8.2-beta.54 - apiVersion: v2 appVersion: 0.8.2-beta.53 - created: "2023-11-11T07:42:20.114956273Z" + created: "2023-11-11T11:37:51.899886684Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -51,7 +67,7 @@ entries: version: 0.8.2-beta.53 - apiVersion: v2 appVersion: 0.8.2-beta.52 - created: "2023-11-11T07:42:20.113410547Z" + created: "2023-11-11T11:37:51.899016625Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -67,7 +83,7 @@ entries: version: 0.8.2-beta.52 - apiVersion: v2 appVersion: 0.8.2-beta.51 - created: "2023-11-11T07:42:20.112133126Z" + created: "2023-11-11T11:37:51.898149242Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -83,7 +99,7 @@ entries: version: 0.8.2-beta.51 - apiVersion: v2 appVersion: 0.8.2-beta.50 - created: "2023-11-11T07:42:20.110809103Z" + created: "2023-11-11T11:37:51.896649644Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -99,7 +115,7 @@ entries: version: 0.8.2-beta.50 - apiVersion: v2 appVersion: 0.8.2-beta.49 - created: "2023-11-11T07:42:20.109521582Z" + created: "2023-11-11T11:37:51.895773134Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -115,7 +131,7 @@ entries: version: 0.8.2-beta.49 - apiVersion: v2 appVersion: 0.8.2-beta.48 - created: "2023-11-11T07:42:20.108166359Z" + created: "2023-11-11T11:37:51.894889971Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -131,7 +147,7 @@ entries: version: 0.8.2-beta.48 - apiVersion: v2 appVersion: 0.8.2-beta.47 - created: "2023-11-11T07:42:20.106790937Z" + created: "2023-11-11T11:37:51.894011026Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -147,7 +163,7 @@ entries: version: 0.8.2-beta.47 - apiVersion: v2 appVersion: 0.8.2-beta.46 - created: "2023-11-11T07:42:20.104912705Z" + created: "2023-11-11T11:37:51.892971814Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -163,7 +179,7 @@ entries: version: 0.8.2-beta.46 - apiVersion: v2 appVersion: 0.8.2-beta.45 - created: "2023-11-11T07:42:20.103338879Z" + created: "2023-11-11T11:37:51.892225706Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -179,7 +195,7 @@ entries: version: 0.8.2-beta.45 - apiVersion: v2 appVersion: 0.8.2-beta.44 - created: "2023-11-11T07:42:20.10218136Z" + created: "2023-11-11T11:37:51.891456936Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -195,7 +211,7 @@ entries: version: 0.8.2-beta.44 - apiVersion: v2 appVersion: 0.8.2-beta.43 - created: "2023-11-11T07:42:20.100771636Z" + created: "2023-11-11T11:37:51.89069062Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -211,7 +227,7 @@ entries: version: 0.8.2-beta.43 - apiVersion: v2 appVersion: 0.8.2-beta.42 - created: "2023-11-11T07:42:20.099416414Z" + created: "2023-11-11T11:37:51.889382206Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -227,7 +243,7 @@ entries: version: 0.8.2-beta.42 - apiVersion: v2 appVersion: 0.8.2-beta.41 - created: "2023-11-11T07:42:20.098275095Z" + created: "2023-11-11T11:37:51.887695248Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -243,7 +259,7 @@ entries: version: 0.8.2-beta.41 - apiVersion: v2 appVersion: 0.8.2-beta.40 - created: "2023-11-11T07:42:20.097160576Z" + created: "2023-11-11T11:37:51.886745372Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -259,7 +275,7 @@ entries: version: 0.8.2-beta.40 - apiVersion: v2 appVersion: 0.8.2-beta.39 - created: "2023-11-11T07:42:20.095950456Z" + created: "2023-11-11T11:37:51.885984496Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -275,7 +291,7 @@ entries: version: 0.8.2-beta.39 - apiVersion: v2 appVersion: 0.8.2-beta.38 - created: "2023-11-11T07:42:20.094429431Z" + created: "2023-11-11T11:37:51.88524446Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -291,7 +307,7 @@ entries: version: 0.8.2-beta.38 - apiVersion: v2 appVersion: 0.8.2-beta.37 - created: "2023-11-11T07:42:20.093403414Z" + created: "2023-11-11T11:37:51.884437559Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -307,7 +323,7 @@ entries: version: 0.8.2-beta.37 - apiVersion: v2 appVersion: 0.8.1 - created: "2023-11-11T07:42:20.092200794Z" + created: "2023-11-11T11:37:51.88358469Z" dependencies: - name: component-chart repository: https://charts.devspace.sh @@ -321,4 +337,4 @@ entries: urls: - https://openmined.github.io/PySyft/helm/syft-0.8.1.tgz version: 0.8.1 -generated: "2023-11-11T07:42:20.090704969Z" +generated: "2023-11-11T11:37:51.882507156Z" diff --git a/packages/grid/helm/repo/syft-0.8.2-beta.56.tgz b/packages/grid/helm/repo/syft-0.8.2-beta.56.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ad94ff6b48862fa59160d8da02a6fbb6f41070e9 GIT binary patch literal 14856 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