@@ -552,19 +552,81 @@ jobs:
552552 exit 1
553553
554554 # containerize the package and upload to the GHCR upon new release (whether pre-release or not)
555- ghcr-build-and-push-on-release :
555+ # Step 1: Build the Docker image and save as tar for scanning
556+ ghcr-build-on-release :
556557 needs : deploy
557558 runs-on : ubuntu-latest
558559 permissions :
559560 contents : read
560561 packages : write
562+ outputs :
563+ image-tags : ${{ steps.set-tags.outputs.tags }}
564+ image-name : synapsepythonclient-release
565+ env :
566+ TARFILE_NAME : synapsepythonclient-release.tar
561567
562568 steps :
563569 - name : Check out the repo
564570 uses : actions/checkout@v4
565571 - name : Extract Release Version
566572 run : echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
567573 shell : bash
574+ - name : Set image tags
575+ id : set-tags
576+ shell : bash
577+ run : |
578+ if [[ "${{ github.event.release.prerelease }}" == "true" ]]; then
579+ echo "tags=ghcr.io/sage-bionetworks/synapsepythonclient:${{ env.RELEASE_VERSION }}-prerelease" >> $GITHUB_OUTPUT
580+ else
581+ echo "tags=ghcr.io/sage-bionetworks/synapsepythonclient:latest,ghcr.io/sage-bionetworks/synapsepythonclient:${{ env.RELEASE_VERSION }}" >> $GITHUB_OUTPUT
582+ fi
583+ - name : Set up Docker Buildx
584+ uses : docker/setup-buildx-action@v2
585+ - name : Build Docker image
586+ uses : docker/build-push-action@v5
587+ with :
588+ context : .
589+ push : false
590+ load : true
591+ provenance : false
592+ tags : synapsepythonclient-release:local
593+ file : ./Dockerfile
594+ platforms : linux/amd64
595+ cache-from : type=registry,ref=ghcr.io/sage-bionetworks/synapsepythonclient:build-cache
596+ - name : Save Docker image to tar
597+ run : docker save synapsepythonclient-release:local -o ${{ env.TARFILE_NAME }}
598+ - name : Upload tar artifact
599+ uses : actions/upload-artifact@v4
600+ with :
601+ name : ${{ env.TARFILE_NAME }}
602+ path : ${{ env.TARFILE_NAME }}
603+ retention-days : 1
604+
605+ # Step 2: Scan the built image with Trivy before pushing
606+ trivy-scan-release :
607+ needs : [ghcr-build-on-release]
608+ uses : ./.github/workflows/trivy.yml
609+ with :
610+ SOURCE_TYPE : tar
611+ TARFILE_NAME : synapsepythonclient-release.tar
612+ IMAGE_NAME : synapsepythonclient-release:local
613+ EXIT_CODE : 1
614+ permissions :
615+ contents : read
616+ security-events : write
617+ actions : read
618+
619+ # Step 3: Push the image to GHCR only if Trivy scan passes
620+ ghcr-push-on-release :
621+ needs : [ghcr-build-on-release, trivy-scan-release]
622+ runs-on : ubuntu-latest
623+ permissions :
624+ contents : read
625+ packages : write
626+
627+ steps :
628+ - name : Check out the repo
629+ uses : actions/checkout@v4
568630 - name : Set up Docker Buildx
569631 uses : docker/setup-buildx-action@v2
570632 - name : Log in to GitHub Container Registry
@@ -573,39 +635,74 @@ jobs:
573635 registry : ghcr.io
574636 username : ${{ github.actor }}
575637 password : ${{ secrets.GITHUB_TOKEN }}
576- - name : Build and push Docker image (official release)
577- id : docker_build
578- if : ' !github.event.release.prerelease'
579- uses : docker/build-push-action@v3
638+ - name : Build and push Docker image
639+ uses : docker/build-push-action@v5
580640 with :
641+ context : .
581642 push : true
582643 provenance : false
583- tags : ghcr.io/sage-bionetworks/synapsepythonclient:latest,ghcr.io/sage-bionetworks/synapsepythonclient: ${{ env.RELEASE_VERSION }}
644+ tags : ${{ needs.ghcr-build-on-release.outputs.image-tags }}
584645 file : ./Dockerfile
585646 platforms : linux/amd64
586647 cache-from : type=registry,ref=ghcr.io/sage-bionetworks/synapsepythonclient:build-cache
587648 cache-to : type=registry,mode=max,ref=ghcr.io/sage-bionetworks/synapsepythonclient:build-cache
588- - name : Build and push Docker image (pre-release)
589- id : docker_build_prerelease
590- if : ' github.event.release.prerelease'
591- uses : docker/build-push-action@v3
649+
650+ # containerize the package and upload to the GHCR upon commit in develop
651+ # Step 1: Build the Docker image and save as tar for scanning
652+ ghcr-build-on-develop :
653+ runs-on : ubuntu-latest
654+ if : github.ref == 'refs/heads/develop'
655+ permissions :
656+ contents : read
657+ packages : write
658+ outputs :
659+ image-tag : ghcr.io/sage-bionetworks/synapsepythonclient:develop-${{ github.sha }}
660+ image-name : synapsepythonclient-develop
661+ env :
662+ TARFILE_NAME : synapsepythonclient-develop.tar
663+
664+ steps :
665+ - name : Check out the repo
666+ uses : actions/checkout@v4
667+ - name : Set up Docker Buildx
668+ uses : docker/setup-buildx-action@v2
669+ - name : Build Docker image
670+ uses : docker/build-push-action@v5
592671 with :
593- push : true
672+ context : .
673+ push : false
674+ load : true
594675 provenance : false
595- tags : ghcr.io/sage-bionetworks/ synapsepythonclient:${{ env.RELEASE_VERSION }}-prerelease
676+ tags : synapsepythonclient-develop:local
596677 file : ./Dockerfile
597678 platforms : linux/amd64
598- cache-from : type=registry,ref=ghcr.io/sage-bionetworks/synapsepythonclient:build-cache-prerelease
599- cache-to : type=registry,mode=max,ref=ghcr.io/sage-bionetworks/synapsepythonclient:build-cache-prerelease
600- - name : Output image digest (official release)
601- if : ' !github.event.release.prerelease'
602- run : echo "The image digest for official release is ${{ steps.docker_build.outputs.digest }}"
603- - name : Output image digest (pre-release)
604- if : ' github.event.release.prerelease'
605- run : echo "The image digest for pre-release is ${{ steps.docker_build_prerelease.outputs.digest }}"
679+ cache-from : type=registry,ref=ghcr.io/sage-bionetworks/synapsepythonclient:build-cache
680+ - name : Save Docker image to tar
681+ run : docker save synapsepythonclient-develop:local -o ${{ env.TARFILE_NAME }}
682+ - name : Upload tar artifact
683+ uses : actions/upload-artifact@v4
684+ with :
685+ name : ${{ env.TARFILE_NAME }}
686+ path : ${{ env.TARFILE_NAME }}
687+ retention-days : 1
688+
689+ # Step 2: Scan the built image with Trivy before pushing
690+ trivy-scan-develop :
691+ needs : [ghcr-build-on-develop]
692+ uses : ./.github/workflows/trivy.yml
693+ with :
694+ SOURCE_TYPE : tar
695+ TARFILE_NAME : synapsepythonclient-develop.tar
696+ IMAGE_NAME : synapsepythonclient-develop:local
697+ EXIT_CODE : 1
698+ permissions :
699+ contents : read
700+ security-events : write
701+ actions : read
606702
607- # containerize the package and upload to the GHCR upon commit in develop
608- ghcr-build-and-push-on-develop :
703+ # Step 3: Push the image to GHCR only if Trivy scan passes
704+ ghcr-push-on-develop :
705+ needs : [ghcr-build-on-develop, trivy-scan-develop]
609706 runs-on : ubuntu-latest
610707 if : github.ref == 'refs/heads/develop'
611708 permissions :
@@ -623,16 +720,14 @@ jobs:
623720 registry : ghcr.io
624721 username : ${{ github.actor }}
625722 password : ${{ secrets.GITHUB_TOKEN }}
626- - name : Build and push Docker image for develop
627- id : docker_build
723+ - name : Build and push Docker image
628724 uses : docker/build-push-action@v5
629725 with :
726+ context : .
630727 push : true
631728 provenance : false
632729 tags : ghcr.io/sage-bionetworks/synapsepythonclient:develop-${{ github.sha }}
633730 file : ./Dockerfile
634731 platforms : linux/amd64
635732 cache-from : type=registry,ref=ghcr.io/sage-bionetworks/synapsepythonclient:build-cache
636733 cache-to : type=inline
637- - name : Output image digest
638- run : echo "The image digest is ${{ steps.docker_build.outputs.digest }}"
0 commit comments