This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: build and push ArduPilot container | |
concurrency: | |
group: ci-${{github.workflow}}-${{ github.ref }} | |
cancel-in-progress: true | |
on: | |
push: | |
branches: master | |
tags: | |
- 'v*.*.*' | |
paths-ignore: | |
- '.github/workflows/ros_nightly.yml' | |
pull_request: | |
branches: master | |
paths-ignore: | |
- '.github/workflows/ros_nightly.yml' | |
jobs: | |
build-base: | |
runs-on: ubuntu-latest | |
steps: | |
# git checkout the PR | |
- uses: actions/checkout@v4 | |
- | |
name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- | |
name: Prepare | |
id: prep | |
run: | | |
DOCKER_IMAGE=ardupilot/ardupilot-dev-base | |
VERSION=noop | |
if [ "${{ github.event_name }}" = "schedule" ]; then | |
VERSION=nightly | |
elif [[ $GITHUB_REF == refs/tags/* ]]; then | |
VERSION=${GITHUB_REF#refs/tags/} | |
elif [[ $GITHUB_REF == refs/heads/* ]]; then | |
VERSION=$(echo ${GITHUB_REF#refs/heads/} | sed -r 's#/+#-#g') | |
if [ "${{ github.event.repository.default_branch }}" = "$VERSION" ]; then | |
VERSION=edge | |
fi | |
elif [[ $GITHUB_REF == refs/pull/* ]]; then | |
VERSION=pr-${{ github.event.number }} | |
fi | |
TAGS="${DOCKER_IMAGE}:${VERSION}" | |
if [[ $VERSION =~ ^v[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then | |
MINOR=${VERSION%.*} | |
MAJOR=${MINOR%.*} | |
TAGS="$TAGS,${DOCKER_IMAGE}:${MINOR},${DOCKER_IMAGE}:${MAJOR}" | |
elif [ "${{ github.event_name }}" = "push" ]; then | |
TAGS="$TAGS,${DOCKER_IMAGE}:sha-${GITHUB_SHA::8}" | |
fi | |
echo "img_name=${DOCKER_IMAGE}" >> $GITHUB_OUTPUT | |
echo "version=${VERSION}" >> $GITHUB_OUTPUT | |
echo "tags=${TAGS}" >> $GITHUB_OUTPUT | |
echo "created=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT | |
- name: Login to DockerHub | |
if: github.event_name != 'pull_request' | |
uses: docker/login-action@v3 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
# Only push if it comes from tagging | |
- name: Build ardupilot-dev-base images | |
uses: docker/build-push-action@v5 | |
with: | |
context: ./ | |
file: docker/Dockerfile_dev-base | |
tags: ${{ steps.prep.outputs.tags }} | |
push: ${{ github.event_name != 'pull_request' }} | |
labels: | | |
org.opencontainers.image.title=${{ steps.prep.outputs.img_name }} | |
org.opencontainers.image.description=${{ github.event.repository.name }} | |
org.opencontainers.image.url=${{ github.event.repository.html_url }} | |
org.opencontainers.image.source=${{ github.event.repository.clone_url }} | |
org.opencontainers.image.version=${{ steps.prep.outputs.version }} | |
org.opencontainers.image.created=${{ steps.prep.outputs.created }} | |
org.opencontainers.image.revision=${{ github.sha }} | |
org.opencontainers.image.licenses=${{ github.event.repository.license.spdx_id }} | |
org.label-schema.vcs-ref=${{ github.sha }} | |
org.label-schema.vcs-url=${{ github.event.repository.clone_url }} | |
cache-from: type=gha | |
cache-to: type=gha,mode=max | |
build-main-images: | |
needs: build-base | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false # don't cancel if a job from the matrix fails | |
matrix: | |
config: [ | |
clang, | |
chibios, | |
armhf, | |
aarch64, | |
coverage, | |
# chibios-py2, # Deprecated | |
] | |
steps: | |
# git checkout the PR | |
- uses: actions/checkout@v4 | |
- name: Login to DockerHub | |
if: github.event_name != 'pull_request' | |
uses: docker/login-action@v3 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
- | |
name: Prepare | |
id: prep | |
run: | | |
DOCKER_IMAGE=ardupilot/ardupilot-dev-${{matrix.config}} | |
DOCKER_IMAGE_BASE=ardupilot/ardupilot-dev-base | |
VERSION=noop | |
if [ "${{ github.event_name }}" = "schedule" ]; then | |
VERSION=nightly | |
elif [[ $GITHUB_REF == refs/tags/* ]]; then | |
VERSION=${GITHUB_REF#refs/tags/} | |
elif [[ $GITHUB_REF == refs/heads/* ]]; then | |
VERSION=$(echo ${GITHUB_REF#refs/heads/} | sed -r 's#/+#-#g') | |
if [ "${{ github.event.repository.default_branch }}" = "$VERSION" ]; then | |
VERSION=edge | |
fi | |
elif [[ $GITHUB_REF == refs/pull/* ]]; then | |
VERSION=pr-${{ github.event.number }} | |
fi | |
TAGS="${DOCKER_IMAGE}:${VERSION}" | |
TAGS_BASE="${DOCKER_IMAGE_BASE}:${VERSION}" | |
if [[ $VERSION =~ ^v[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then | |
MINOR=${VERSION%.*} | |
MAJOR=${MINOR%.*} | |
TAGS="$TAGS,${DOCKER_IMAGE}:${MINOR},${DOCKER_IMAGE}:${MAJOR},${DOCKER_IMAGE}" | |
TAGS_BASE="$TAGS_BASE,${DOCKER_IMAGE_BASE}:${MINOR},${DOCKER_IMAGE_BASE}:${MAJOR}" | |
elif [ "${{ github.event_name }}" = "push" ]; then | |
TAGS="$TAGS,${DOCKER_IMAGE}:sha-${GITHUB_SHA::8}" | |
TAGS_BASE="$TAGS_BASE,${DOCKER_IMAGE_BASE}:sha-${GITHUB_SHA::8}" | |
fi | |
echo "img_name=${DOCKER_IMAGE}" >> "$GITHUB_OUTPUT" | |
echo "version=${VERSION}" >> "$GITHUB_OUTPUT" | |
echo "tags=${TAGS}" >> "$GITHUB_OUTPUT" | |
echo "tags_base=${TAGS_BASE}" >> "$GITHUB_OUTPUT" | |
echo "created=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> "$GITHUB_OUTPUT" | |
- name: ReBuild ardupilot-dev-base image from cache | |
if: github.event_name == 'pull_request' | |
uses: docker/build-push-action@v5 | |
with: | |
context: ./ | |
file: docker/Dockerfile_dev-base | |
tags: ardupilot/ardupilot-dev-base:${{ steps.prep.outputs.version }},ardupilot/ardupilot-dev-base:latest | |
push: false | |
load: true | |
labels: | | |
org.opencontainers.image.title=${{ steps.prep.outputs.img_name }} | |
org.opencontainers.image.description=${{ github.event.repository.name }} | |
org.opencontainers.image.url=${{ github.event.repository.html_url }} | |
org.opencontainers.image.source=${{ github.event.repository.clone_url }} | |
org.opencontainers.image.version=${{ steps.prep.outputs.version }} | |
org.opencontainers.image.created=${{ steps.prep.outputs.created }} | |
org.opencontainers.image.revision=${{ github.sha }} | |
org.opencontainers.image.licenses=${{ github.event.repository.license.spdx_id }} | |
org.label-schema.vcs-ref=${{ github.sha }} | |
org.label-schema.vcs-url=${{ github.event.repository.clone_url }} | |
- name: Pull Base Docker image | |
if: github.event_name != 'pull_request' | |
run: | | |
docker pull ardupilot/ardupilot-dev-base:${{ steps.prep.outputs.version }} | |
docker tag ardupilot/ardupilot-dev-base:${{ steps.prep.outputs.version }} ardupilot/ardupilot-dev-base:latest | |
# Only push if it comes from tagging | |
- name: Build ardupilot-dev-${{matrix.config}} images | |
uses: docker/build-push-action@v5 | |
with: | |
context: ./ | |
file: docker/Dockerfile_dev-${{matrix.config}} | |
tags: ${{ steps.prep.outputs.tags }} | |
push: ${{ github.event_name != 'pull_request' }} | |
build-args: "TAG=${{ steps.prep.outputs.version }}" | |
pull: false | |
labels: | | |
org.opencontainers.image.title=${{ steps.prep.outputs.img_name }} | |
org.opencontainers.image.description=${{ github.event.repository.name }} | |
org.opencontainers.image.url=${{ github.event.repository.html_url }} | |
org.opencontainers.image.source=${{ github.event.repository.clone_url }} | |
org.opencontainers.image.version=${{ steps.prep.outputs.version }} | |
org.opencontainers.image.created=${{ steps.prep.outputs.created }} | |
org.opencontainers.image.revision=${{ github.sha }} | |
org.opencontainers.image.licenses=${{ github.event.repository.license.spdx_id }} | |
org.label-schema.vcs-ref=${{ github.sha }} | |
org.label-schema.vcs-url=${{ github.event.repository.clone_url }} | |
# those need images from config, so we build them on second step | |
build-sub-images: | |
needs: build-main-images | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false # don't cancel if a job from the matrix fails | |
matrix: | |
config: [ | |
#chibios-clang, | |
armhf-musl, | |
periph | |
] | |
steps: | |
# git checkout the PR | |
- uses: actions/checkout@v4 | |
- name: Login to DockerHub | |
if: github.event_name != 'pull_request' | |
uses: docker/login-action@v3 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
- | |
name: Prepare | |
id: prep | |
run: | | |
DOCKER_IMAGE=ardupilot/ardupilot-dev-${{matrix.config}} | |
DOCKER_IMAGE_BASE=ardupilot/ardupilot-dev-base | |
VERSION=noop | |
if [ "${{ github.event_name }}" = "schedule" ]; then | |
VERSION=nightly | |
elif [[ $GITHUB_REF == refs/tags/* ]]; then | |
VERSION=${GITHUB_REF#refs/tags/} | |
elif [[ $GITHUB_REF == refs/heads/* ]]; then | |
VERSION=$(echo ${GITHUB_REF#refs/heads/} | sed -r 's#/+#-#g') | |
if [ "${{ github.event.repository.default_branch }}" = "$VERSION" ]; then | |
VERSION=edge | |
fi | |
elif [[ $GITHUB_REF == refs/pull/* ]]; then | |
VERSION=pr-${{ github.event.number }} | |
fi | |
TAGS="${DOCKER_IMAGE}:${VERSION}" | |
TAGS_BASE="${DOCKER_IMAGE_BASE}:${VERSION}" | |
if [[ $VERSION =~ ^v[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then | |
MINOR=${VERSION%.*} | |
MAJOR=${MINOR%.*} | |
TAGS="$TAGS,${DOCKER_IMAGE}:${MINOR},${DOCKER_IMAGE}:${MAJOR}" | |
TAGS_BASE="$TAGS_BASE,${DOCKER_IMAGE_BASE}:${MINOR},${DOCKER_IMAGE_BASE}:${MAJOR}" | |
elif [ "${{ github.event_name }}" = "push" ]; then | |
TAGS="$TAGS,${DOCKER_IMAGE}:sha-${GITHUB_SHA::8}" | |
TAGS_BASE="$TAGS_BASE,${DOCKER_IMAGE_BASE}:sha-${GITHUB_SHA::8}" | |
fi | |
echo "img_name=${DOCKER_IMAGE}" >> $GITHUB_OUTPUT | |
echo "version=${VERSION}" >> $GITHUB_OUTPUT | |
echo "tags=${TAGS}" >> $GITHUB_OUTPUT | |
echo "tags_base=${TAGS_BASE}" >> $GITHUB_OUTPUT | |
echo "created=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT | |
- name: ReBuild ardupilot-dev-base image from cache | |
if: github.event_name == 'pull_request' | |
uses: docker/build-push-action@v5 | |
with: | |
context: ./ | |
file: docker/Dockerfile_dev-base | |
tags: ardupilot/ardupilot-dev-base:${{ steps.prep.outputs.version }},ardupilot/ardupilot-dev-base:latest | |
push: false | |
load: true | |
labels: | | |
org.opencontainers.image.title=${{ steps.prep.outputs.img_name }} | |
org.opencontainers.image.description=${{ github.event.repository.name }} | |
org.opencontainers.image.url=${{ github.event.repository.html_url }} | |
org.opencontainers.image.source=${{ github.event.repository.clone_url }} | |
org.opencontainers.image.version=${{ steps.prep.outputs.version }} | |
org.opencontainers.image.created=${{ steps.prep.outputs.created }} | |
org.opencontainers.image.revision=${{ github.sha }} | |
org.opencontainers.image.licenses=${{ github.event.repository.license.spdx_id }} | |
org.label-schema.vcs-ref=${{ github.sha }} | |
org.label-schema.vcs-url=${{ github.event.repository.clone_url }} | |
- name: ReBuild ardupilot-dev-armhf image from cache | |
if: github.event_name == 'pull_request' && ${{matrix.config}} == "armhf-musl" | |
uses: docker/build-push-action@v5 | |
with: | |
context: ./ | |
file: docker/Dockerfile_dev-armhf | |
tags: ardupilot/ardupilot-dev-armhf:${{ steps.prep.outputs.version }},ardupilot/ardupilot-dev-armhf:latest | |
build-args: "TAG=${{ steps.prep.outputs.version }}" | |
push: false | |
load: true | |
labels: | | |
org.opencontainers.image.title=${{ steps.prep.outputs.img_name }} | |
org.opencontainers.image.description=${{ github.event.repository.name }} | |
org.opencontainers.image.url=${{ github.event.repository.html_url }} | |
org.opencontainers.image.source=${{ github.event.repository.clone_url }} | |
org.opencontainers.image.version=${{ steps.prep.outputs.version }} | |
org.opencontainers.image.created=${{ steps.prep.outputs.created }} | |
org.opencontainers.image.revision=${{ github.sha }} | |
org.opencontainers.image.licenses=${{ github.event.repository.license.spdx_id }} | |
org.label-schema.vcs-ref=${{ github.sha }} | |
org.label-schema.vcs-url=${{ github.event.repository.clone_url }} | |
- name: ReBuild ardupilot-dev-coverage image from cache | |
if: github.event_name == 'pull_request' && ${{matrix.config}} == "periph" | |
uses: docker/build-push-action@v5 | |
with: | |
context: ./ | |
file: docker/Dockerfile_dev-coverage | |
tags: ardupilot/ardupilot-dev-coverage:${{ steps.prep.outputs.version }},ardupilot/ardupilot-dev-coverage:latest | |
build-args: "TAG=${{ steps.prep.outputs.version }}" | |
push: false | |
load: true | |
labels: | | |
org.opencontainers.image.title=${{ steps.prep.outputs.img_name }} | |
org.opencontainers.image.description=${{ github.event.repository.name }} | |
org.opencontainers.image.url=${{ github.event.repository.html_url }} | |
org.opencontainers.image.source=${{ github.event.repository.clone_url }} | |
org.opencontainers.image.version=${{ steps.prep.outputs.version }} | |
org.opencontainers.image.created=${{ steps.prep.outputs.created }} | |
org.opencontainers.image.revision=${{ github.sha }} | |
org.opencontainers.image.licenses=${{ github.event.repository.license.spdx_id }} | |
org.label-schema.vcs-ref=${{ github.sha }} | |
org.label-schema.vcs-url=${{ github.event.repository.clone_url }} | |
- name: Pull Base Docker image | |
if: github.event_name != 'pull_request' && ${{matrix.config}} == "armhf-musl" | |
run: | | |
docker pull ardupilot/ardupilot-dev-armhf:${{ steps.prep.outputs.version }} | |
docker tag ardupilot/ardupilot-dev-armhf:${{ steps.prep.outputs.version }} ardupilot/ardupilot-dev-armhf:latest | |
- name: Pull Base Docker image | |
if: github.event_name != 'pull_request' && ${{matrix.config}} == "periph" | |
run: | | |
docker pull ardupilot/ardupilot-dev-coverage:${{ steps.prep.outputs.version }} | |
docker tag ardupilot/ardupilot-dev-coverage:${{ steps.prep.outputs.version }} ardupilot/ardupilot-dev-coverage:latest | |
# Only push if it comes from tagging | |
- name: Build ardupilot-dev-${{matrix.config}} images | |
uses: docker/build-push-action@v4 | |
with: | |
context: ./ | |
file: docker/Dockerfile_dev-${{matrix.config}} | |
tags: ${{ steps.prep.outputs.tags }} | |
build-args: "TAG=${{ steps.prep.outputs.version }}" | |
push: ${{ github.event_name != 'pull_request' }} | |
pull: false | |
labels: | | |
org.opencontainers.image.title=${{ steps.prep.outputs.img_name }} | |
org.opencontainers.image.description=${{ github.event.repository.name }} | |
org.opencontainers.image.url=${{ github.event.repository.html_url }} | |
org.opencontainers.image.source=${{ github.event.repository.clone_url }} | |
org.opencontainers.image.version=${{ steps.prep.outputs.version }} | |
org.opencontainers.image.created=${{ steps.prep.outputs.created }} | |
org.opencontainers.image.revision=${{ github.sha }} | |
org.opencontainers.image.licenses=${{ github.event.repository.license.spdx_id }} | |
org.label-schema.vcs-ref=${{ github.sha }} | |
org.label-schema.vcs-url=${{ github.event.repository.clone_url }} |