diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 00000000..71eeb7a4 --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,54 @@ +name: Publish Docker image + +on: + push: + branches: [master, ci/docker-hub-publishing] + release: + types: [published] + +jobs: + push_to_registry: + name: Push Docker image to Docker Hub + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Check out the repo + uses: actions/checkout@v7 + + - name: Log in to Docker Hub + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: cproofdev/cproof + tags: | + type=raw,value=dev,enable-if-ref=refs/heads/master + type=sha,prefix=nightly-,enable-if-ref=refs/heads/master + type=ref,event=tag + type=raw,value=latest,enable-if-ref=refs/tags/* + + - name: Build and push Docker image + id: push + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: . + file: ./ci/Dockerfile + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + - name: Generate artifact attestation + uses: actions/attest@v4 + with: + subject-name: index.docker.io/cproofdev/cproof + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true diff --git a/ci/Dockerfile b/ci/Dockerfile new file mode 100644 index 00000000..bf91dac7 --- /dev/null +++ b/ci/Dockerfile @@ -0,0 +1,116 @@ +# ============================================================================= +# Stage 1: Build +# ============================================================================= +FROM ubuntu:26.04 AS builder + +ENV DEBIAN_FRONTEND=noninteractive + +# Build dependencies for full build (all features enabled) +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + autoconf \ + automake \ + autoconf-archive \ + libtool \ + pkg-config \ + git \ + wget \ + # Required dependencies + libglib2.0-dev \ + libcurl4-openssl-dev \ + libsqlite3-dev \ + libncursesw-dev \ + libreadline-dev \ + # Optional: notifications + libnotify-dev \ + # Optional: Python plugins + python3-dev \ + python3 \ + # Optional: PGP + libgpgme-dev \ + # Optional: OTR + libotr-dev \ + # Optional: GTK icons/clipboard + libgtk-3-dev \ + # Optional: GDK Pixbuf + libgdk-pixbuf-2.0-dev \ + # Optional: OMEMO + libsignal-protocol-c-dev \ + libgcrypt20-dev \ + # Optional: OMEMO QR code + libqrencode-dev \ + # Optional: xscreensaver + libxss-dev \ + # Test dependencies (needed for build verification) + libcmocka-dev \ + && rm -rf /var/lib/apt/lists/* + +# Build libstrophe from source (not available as Ubuntu package) +RUN git clone --depth 1 https://github.com/strophe/libstrophe.git /tmp/libstrophe \ + && cd /tmp/libstrophe \ + && autoreconf -i \ + && ./configure --prefix=/usr \ + && make -j$(nproc) \ + && make install \ + && rm -rf /tmp/libstrophe + +WORKDIR /src + +COPY . . + +RUN ./bootstrap.sh \ + && ./configure \ + --enable-notifications \ + --enable-icons-and-clipboard \ + --enable-otr \ + --enable-pgp \ + --enable-omemo \ + --enable-plugins \ + --enable-c-plugins \ + --enable-python-plugins \ + --with-xscreensaver \ + --enable-omemo-qrcode \ + --enable-gdk-pixbuf \ + && make -j$(nproc) \ + && make install + +# ============================================================================= +# Stage 2: Runtime (minimal) +# ============================================================================= +FROM ubuntu:26.04 + +ENV DEBIAN_FRONTEND=noninteractive + +# Runtime dependencies only (no build tools, no tests) +RUN apt-get update && apt-get install -y --no-install-recommends \ + # Required runtime + libglib2.0-0 \ + libcurl4 \ + libsqlite3-0 \ + libncursesw6 \ + libreadline8 \ + # Optional feature runtimes + libnotify4 \ + python3 \ + libgpgme11 \ + libotr5 \ + libgtk-3-0 \ + libgdk-pixbuf-2.0-0 \ + libsignal-protocol-c-2.0.0 \ + libgcrypt20 \ + libqrencode4 \ + libxss1 \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* \ + && apt-get clean + +# Copy installed files from builder stage +COPY --from=builder /usr/local/bin/profanity /usr/local/bin/profanity +COPY --from=builder /usr/local/lib/libprofanity* /usr/local/lib/ +COPY --from=builder /usr/local/include/profapi.h /usr/local/include/ +COPY --from=builder /usr/local/share/profanity /usr/local/share/profanity + +# Runtime config/data directory +RUN mkdir -p /root/.config/profanity + +ENTRYPOINT ["profanity"]