Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
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:
Comment thread
BryanFauble marked this conversation as resolved.
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
Comment thread
BryanFauble marked this conversation as resolved.
- 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 }}"
103 changes: 103 additions & 0 deletions .github/workflows/docker_build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
---
Comment thread
BryanFauble marked this conversation as resolved.
#
# 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
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