Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rework CI to ensure up-to-date containers prior to builds #256

Merged
merged 5 commits into from
Feb 20, 2024
Merged
Show file tree
Hide file tree
Changes from all 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
33 changes: 14 additions & 19 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,17 +1,9 @@
FROM ros:humble-ros-base-jammy

SHELL ["/bin/bash", "-c"]

# setup environment
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8

# install packages
RUN apt-get update \
&& apt-get install -q -y --no-install-recommends \
curl \
&& rm -rf /var/lib/apt/lists/*

ARG ROS_DISTRO=humble
ENV ROS_DISTRO $ROS_DISTRO
ARG INSTALL_PACKAGE=base
Expand All @@ -21,6 +13,7 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update -q && \
apt-get update -q && \
apt-get install -yq --no-install-recommends \
lcov \
curl \
python3-pip \
python-is-python3 \
python3-argcomplete \
Expand All @@ -36,15 +29,6 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update -q && \
# I added this
RUN source "/opt/ros/${ROS_DISTRO}/setup.bash"

# Spot packages
bhung-bdai marked this conversation as resolved.
Show resolved Hide resolved
RUN apt-get update -q && \
apt-get install -y --no-install-recommends \
ros-${ROS_DISTRO}-joint-state-publisher-gui \
ros-${ROS_DISTRO}-depth-image-proc \
ros-${ROS_DISTRO}-vision-msgs \
ros-${ROS_DISTRO}-interactive-markers && \
rm -rf /var/lib/apt/lists/*

# Install bosdyn_msgs package
RUN curl -sL https://github.com/bdaiinstitute/bosdyn_msgs/releases/download/v3.3.2-AMD64/ros-humble-bosdyn-msgs_3.3.2-0jammy_amd64.deb --output /tmp/ros-humble-bosdyn-msgs_3.3.2-0jammy_amd64.deb --silent \
&& dpkg -i /tmp/ros-humble-bosdyn-msgs_3.3.2-0jammy_amd64.deb \
Expand All @@ -55,15 +39,26 @@ RUN curl -sL https://github.com/bdaiinstitute/spot-cpp-sdk/releases/download/3.3
&& dpkg -i /tmp/spot-cpp-sdk_3.3.2_amd64.deb \
&& rm /tmp/spot-cpp-sdk_3.3.2_amd64.deb

# Install packages inside the new environment
# Install bosdyn_msgs missing dependencies
RUN python -m pip install --no-cache-dir --upgrade pip==22.3.1 \
&& pip install --root-user-action=ignore --no-cache-dir --default-timeout=900 \
numpy==1.24.1 \
bosdyn-client==3.3.2 \
bosdyn-mission==3.3.2 \
bosdyn-api==3.3.2 \
bosdyn-core==3.3.2 && \
bosdyn-core==3.3.2 \
pip cache purge

# Install spot_wrapper requirements
RUN --mount=type=bind,source=spot_wrapper,target=/tmp/context/spot_wrapper cd /tmp/context && \
pip install --root-user-action=ignore --no-cache-dir --default-timeout=900 -r spot_wrapper/requirements.txt && \
pip cache purge

# Install packages dependencies
RUN --mount=type=bind,source=.,target=/tmp/context \
apt-get update -q && rosdep update && \
rosdep install -y -i --from-paths /tmp/context --skip-keys "bosdyn bosdyn_msgs spot_wrapper" && \
rm -rf /var/lib/apt/lists/*

# ROS doesn't recognize the docker shells as terminals so force colored output
ENV RCUTILS_COLORIZED_OUTPUT=1
65 changes: 0 additions & 65 deletions .github/workflows/build_docker.yml

This file was deleted.

134 changes: 134 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
name: spot_ros2 CI

on:
pull_request:
push:
branches:
- main
workflow_call:
secrets:
CODECOV_TOKEN:
required: true

permissions:
contents: write

env:
# Use docker.io for Docker Hub if empty
REGISTRY: ghcr.io
# github.repository as <account>/<repo>
IMAGE_NAME: bdaiinstitute/spot_ros2_jammy_humble

defaults:
run:
shell: bash

jobs:
lint:
amessing-bdai marked this conversation as resolved.
Show resolved Hide resolved
name: Lint spot_ros2 packages
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- uses: actions/setup-python@v3
- name: Lint sources
uses: pre-commit/action@v3.0.0
prepare_container:
name: Prepare Humble container for tests
runs-on: ubuntu-latest
needs: lint
permissions:
contents: read
packages: write
# This is used to complete the identity challenge
# with sigstore/fulcio when running outside of PRs.
id-token: write
outputs:
image: ${{ fromJSON(steps.meta.outputs.json).tags[0] }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: recursive
- name: Setup Docker buildx # to workaround: https://github.com/docker/build-push-action/issues/461
uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf
- name: Log into registry ${{ env.REGISTRY }}
uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c # https://github.com/docker/login-action
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 # https://github.com/docker/metadata-action
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
id: meta
- name: Build and push Docker image (may be cached)
uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a # https://github.com/docker/build-push-action
with:
context: .
file: .devcontainer/Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
Comment on lines +74 to +75
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Layer caching will keep the cost of image re-builds at bay.

build_and_test_package_and_docs:
name: Build and test spot_ros2 packages
runs-on: ubuntu-latest
needs: prepare_container
container:
image: ${{ needs.prepare_container.outputs.image }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: recursive
path: src
- name: Build packages
run: |
source /opt/ros/$ROS_DISTRO/setup.bash
colcon build --symlink-install --packages-skip-regex proto2ros --cmake-args -DCMAKE_CXX_FLAGS="--coverage"
- name: Test packages
run: |
source install/setup.bash
colcon test --python-testing pytest --pytest-with-coverage --event-handlers console_direct+ --packages-skip-regex bdai_ros2_wrappers proto2ros
- name: Generate coverage report
run: lcov -c -d build/spot_driver/ -o coverage_spot_driver.info --include "*/spot_driver/*" --exclude "*/test/*"
- name: Upload python coverage to Coveralls
uses: coverallsapp/github-action@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
fail-on-error: true
flag-name: unittests-python
parallel: true
debug: true
files: $(find . -name "coverage.xml" -type f)
- name: Upload cpp coverage to Coveralls
uses: coverallsapp/github-action@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
fail-on-error: true
flag-name: unittests-cpp
debug: true
files: coverage_spot_driver.info
format: lcov
- name: Aggregate coverage
uses: coverallsapp/github-action@v2
with:
parallel-finished: true
carryforward: "unittests-python, unittests-cpp"
- name: Report on test results
run: colcon test-result --all --verbose
if: always()
- name: Build packages documentation
run: |
source /opt/ros/$ROS_DISTRO/setup.bash
pip install -r docs/requirements.txt
# go to documentation folder and build the .rst files
cd docs
# we don't use the --implicit-namespaces flag
sphinx-apidoc -f -o source/ ../ ../*setup* ../examples ../*launch.py ../*command_spot_driver.py
cd ..
sphinx-build docs _build -v
working-directory: ${{ github.workspace }}/src
26 changes: 26 additions & 0 deletions .github/workflows/maintenance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: spot_ros2 CI maintenance

on:
schedule:
- cron: "0 0 * * 0" # once a week

env:
ORG_NAME: bdaiinstitute
# github.repository as <account>/<repo>
IMAGE_NAME: spot_ros2_jammy_humble

jobs:
clean-ghcr:
name: Prune old images from Github Container Registry
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Necessary to prevent PR specific images from accumulating in the institute's container registry.

runs-on: ubuntu-latest
steps:
- name: Delete old pull request images
uses: snok/container-retention-policy@v2
with:
image-names: ${{ env.IMAGE_NAME }}
skip-tags: main
cut-off: One week ago UTC
org-name: ${{ env.ORG_NAME }}
account-type: org
token: ${{ secrets.GITHUB_TOKEN }}
token-type: github-token
84 changes: 0 additions & 84 deletions .github/workflows/test.yml

This file was deleted.

Loading
Loading