Skip to content
Open

v4.13.0 #1397

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
e06c715
Add initial CLAUDE.md for AI-assisted development (#1342)
BryanFauble Apr 3, 2026
693d01b
[SYNPY-1508]: add tutorial for downloading files by Synapse ID concur…
thomasyu888 Apr 4, 2026
4f0721e
[SYNPY-1798]: updated black to 26.3.1 and reran pre-commit (#1341)
linglp Apr 7, 2026
0415279
[SYNPY-1764] Add Trivy container vulnerability scanning (#1346)
BryanFauble Apr 9, 2026
c921be9
Add actions read permission for Trivy scan job (#1355)
BryanFauble Apr 10, 2026
2e4fb99
Add optional ARTIFACT_NAME_SUFFIX input to Trivy workflow and update …
BryanFauble Apr 10, 2026
7287c7b
[SYNPY-1402] Update reticulate tutorial for new OOP models/operations…
thomasyu888 Apr 16, 2026
bd5c718
Promote the usage of MCP (#1349)
thomasyu888 Apr 16, 2026
520760b
[SYNPY-1375] Add Activity/Provenance tutorial (#1351)
thomasyu888 Apr 16, 2026
875c8f5
[SYNPY-1800] Added new sync_to_synapse method (#1353)
andrewelamb Apr 16, 2026
532ceb3
[SYNPY-1480]: Improve documentation around configuration file (#1350)
thomasyu888 Apr 16, 2026
5304806
fix: Integration test test_wikiAttachment fails due to leaked wiki st…
linglp Apr 21, 2026
0507436
[SYNPY-1802] Add DownloadList functions (#1347)
andrewelamb Apr 22, 2026
21a2263
[DPE-1577] Supporting storage locations and migration OOP models (#1315)
BryanFauble Apr 22, 2026
b633c50
fix circular dependencies (#1365)
andrewelamb Apr 24, 2026
b668606
Update project name in activity.py (#1367)
thomasyu888 Apr 24, 2026
273935a
[SYNPY-1824] fix syn.sendMessage in async context (#1370)
linglp Apr 29, 2026
8cd7c05
[SYNPY-1781] Implement CSV Import to Grid Session (#1360)
linglp Apr 30, 2026
2bdc86f
Add validate-release workflow (#1361)
xschildw May 1, 2026
1ba43d3
Enhance integration tests setup in validate-release workflow
BryanFauble May 1, 2026
2b92783
[SYNPY-1782] Download CSV from Grid session (#1366)
linglp May 5, 2026
38948ec
[SYNPY-1799, SYNPY-1804] Add manifest generation to sync_from_synapse…
danlu1 May 6, 2026
5556aa3
[SYNPY-1836] Support configurable view_type_mask in file-based metada…
BryanFauble May 6, 2026
2553942
Merge pull request #1376 from Sage-Bionetworks/master
BryanFauble May 7, 2026
8a5f1fc
remove unused columns when creating entity view (#1377)
linglp May 7, 2026
3122476
Add missing MY_PROXY_SECRET_KEY variable in tutorials (#1375)
rxu17 May 7, 2026
b9475d6
[SYNPY-1783] Implemented grid synchronization (#1368)
linglp May 11, 2026
7b5fdbf
[SYNPY-1832] Fix bug causing RecordSet to be updated to v2 (#1378)
andrewelamb May 11, 2026
b6466d9
fix test (#1381)
linglp May 14, 2026
d0d8363
[SYNPY-1749]Allow quote, apostrophe and ellipsis in store_row_async (…
danlu1 May 14, 2026
d237228
[SYNPY-1809] Added generate_sync_manifest method (#1373)
andrewelamb May 15, 2026
32a66ad
Curator documentation: Add viewtype mask (#1382)
thomasyu888 May 21, 2026
e4cbd7a
[SYNPY-1810] Migrate all docs to new reference style (#1386)
thomasyu888 May 22, 2026
cb40607
[SYNPY-1638] Update the fact that the config is not generated upon in…
thomasyu888 May 22, 2026
414af80
set higher requests version min (#1385)
andrewelamb May 23, 2026
850aa45
[SYNPY-1841] Added fields for CurationTask search (#1384)
andrewelamb May 23, 2026
a2442cd
[SYNPY-1838] prepare function for removal of Grid creation (#1380)
andrewelamb May 25, 2026
97efeed
[SYNPY-1835] Fix query() failure when a list column is all-NA (#1390)
BryanFauble Jun 1, 2026
2243452
[SYNPY-1760] Add ability to link Grid to CurationTask (#1383)
andrewelamb Jun 4, 2026
c67fab7
Swap away from a wikimedia attachment to a synapse controlled URL
BryanFauble Jun 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 143 additions & 44 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -552,87 +552,186 @@ jobs:
exit 1

# containerize the package and upload to the GHCR upon new release (whether pre-release or not)
ghcr-build-and-push-on-release:
# Step 1: Build the Docker image and save as tar for scanning
ghcr-build-on-release:
needs: deploy
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
outputs:
image-tags: ${{ steps.set-tags.outputs.tags }}
image-name: synapsepythonclient-release
env:
TARFILE_NAME: synapsepythonclient-release.tar

steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Extract Release Version
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
shell: bash
- name: Set image tags
id: set-tags
shell: bash
run: |
if [[ "${{ github.event.release.prerelease }}" == "true" ]]; then
echo "tags=ghcr.io/sage-bionetworks/synapsepythonclient:${{ env.RELEASE_VERSION }}-prerelease" >> $GITHUB_OUTPUT
else
echo "tags=ghcr.io/sage-bionetworks/synapsepythonclient:latest,ghcr.io/sage-bionetworks/synapsepythonclient:${{ env.RELEASE_VERSION }}" >> $GITHUB_OUTPUT
fi
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image (official release)
id: docker_build
if: '!github.event.release.prerelease'
uses: docker/build-push-action@v3
- name: Build Docker image
uses: docker/build-push-action@v5
with:
push: true
context: .
push: false
load: true
provenance: false
tags: ghcr.io/sage-bionetworks/synapsepythonclient:latest,ghcr.io/sage-bionetworks/synapsepythonclient:${{ env.RELEASE_VERSION }}
tags: synapsepythonclient-release:local
file: ./Dockerfile
platforms: linux/amd64
cache-from: type=registry,ref=ghcr.io/sage-bionetworks/synapsepythonclient:build-cache
cache-to: type=registry,mode=max,ref=ghcr.io/sage-bionetworks/synapsepythonclient:build-cache
- name: Build and push Docker image (pre-release)
id: docker_build_prerelease
if: 'github.event.release.prerelease'
uses: docker/build-push-action@v3
cache-to: type=inline
- name: Save Docker image to tar
run: docker save synapsepythonclient-release:local -o ${{ env.TARFILE_NAME }}
- name: Upload tar artifact
uses: actions/upload-artifact@v4
with:
push: true
provenance: false
tags: ghcr.io/sage-bionetworks/synapsepythonclient:${{ env.RELEASE_VERSION }}-prerelease
file: ./Dockerfile
platforms: linux/amd64
cache-from: type=registry,ref=ghcr.io/sage-bionetworks/synapsepythonclient:build-cache-prerelease
cache-to: type=registry,mode=max,ref=ghcr.io/sage-bionetworks/synapsepythonclient:build-cache-prerelease
- name: Output image digest (official release)
if: '!github.event.release.prerelease'
run: echo "The image digest for official release is ${{ steps.docker_build.outputs.digest }}"
- name: Output image digest (pre-release)
if: 'github.event.release.prerelease'
run: echo "The image digest for pre-release is ${{ steps.docker_build_prerelease.outputs.digest }}"
name: ${{ env.TARFILE_NAME }}
path: ${{ env.TARFILE_NAME }}
retention-days: 1

# Step 2: Scan the built image with Trivy before pushing
trivy-scan-release:
needs: [ghcr-build-on-release]
uses: ./.github/workflows/trivy.yml
with:
SOURCE_TYPE: tar
TARFILE_NAME: synapsepythonclient-release.tar
IMAGE_NAME: synapsepythonclient-release:local
EXIT_CODE: 1
permissions:
contents: read
security-events: write
actions: read

# containerize the package and upload to the GHCR upon commit in develop
ghcr-build-and-push-on-develop:
# Step 3: Push the image to GHCR only if Trivy scan passes
ghcr-push-on-release:
needs: [ghcr-build-on-release, trivy-scan-release]
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/develop'
permissions:
contents: read
packages: write

env:
TARFILE_NAME: synapsepythonclient-release.tar

steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Download scanned tar
uses: actions/download-artifact@v4
with:
name: ${{ env.TARFILE_NAME }}
path: /tmp
- name: Load Docker image from tar
run: docker load -i /tmp/${{ env.TARFILE_NAME }}
- name: Log in to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image for develop
id: docker_build
- name: Tag and push Docker image
shell: bash
run: |
IFS=',' read -ra TAGS <<< "${{ needs.ghcr-build-on-release.outputs.image-tags }}"
for TAG in "${TAGS[@]}"; do
docker tag synapsepythonclient-release:local "$TAG"
docker push "$TAG"
done

# containerize the package and upload to the GHCR upon commit in develop
# Step 1: Build the Docker image and save as tar for scanning
ghcr-build-on-develop:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/develop'
permissions:
contents: read
packages: write
outputs:
image-tag: ghcr.io/sage-bionetworks/synapsepythonclient:develop-${{ github.sha }}
image-name: synapsepythonclient-develop
env:
TARFILE_NAME: synapsepythonclient-develop.tar

steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Build Docker image
uses: docker/build-push-action@v5
with:
push: true
context: .
push: false
load: true
provenance: false
tags: ghcr.io/sage-bionetworks/synapsepythonclient:develop-${{ github.sha }}
tags: synapsepythonclient-develop:local
file: ./Dockerfile
platforms: linux/amd64
cache-from: type=registry,ref=ghcr.io/sage-bionetworks/synapsepythonclient:build-cache
cache-to: type=inline
- name: Output image digest
run: echo "The image digest is ${{ steps.docker_build.outputs.digest }}"
- name: Save Docker image to tar
run: docker save synapsepythonclient-develop:local -o ${{ env.TARFILE_NAME }}
- name: Upload tar artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.TARFILE_NAME }}
path: ${{ env.TARFILE_NAME }}
retention-days: 1

# Step 2: Scan the built image with Trivy before pushing
trivy-scan-develop:
needs: [ghcr-build-on-develop]
uses: ./.github/workflows/trivy.yml
with:
SOURCE_TYPE: tar
TARFILE_NAME: synapsepythonclient-develop.tar
IMAGE_NAME: synapsepythonclient-develop:local
EXIT_CODE: 1
permissions:
contents: read
security-events: write
actions: read

# Step 3: Push the image to GHCR only if Trivy scan passes
ghcr-push-on-develop:
needs: [ghcr-build-on-develop, trivy-scan-develop]
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/develop'
permissions:
contents: read
packages: write

env:
TARFILE_NAME: synapsepythonclient-develop.tar

steps:
- name: Download scanned tar
uses: actions/download-artifact@v4
with:
name: ${{ env.TARFILE_NAME }}
path: /tmp
- name: Load Docker image from tar
run: docker load -i /tmp/${{ env.TARFILE_NAME }}
- name: Log in to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Tag and push Docker image
run: |
docker tag synapsepythonclient-develop:local "${{ needs.ghcr-build-on-develop.outputs.image-tag }}"
docker push "${{ needs.ghcr-build-on-develop.outputs.image-tag }}"
104 changes: 104 additions & 0 deletions .github/workflows/docker_build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
---
#
# Reusable workflow to build, scan, and push a Docker image.
# Called by the periodic scan workflow to rebuild images
# when new vulnerabilities are found.
#
name: Build and publish a Docker image

on:
workflow_call:
inputs:
REF_TO_CHECKOUT:
required: false
type: string
description: "Reference to checkout, e.g. a tag like v1.0.1. Defaults to the branch/tag of the current event."
IMAGE_REFERENCES:
required: true
type: string
description: "Comma-separated image references, e.g., ghcr.io/sage-bionetworks/synapsepythonclient:1.0.1"

env:
TARFILE_NAME: image.tar
LOCAL_IMAGE_TAG: rebuild-image:local

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ inputs.REF_TO_CHECKOUT }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Build Docker image
uses: docker/build-push-action@v5
with:
context: .
push: false
load: true
tags: ${{ env.LOCAL_IMAGE_TAG }}
file: ./Dockerfile
platforms: linux/amd64

- name: Save Docker image to tar
run: docker save ${{ env.LOCAL_IMAGE_TAG }} -o ${{ env.TARFILE_NAME }}

- name: Upload tarball for use by Trivy job
uses: actions/upload-artifact@v4
with:
name: ${{ env.TARFILE_NAME }}
path: ${{ env.TARFILE_NAME }}
retention-days: 1

outputs:
tarfile_artifact: ${{ env.TARFILE_NAME }}

trivy-scan:
needs: build
uses: "./.github/workflows/trivy.yml"
with:
SOURCE_TYPE: tar
IMAGE_NAME: rebuild-image:local
TARFILE_NAME: ${{ needs.build.outputs.tarfile_artifact }}
EXIT_CODE: 1
ARTIFACT_NAME_SUFFIX: -rebuild
permissions:
contents: read
security-events: write
actions: read

push-image:
needs: [build, trivy-scan]
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Download tar artifact
uses: actions/download-artifact@v4
with:
name: ${{ needs.build.outputs.tarfile_artifact }}
path: /tmp

- name: Load Docker image from tar
run: docker load -i /tmp/${{ needs.build.outputs.tarfile_artifact }}

- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Tag and push Docker image
shell: bash
run: |
IFS=',' read -ra TAGS <<< "${{ inputs.IMAGE_REFERENCES }}"
for TAG in "${TAGS[@]}"; do
docker tag ${{ env.LOCAL_IMAGE_TAG }} "$TAG"
docker push "$TAG"
done
Loading
Loading