Skip to content

Run build & unit tests #59

Run build & unit tests

Run build & unit tests #59

name: DockerPublish
on:
workflow_dispatch:
push:
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
commit_time: ${{ steps.prepare.outputs.COMMIT_TIMESTAMP }}
registry_image: ${{ steps.prepare.outputs.REGISTRY_IMAGE }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Prepare various metadata
id: prepare
run: |
# Get the commit timestamp
export "COMMIT_TIMESTAMP=$(git log -1 --pretty=%ct)"
echo "COMMIT_TIMESTAMP=${COMMIT_TIMESTAMP}" >> $GITHUB_OUTPUT
# Lowercase the repository name
UNSANITIZED_REGISTRY_IMAGE="ghcr.io/${{ github.repository }}/indev"
echo "REGISTRY_IMAGE=${UNSANITIZED_REGISTRY_IMAGE,,}" >> $GITHUB_OUTPUT
# Print it for our audience
cat $GITHUB_OUTPUT
build-minrobot:
runs-on: ubuntu-latest
needs:
- prepare
env:
SOURCE_DATE_EPOCH: ${{ needs.prepare.outputs.commit_time }}
REGISTRY_IMAGE: ${{ needs.prepare.outputs.registry_image }}
outputs:
# So we can `FROM` this image in the next build
digest: ${{ steps.build.outputs.digest }}
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY_IMAGE }}
tags: |
# commit sha
type=sha,prefix=,suffix=,format=long
- name: Login to Github Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push by digest
id: build
uses: docker/build-push-action@v6
with:
platforms: linux/amd64,linux/arm64
annotations: ${{ steps.meta.outputs.annotations }}
build-args: |
SOURCE_DATE_EPOCH=${{ env.SOURCE_DATE_EPOCH }}
file: docker/moos-ivp/Dockerfile
cache-from: type=gha
cache-to: type=gha,mode=max
tags: ${{ steps.meta.outputs.tags }}
push: true
build-gui:
runs-on: ubuntu-latest
needs:
- prepare
- build-minrobot
env:
FLAVOR: "-gui"
SOURCE_DATE_EPOCH: ${{ needs.prepare.outputs.commit_time }}
REGISTRY_IMAGE: ${{ needs.prepare.outputs.registry_image }}
outputs:
digest: ${{ steps.build.outputs.digest }}
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY_IMAGE }}
tags: |
# commit sha
type=sha,prefix=,suffix=${{ env.FLAVOR }},format=long
- name: Login to Github Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push by digest
id: build
uses: docker/build-push-action@v6
with:
platforms: linux/amd64,linux/arm64
annotations: ${{ steps.meta.outputs.annotations }}
build-args: |
FROM=${{ env.REGISTRY_IMAGE }}@${{ needs.build-minrobot.outputs.digest }}
SOURCE_DATE_EPOCH=${{ env.SOURCE_DATE_EPOCH }}
file: docker/moos-ivp-gui/Dockerfile
cache-from: type=gha
cache-to: type=gha,mode=max
tags: ${{ steps.meta.outputs.tags }}
push: true
test-unittests:
runs-on: ubuntu-latest
container:
image: ${{ env.REGISTRY_IMAGE }}@${{ needs.build-gui.outputs.digest }}

Check failure on line 130 in .github/workflows/docker-publish.yaml

View workflow run for this annotation

GitHub Actions / DockerPublish

Invalid workflow file

The workflow is not valid. .github/workflows/docker-publish.yaml (Line: 130, Col: 14): Unrecognized named-value: 'env'. Located at position 1 within expression: env.REGISTRY_IMAGE
steps:
- name: Check for expected binaries
run: |
ls
echo "Checking for build binaries"
./build-check.sh
- name: Run unit tests
run: |
# Run the unit tests
ls
echo "Running automated mission tests"
./build-utests.sh
cd ivp/src_unit_tests/
./alltest.sh
push-to-registry:
runs-on: ubuntu-latest
# Only push images on forks or the main branch
if: ${{ (github.ref_name == 'main') || (github.repository_owner != 'moos-ivp') }}
needs:
- prepare
- build-minrobot
- build-gui
env:
REGISTRY_IMAGE: ${{ needs.prepare.outputs.registry_image }}
strategy:
fail-fast: false
matrix:
registry: [docker.io, quay.io, ghcr.io]
steps:
- name: Sanitize some things
id: prepare
run: |
# Sanitize the registry name
REGISTRY="${{ matrix.registry }}"
REGISTRY="${REGISTRY^^}" # upper case
REGISTRY="${REGISTRY//[^A-Z0-9]/_}" # replace non-alphanumeric with _
echo "REGISTRY=${REGISTRY}" >> $GITHUB_OUTPUT
# Quay & DockerHub don't support dashes in the repository name
UNSANITIZED_ORG="${{ github.organization }}"
REPO="${UNSANITIZED_ORG//\-/}/${{ github.repository_name }}" # Remove dashes from the repository name
echo "REPOSITORY=${{ matrix.registry }}/${REPO}" | tee -a $GITHUB_OUTPUT
- name: Prepare Credentials
id: credentials
run: |
if [[ ${{ matrix.registry }} == "ghcr.io" ]]; then
REGISTRY_USERNAME="${{ github.actor }}"
REGISTRY_PASSWORD="${{ secrets.GITHUB_TOKEN }}"
else
# Write the username and password to job outputs
REGISTRY_USERNAME="${{ secrets[format('REGISTRY_USERNAME_{0}', steps.prepare.outputs.REGISTRY)] }}"
REGISTRY_PASSWORD="${{ secrets[format('REGISTRY_PASSWORD_{0}', steps.prepare.outputs.REGISTRY)] }}"
fi
if [[ -z "${REGISTRY_USERNAME}" && -z "${REGISTRY_PASSWORD}" ]]; then
# If we don't have the relevant credentials, we can't push. Warn the user, but don't fail.
echo "::warning::Pushing to ${{ matrix.registry }} is disabled; we can't find credentials"
echo "REGISTRY_READY=false" | tee -a $GITHUB_OUTPUT
else
echo "REGISTRY_USERNAME=${REGISTRY_USERNAME}" >> $GITHUB_OUTPUT
echo "REGISTRY_PASSWORD=${REGISTRY_PASSWORD}" >> $GITHUB_OUTPUT
echo "REGISTRY_READY=true" | tee -a $GITHUB_OUTPUT
fi
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ steps.prepare.outputs.REPOSITORY }}
tags: |
# branch event
type=ref,enable=true,event=branch
# tag event
type=ref,enable=true,event=tag
# commit sha
type=sha,prefix=,format=short
- name: Login to ${{ matrix.registry }}
uses: docker/login-action@v3
if: steps.credentials.outputs.REGISTRY_READY == 'true'
with:
registry: ${{ matrix.registry }}
username: ${{ steps.credentials.output.REGISTRY_USERNAME }}
password: ${{ steps.credentials.output.REGISTRY_PASSWORD }}
- name: Push to ${{ matrix.registry }}
id: check
if: steps.credentials.outputs.REGISTRY_READY == 'true'
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
${{ env.REGISTRY_IMAGE }}@${{ needs.build-minrobot.outputs.digest }}
# Cheap way to also copy the gui
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join("-gui ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
${{ env.REGISTRY_IMAGE }}@${{ needs.build-gui.outputs.digest }}