From dc6c464d42e50cf9e6e21dc4befb2009ed1e93d8 Mon Sep 17 00:00:00 2001 From: Sandip Samal Date: Thu, 3 Oct 2024 13:12:56 -0400 Subject: [PATCH] updated CI/CD and version bump --- .github/workflows/ci.yml | 119 ++++++++++++++++++++------------------- fastsurfer_inference.py | 2 +- requirements.txt | 2 +- 3 files changed, 64 insertions(+), 59 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 41d605d..1159a6a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,44 +72,51 @@ jobs: remove-docker-images: 'false' - name: Start docker run: sudo systemctl start docker - - name: Get git tag - id: git_info - if: startsWith(github.ref, 'refs/tags/') - run: echo "tag=${GITHUB_REF##*/}" >> $GITHUB_OUTPUT - - name: Get project info - id: determine - env: - git_tag: ${{ steps.git_info.outputs.tag }} + - name: Decide image tags + id: info + shell: python run: | - repo="${GITHUB_REPOSITORY,,}" # to lower case - # if build triggered by tag, use tag name - tag="${git_tag:-latest}" + import os + import itertools - # if tag is a version number prefixed by 'v', remove the 'v' - if [[ "$tag" =~ ^v[0-9].* ]]; then - tag="${tag:1}" - fi + def join_tag(t): + registry, repo, tag = t + return f'{registry}/{repo}:{tag}'.lower() - dock_image=$repo:$tag - echo $dock_image - echo "dock_image=$dock_image" >> $GITHUB_OUTPUT - echo "repo=$repo" >> $GITHUB_OUTPUT + registries = ['docker.io', 'ghcr.io'] + repos = ['${{ github.repository }}'] + if '${{ github.ref_type }}' == 'branch': + tags = ['latest'] + elif '${{ github.ref_type }}' == 'tag': + tag = '${{ github.ref_name }}' + version = tag[1:] if tag.startswith('v') else tag + tags = ['latest', version] + else: + tags = [] - - uses: actions/checkout@v3 + if '${{ github.ref_type }}' == 'tag': + local_tag = join_tag(('ghcr.io', '${{ github.repository }}', version)) + else: + local_tag = join_tag(('localhost', '${{ github.repository }}', 'latest')) + + product = itertools.product(registries, repos, tags) + tags_csv = ','.join(map(join_tag, product)) + outputs = { + 'tags_csv' : tags_csv, + 'push' : 'true' if tags_csv else 'false', + 'local_tag': local_tag + } + with open(os.environ['GITHUB_OUTPUT'], 'a') as out: + for k, v in outputs.items(): + out.write(f'{k}={v}\n') + + - uses: actions/checkout@v4 # QEMU is used for non-x86_64 builds - - uses: docker/setup-qemu-action@v2 + - uses: docker/setup-qemu-action@v3 # buildx adds additional features to docker build - - uses: docker/setup-buildx-action@v2 + - uses: docker/setup-buildx-action@v3 with: driver-opts: network=host - # cache slightly improves rebuild time - - name: Cache Docker layers - uses: actions/cache@v3 - with: - path: /tmp/.buildx-cache - key: ${{ runner.os }}-buildx-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-buildx- # Here, we want to do the docker build twice: # The first build pushes to our local registry for testing. @@ -120,12 +127,11 @@ jobs: with: context: . file: ./Dockerfile - tags: localhost/${{ steps.determine.outputs.dock_image }} + tags: ${{ steps.info.outputs.local_tag }} load: true - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,dest=/tmp/.buildx-cache + cache-from: type=gha # If you have a directory called examples/incoming/ and examples/outgoing/, then - # run your ChRIS plugin with no parameters, and asser that it creates all the files + # run your ChRIS plugin with no parameters, and assert that it creates all the files # which are expected. File contents are not compared. - name: Run examples id: run_examples @@ -135,7 +141,7 @@ jobs: exit 0 fi - dock_image=localhost/${{ steps.determine.outputs.dock_image }} + dock_image=${{ steps.info.outputs.local_tag }} output_dir=$(mktemp -d) cmd=$(docker image inspect -f '{{ (index .Config.Cmd 0) }}' $dock_image) docker run --rm -u "$(id -u):$(id -g)" \ @@ -156,48 +162,47 @@ jobs: done - name: Login to DockerHub - id: dockerhub_login - uses: docker/login-action@v2 + if: (github.event_name == 'push' || github.event_name == 'release') && contains(steps.info.outputs.tags_csv, 'docker.io') + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + if: (github.event_name == 'push' || github.event_name == 'release') && contains(steps.info.outputs.tags_csv, 'ghcr.io') + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push - uses: docker/build-push-action@v3 - if: github.event_name == 'push' || github.event_name == 'release' + uses: docker/build-push-action@v5 + if: (github.event_name == 'push' || github.event_name == 'release') with: context: . file: ./Dockerfile - tags: | - docker.io/${{ steps.determine.outputs.dock_image }} - ghcr.io/${{ steps.determine.outputs.dock_image }} + tags: ${{ steps.info.outputs.tags_csv }} # if non-x86_84 architectures are supported, add them here platforms: linux/amd64 #,linux/arm64,linux/ppc64le - push: true - cache-from: type=local,src=/tmp/.buildx-cache - cache-to: type=local,dest=/tmp/.buildx-cache + push: ${{ steps.info.outputs.push }} + cache-to: type=gha,mode=max - - name: Get plugin meta - id: pluginmeta - run: | - repo=${{ steps.determine.outputs.repo }} - dock_image=${{ steps.determine.outputs.dock_image }} - docker run --rm localhost/$dock_image chris_plugin_info > /tmp/description.json - jq < /tmp/description.json # pretty print in log - echo "title=$(jq -r '.title' < /tmp/description.json)" >> $GITHUB_OUTPUT + - name: Upload ChRIS Plugin + id: upload + if: github.ref_type == 'tag' + uses: FNNDSC/upload-chris-plugin@v1 + with: + dock_image: ${{ steps.info.outputs.local_tag }} + username: ${{ secrets.CHRISPROJECT_USERNAME }} + password: ${{ secrets.CHRISPROJECT_PASSWORD }} + chris_url: https://cube.chrisproject.org/api/v1/ + compute_names: NERC - name: Update DockerHub description + if: steps.upload.outcome == 'success' uses: peter-evans/dockerhub-description@v3 continue-on-error: true # it is not crucial that this works with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - short-description: ${{ steps.pluginmeta.outputs.title }} + short-description: ${{ steps.upload.outputs.title }} readme-filepath: ./README.md - repository: ${{ steps.determine.outputs.repo }} \ No newline at end of file diff --git a/fastsurfer_inference.py b/fastsurfer_inference.py index fc07aa1..54f0ecf 100644 --- a/fastsurfer_inference.py +++ b/fastsurfer_inference.py @@ -25,7 +25,7 @@ logger.opt(colors = True) logger.add(sys.stderr, format=logger_format) -__version__ = '1.3.9' +__version__ = '1.4.0' DISPLAY_TITLE = r""" __ _ __ _ __ diff --git a/requirements.txt b/requirements.txt index 50653fc..3a9a650 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -chris_plugin==0.2.1 +chris_plugin>=0.3.0 pudb loguru pftag==1.2.22