Skip to content

Add test

Add test #13

Workflow file for this run

name: ci
on:
push:
branches: [ master ]
tags:
- "v?[0-9]+.[0-9]+.[0-9]+*"
jobs:
build:
name: Build
runs-on: ubuntu-22.04
steps:
- name: Decide image tags
id: info
shell: python
run: |
import os
import itertools
def join_tag(t):
registry, repo, tag = t
return f'{registry}/{repo}:{tag}'.lower()
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 = []
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@v3
- uses: docker/setup-buildx-action@v3
with:
driver-opts: network=host
# Here, we want to do the docker build twice:
# The first build pushes to our local registry for testing.
# The second build pushes to Docker Hub and ghcr.io
- name: Build (local only)
uses: docker/build-push-action@v3
id: docker_build
with:
context: .
file: ./Dockerfile
tags: ${{ steps.info.outputs.local_tag }}
load: true
cache-from: type=gha
- name: Download example data
run: ./download_example_data.sh example_data_dir/
- name: Run examples
id: run_examples
run: |
mkdir /tmp/outgoing
docker run --rm -u "$(id -u):$(id -g)" \
-v "${{ github.workspace }}/example_data_dir/data:/incoming:ro" \
-v "/tmp/outgoing:/outgoing:rw" \
${{ steps.info.outputs.local_tag }} \
emerald --mask-suffix '_mask.nii' --outputs '0.0:_brain.nii,0.2:_overlay02.nii' /incoming /outgoing
- name: Assert example outputs are found
run: |
expected_outputs=(
/tmp/outgoing/stack-1_brain.nii
/tmp/outgoing/stack-1_mask.nii
/tmp/outgoing/stack-1_overlay02.nii
/tmp/outgoing/stack-2_brain.nii
/tmp/outgoing/stack-2_mask.nii
/tmp/outgoing/stack-2_overlay02.nii
/tmp/outgoing/stack-3_brain.nii
/tmp/outgoing/stack-3_mask.nii
/tmp/outgoing/stack-3_overlay02.nii
/tmp/outgoing/stack-4_brain.nii
/tmp/outgoing/stack-4_mask.nii
/tmp/outgoing/stack-4_overlay02.nii
/tmp/outgoing/stack-5_brain.nii
/tmp/outgoing/stack-5_mask.nii
/tmp/outgoing/stack-5_overlay02.nii
/tmp/outgoing/stack-6_brain.nii
/tmp/outgoing/stack-6_mask.nii
/tmp/outgoing/stack-6_overlay02.nii
/tmp/outgoing/stack-7_brain.nii
/tmp/outgoing/stack-7_mask.nii
/tmp/outgoing/stack-7_overlay02.nii
/tmp/outgoing/stack-8_brain.nii
/tmp/outgoing/stack-8_mask.nii
/tmp/outgoing/stack-8_overlay02.nii
)
for expected_output in "${expected_outputs[@]}"; do
if ! [ -f "$expected_output" ]; then
echo "expected $expected_output to be a file, but it does not."
parent_dir="$(dirname "$expected_output")"
set -ex
ls -lh "$parent_dir"
exit 1
fi
done
- name: Login to DockerHub
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
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')
with:
context: .
file: ./Dockerfile
tags: ${{ steps.info.outputs.tags_csv }}
platforms: linux/amd64
push: ${{ steps.info.outputs.push }}
cache-to: type=gha,mode=max
- 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: galena
- 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.upload.outputs.title }}
readme-filepath: ./README.md