name: Docker Build and Publish on: push: branches: [main] paths: - '**/*.py' - 'pyproject.toml' - 'uv.lock' - 'Dockerfile' - 'docker/**' - '.github/workflows/docker-publish.yml' release: types: [published] permissions: contents: read concurrency: group: docker-${{ github.ref }} cancel-in-progress: true jobs: build-and-push: # Only run on the upstream repository, not on forks if: github.repository == 'NousResearch/hermes-agent' runs-on: ubuntu-latest timeout-minutes: 60 steps: - name: Checkout code uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 with: submodules: recursive - name: Set up QEMU uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 # Build amd64 only so we can `load` the image for smoke testing. # `load: true` cannot export a multi-arch manifest to the local daemon. # The multi-arch build follows on push to main / release. - name: Build image (amd64, smoke test) uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 with: context: . file: Dockerfile load: true platforms: linux/amd64 tags: nousresearch/hermes-agent:test cache-from: type=gha cache-to: type=gha,mode=max - name: Test image starts run: | # The image runs as the hermes user (UID 10000). GitHub Actions # creates /tmp/hermes-test root-owned by default, which hermes # can't write to — chown it to match the in-container UID before # bind-mounting. Real users doing `docker run -v ~/.hermes:...` # with their own UID hit the same issue and have their own # remediations (HERMES_UID env var, or chown locally). mkdir -p /tmp/hermes-test sudo chown -R 10000:10000 /tmp/hermes-test docker run --rm \ -v /tmp/hermes-test:/opt/data \ --entrypoint /opt/hermes/docker/entrypoint.sh \ nousresearch/hermes-agent:test --help - name: Log in to Docker Hub if: github.event_name == 'push' && github.ref == 'refs/heads/main' || github.event_name == 'release' uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Push multi-arch image (main branch) if: github.event_name == 'push' && github.ref == 'refs/heads/main' uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 with: context: . file: Dockerfile push: true platforms: linux/amd64,linux/arm64 tags: nousresearch/hermes-agent:latest cache-from: type=gha cache-to: type=gha,mode=max - name: Push multi-arch image (release) if: github.event_name == 'release' uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 with: context: . file: Dockerfile push: true platforms: linux/amd64,linux/arm64 tags: nousresearch/hermes-agent:${{ github.event.release.tag_name }} cache-from: type=gha cache-to: type=gha,mode=max