diff --git a/.github/workflows/build-gazebo-world-ws.yaml b/.github/workflows/build-gazebo-world-ws.yaml index a83c344c..680d9fd0 100644 --- a/.github/workflows/build-gazebo-world-ws.yaml +++ b/.github/workflows/build-gazebo-world-ws.yaml @@ -1,35 +1,68 @@ name: Build Docker Image for gazebo-world-ws on: - push: - branches: - - "main" - tags: - - v* - paths: - - .github/workflows/build-gazebo-world-ws.yaml - - gazebo_world_ws/docker/Dockerfile - - gazebo_world_ws/docker/.dockerignore - - gazebo_world_ws/docker/.bashrc + workflow_run: + workflows: ["Build Docker Image for template-ws"] + types: [completed] jobs: + paths-filter: + if: ${{ github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + outputs: + results: ${{ steps.filter.outputs.results }} + steps: + # Ref: https://github.com/dorny/paths-filter/issues/147#issuecomment-1287800590 + - name: Download a single artifact + uses: dawidd6/action-download-artifact@v7 + with: + workflow: build-template-ws.yaml + name: original-refs + workflow_conclusion: success + - name: set REF_BASE to env + run: | + echo "BASE=$(cat base.txt)" >> $GITHUB_ENV + echo "CURRENT_BRANCH=$(cat current-branch.txt)" >> $GITHUB_ENV + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: filter + with: + base: ${{ env.BASE }} + ref: ${{ env.CURRENT_BRANCH }} + filters: | + results: + - .github/workflows/build-gazebo-world-ws.yaml + - gazebo_world_ws/docker/Dockerfile + - gazebo_world_ws/docker/.dockerignore + - gazebo_world_ws/docker/.bashrc + - name: Changes matched + if: steps.filter.outputs.results == 'true' + run: echo "Changes matched, will build image" + - name: Changes didn't match + if: steps.filter.outputs.results != 'true' + run: echo "Changes didn't match, will NOT build image" docker: - if: github.repository == 'j3soon/ros2-essentials' + needs: paths-filter + if: ${{ needs.paths-filter.outputs.results == 'true' }} runs-on: ubuntu-latest steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - build-mount-path: /var/lib/docker/ - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - remove-codeql: 'true' - remove-docker-images: 'true' - - name: Restart docker - run: sudo service docker restart + # - name: Maximize build space + # uses: easimon/maximize-build-space@master + # with: + # build-mount-path: /var/lib/docker/ + # remove-dotnet: 'true' + # remove-android: 'true' + # remove-haskell: 'true' + # remove-codeql: 'true' + # remove-docker-images: 'true' + # - name: Restart docker + # run: sudo service docker restart - name: Checkout uses: actions/checkout@v3 + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 - # Ref: https://docs.github.com/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions#upgrading-a-workflow-that-accesses-a-registry-using-a-personal-access-token name: Prepare tag name as environment variable run: | @@ -42,6 +75,8 @@ jobs: # Output the environment variable # Ref: https://stackoverflow.com/a/57989070 echo "VERSION=$VERSION" >> $GITHUB_ENV + # Print for debugging purpose + echo "VERSION=$VERSION" - name: Docker meta id: meta # Ref: https://github.com/docker/metadata-action @@ -57,9 +92,24 @@ jobs: with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Pull j3soon/ros2-template-ws (amd64) + run: docker pull --platform linux/amd64 j3soon/ros2-template-ws + - name: Pull j3soon/ros2-template-ws (arm64) + run: docker pull --platform linux/arm64 j3soon/ros2-template-ws - name: Build and push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v6 with: context: gazebo_world_ws/docker + cache-from: | + ${{ secrets.DOCKERHUB_USERNAME }}/ros2-template-ws:buildcache-amd64 + ${{ secrets.DOCKERHUB_USERNAME }}/ros2-template-ws:buildcache-arm64 + platforms: linux/amd64 push: true tags: ${{ steps.meta.outputs.tags }} + - name: Push amd64 cache + uses: docker/build-push-action@v6 + with: + context: gazebo_world_ws/docker + cache-to: type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/ros2-gazebo-world-ws:buildcache-amd64,mode=max + platforms: linux/amd64 + tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/build-template-ws.yaml b/.github/workflows/build-template-ws.yaml index bc6963a1..7e1d3898 100644 --- a/.github/workflows/build-template-ws.yaml +++ b/.github/workflows/build-template-ws.yaml @@ -6,28 +6,61 @@ on: - "main" tags: - v* - paths: - - .github/workflows/build-template-ws.yaml - - template_ws/docker/Dockerfile - - template_ws/docker/.dockerignore - - template_ws/docker/.bashrc jobs: - docker: + paths-filter: if: github.repository == 'j3soon/ros2-essentials' runs-on: ubuntu-latest + outputs: + results: ${{ steps.filter.outputs.results }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - build-mount-path: /var/lib/docker/ - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - remove-codeql: 'true' - remove-docker-images: 'true' - - name: Restart docker - run: sudo service docker restart + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + results: + - .github/workflows/build-template-ws.yaml + - template_ws/docker/Dockerfile + - template_ws/docker/.dockerignore + - template_ws/docker/.bashrc + - name: Changes matched + if: steps.filter.outputs.results == 'true' + run: echo "Changes matched, will build image" + - name: Changes didn't match + if: steps.filter.outputs.results != 'true' + run: echo "Changes didn't match, will NOT build image" + # Ref: https://github.com/dorny/paths-filter/issues/147#issuecomment-1287800590 + - name: Save base ref info + run: | + BASE=${{ github.event.before }} + CURRENT_BRANCH=${{ github.ref }} + echo $BASE > base.txt + echo $CURRENT_BRANCH > current-branch.txt + - name: Upload base ref info + uses: actions/upload-artifact@v4 + with: + name: original-refs + path: | + base.txt + current-branch.txt + retention-days: 1 + docker: + needs: paths-filter + if: ${{ needs.paths-filter.outputs.results == 'true' }} + runs-on: ubuntu-latest + steps: + # - name: Maximize build space + # uses: easimon/maximize-build-space@master + # with: + # build-mount-path: /var/lib/docker/ + # remove-dotnet: 'true' + # remove-android: 'true' + # remove-haskell: 'true' + # remove-codeql: 'true' + # remove-docker-images: 'true' + # - name: Restart docker + # run: sudo service docker restart - name: Checkout uses: actions/checkout@v3 - name: Set up QEMU @@ -46,6 +79,8 @@ jobs: # Output the environment variable # Ref: https://stackoverflow.com/a/57989070 echo "VERSION=$VERSION" >> $GITHUB_ENV + # Print for debugging purpose + echo "VERSION=$VERSION" - name: Docker meta id: meta # Ref: https://github.com/docker/metadata-action @@ -62,9 +97,24 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v6 with: context: template_ws/docker platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta.outputs.tags }} + # Ref: https://github.com/docker/buildx/discussions/1382#discussioncomment-6252049 + - name: Push amd64 cache + uses: docker/build-push-action@v6 + with: + context: template_ws/docker + cache-to: type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/ros2-template-ws:buildcache-amd64,mode=max + platforms: linux/amd64 + tags: ${{ steps.meta.outputs.tags }} + - name: Push arm64 cache + uses: docker/build-push-action@v6 + with: + context: template_ws/docker + cache-to: type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/ros2-template-ws:buildcache-arm64,mode=max + platforms: linux/arm64 + tags: ${{ steps.meta.outputs.tags }} diff --git a/gazebo_world_ws/docker/Dockerfile b/gazebo_world_ws/docker/Dockerfile index 8b662bfc..2b0a7d9b 100644 --- a/gazebo_world_ws/docker/Dockerfile +++ b/gazebo_world_ws/docker/Dockerfile @@ -19,14 +19,14 @@ ARG USER_UID=1000 # Ref: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#example-cache-apt-packages RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache -# Upgrade packages -# Ref: https://pythonspeed.com/articles/security-updates-in-docker/ -# Ref: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#example-cache-apt-packages -# Ref: https://github.com/moby/buildkit/issues/1673#issuecomment-1264502398 -# Ref: https://github.com/moby/buildkit/issues/1673#issuecomment-1987107404 -RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ - apt-get update && apt-get upgrade -y \ - && rm -rf /var/lib/apt/lists/* +# # Upgrade packages +# # Ref: https://pythonspeed.com/articles/security-updates-in-docker/ +# # Ref: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#example-cache-apt-packages +# # Ref: https://github.com/moby/buildkit/issues/1673#issuecomment-1264502398 +# # Ref: https://github.com/moby/buildkit/issues/1673#issuecomment-1987107404 +# RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ +# apt-get update && apt-get upgrade -y \ +# && rm -rf /var/lib/apt/lists/* # Install sudo and create a user with sudo privileges # Ref: https://stackoverflow.com/a/65434659 @@ -53,85 +53,85 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ zip \ && rm -rf /var/lib/apt/lists/* -# Install Python pip -RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ - apt-get update && apt-get install -y \ - python3-pip \ - && rm -rf /var/lib/apt/lists/* - -# Install GUI debugging tools -# - `x11-apps` and `x11-utils` for `xeyes` and `xdpyinfo` -# Ref: https://packages.debian.org/sid/x11-apps -# Ref: https://packages.debian.org/sid/x11-utils -# - `mesa-utils` for `glxgears` and `glxinfo` -# Ref: https://wiki.debian.org/Mesa -# - `vulkan-tools` for `vkcube` and `vulkaninfo` -# Ref: https://docs.vulkan.org/tutorial/latest/02_Development_environment.html#_vulkan_packages -# Ref: https://gitlab.com/nvidia/container-images/vulkan/-/blob/master/docker/Dockerfile.ubuntu -RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ - apt-get update && apt-get install -y \ - x11-apps x11-utils \ - mesa-utils \ - libgl1 vulkan-tools \ - && rm -rf /var/lib/apt/lists/* - -# Setup the required capabilities for the container runtime -# Ref: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/docker-specialized.html#driver-capabilities -ENV NVIDIA_VISIBLE_DEVICES=all -ENV NVIDIA_DRIVER_CAPABILITIES=all - -# Install Vulkan config files -# Ref: https://gitlab.com/nvidia/container-images/vulkan -RUN cat > /etc/vulkan/icd.d/nvidia_icd.json < /etc/vulkan/icd.d/nvidia_icd.json < /etc/apt/apt.conf.d/keep-cache -# Upgrade packages -# Ref: https://pythonspeed.com/articles/security-updates-in-docker/ -# Ref: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#example-cache-apt-packages -# Ref: https://github.com/moby/buildkit/issues/1673#issuecomment-1264502398 -# Ref: https://github.com/moby/buildkit/issues/1673#issuecomment-1987107404 -RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ - apt-get update && apt-get upgrade -y \ - && rm -rf /var/lib/apt/lists/* +# # Upgrade packages +# # Ref: https://pythonspeed.com/articles/security-updates-in-docker/ +# # Ref: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#example-cache-apt-packages +# # Ref: https://github.com/moby/buildkit/issues/1673#issuecomment-1264502398 +# # Ref: https://github.com/moby/buildkit/issues/1673#issuecomment-1987107404 +# RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ +# apt-get update && apt-get upgrade -y \ +# && rm -rf /var/lib/apt/lists/* # Install sudo and create a user with sudo privileges # Ref: https://stackoverflow.com/a/65434659 @@ -51,85 +51,85 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ zip \ && rm -rf /var/lib/apt/lists/* -# Install Python pip -RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ - apt-get update && apt-get install -y \ - python3-pip \ - && rm -rf /var/lib/apt/lists/* - -# Install GUI debugging tools -# - `x11-apps` and `x11-utils` for `xeyes` and `xdpyinfo` -# Ref: https://packages.debian.org/sid/x11-apps -# Ref: https://packages.debian.org/sid/x11-utils -# - `mesa-utils` for `glxgears` and `glxinfo` -# Ref: https://wiki.debian.org/Mesa -# - `vulkan-tools` for `vkcube` and `vulkaninfo` -# Ref: https://docs.vulkan.org/tutorial/latest/02_Development_environment.html#_vulkan_packages -# Ref: https://gitlab.com/nvidia/container-images/vulkan/-/blob/master/docker/Dockerfile.ubuntu -RUN --mount=type=cache,target=/var/cache/apt,sharing=private \ - apt-get update && apt-get install -y \ - x11-apps x11-utils \ - mesa-utils \ - libgl1 vulkan-tools \ - && rm -rf /var/lib/apt/lists/* - -# Setup the required capabilities for the container runtime -# Ref: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/docker-specialized.html#driver-capabilities -ENV NVIDIA_VISIBLE_DEVICES=all -ENV NVIDIA_DRIVER_CAPABILITIES=all - -# Install Vulkan config files -# Ref: https://gitlab.com/nvidia/container-images/vulkan -RUN cat > /etc/vulkan/icd.d/nvidia_icd.json < /etc/vulkan/icd.d/nvidia_icd.json <