diff --git a/.github/workflows/builder.yml b/.github/workflows/builder.yml deleted file mode 100644 index 60b0fb48..00000000 --- a/.github/workflows/builder.yml +++ /dev/null @@ -1,59 +0,0 @@ -# https://github.com/home-assistant/builder -name: 'Builder' - -on: - push: - tags: [ 'v*' ] - workflow_dispatch: - -jobs: - hassio: - name: Hassio Addon - runs-on: ubuntu-latest - steps: - - name: Checkout the repository - uses: actions/checkout@v3 - - - name: Login to DockerHub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Branch name - run: | - VERSION="${GITHUB_REF#refs/tags/v}" - echo "REPO=alexxit/go2rtc" >> $GITHUB_ENV - echo "TAG=${VERSION}" >> $GITHUB_ENV - echo "IMAGE=alexxit/go2rtc:${VERSION}" >> $GITHUB_ENV - - - name: Build amd64 - uses: home-assistant/builder@master - with: - args: --amd64 --target build/hassio --version $TAG-amd64 --no-latest --docker-hub-check - - - name: Build i386 - uses: home-assistant/builder@master - with: - args: --i386 --target build/hassio --version $TAG-i386 --no-latest --docker-hub-check - - - name: Build aarch64 - uses: home-assistant/builder@master - with: - args: --aarch64 --target build/hassio --version $TAG-aarch64 --no-latest --docker-hub-check - - - name: Build armv7 - uses: home-assistant/builder@master - with: - args: --armv7 --target build/hassio --version $TAG-armv7 --no-latest --docker-hub-check - - - name: Docker manifest - run: | - # thanks to https://github.com/aler9/rtsp-simple-server/blob/main/Makefile - docker manifest create "${IMAGE}" \ - "${IMAGE}-amd64" "${IMAGE}-i386" "${IMAGE}-aarch64" "${IMAGE}-armv7" - docker manifest push "${IMAGE}" - - docker manifest create "${REPO}:latest" \ - "${IMAGE}-amd64" "${IMAGE}-i386" "${IMAGE}-aarch64" "${IMAGE}-armv7" - docker manifest push "${REPO}:latest" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..de602701 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,55 @@ +name: ci + +on: + workflow_dispatch: + push: + branches: + - 'master' + tags: + - 'v*' + pull_request: + branches: + - 'master' + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v4 + with: + images: alexxit/go2rtc + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to DockerHub + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: . + platforms: | + linux/amd64 + linux/386 + linux/arm/v7 + linux/arm64/v8 + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..aa148243 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,57 @@ +# https://hub.docker.com/_/python/tags?page=1&name=-alpine +ARG PYTHON_VERSION="3.10.8" +# https://hub.docker.com/_/golang/tags?page=1&name=-alpine +ARG GO_VERSION="1.19.3" +# https://hub.docker.com/r/ngrok/ngrok/tags?page=1&name=-alpine +ARG NGROK_VERSION="3.1.0" + + +FROM python:${PYTHON_VERSION}-alpine AS base + + +FROM golang:${GO_VERSION}-alpine AS go + + +FROM ngrok/ngrok:${NGROK_VERSION}-alpine AS ngrok + + +# Build go2rtc binary +FROM go AS build + +WORKDIR /workspace + +# Cache dependencies +COPY go.mod go.sum ./ +RUN go mod download + +# Build binary +COPY cmd cmd +COPY pkg pkg +COPY www www +COPY main.go . +RUN CGO_ENABLED=0 go build -ldflags "-s -w" -trimpath + +RUN mkdir -p /config + +# Collect all files +FROM scratch AS rootfs + +COPY --from=build /workspace/go2rtc /usr/local/bin/ +# Ensure an empty /config folder exists so that the container can be run without a volume +COPY --from=build /config /config +COPY --from=ngrok /bin/ngrok /usr/local/bin/ +COPY ./docker/run.sh /run.sh + + +# Final image +FROM base + +# Install ffmpeg, bash (for run.sh), tini (for signal handling), +# and other common tools for the echo source. +RUN apk add --no-cache ffmpeg bash tini curl jq + +COPY --from=rootfs / / + +ENTRYPOINT ["/sbin/tini", "--"] + +CMD ["/run.sh"] diff --git a/build/hassio/Dockerfile b/build/hassio/Dockerfile deleted file mode 100644 index 312909f0..00000000 --- a/build/hassio/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -ARG BUILD_FROM - -FROM $BUILD_FROM as build - -# 1. Build go2rtc -RUN apk add --no-cache git go - -RUN git clone https://github.com/AlexxIT/go2rtc \ - && cd go2rtc \ - && CGO_ENABLED=0 go build -ldflags "-s -w" -trimpath - -# 2. Download ngrok -ARG BUILD_ARCH - -# https://github.com/home-assistant/docker-base/blob/master/alpine/Dockerfile -RUN if [ "${BUILD_ARCH}" = "aarch64" ]; then BUILD_ARCH="arm64"; \ - elif [ "${BUILD_ARCH}" = "armv7" ]; then BUILD_ARCH="arm"; fi \ - && cd go2rtc \ - && curl $(curl -s "https://raw.githubusercontent.com/ngrok/docker-ngrok/main/releases.json" | jq -r ".${BUILD_ARCH}.url") -o ngrok.zip \ - && unzip ngrok - - - -# https://devopscube.com/reduce-docker-image-size/ -FROM $BUILD_FROM - -# 3. Copy go2rtc and ngrok to release -COPY --from=build /go2rtc/go2rtc /usr/local/bin -COPY --from=build /go2rtc/ngrok /usr/local/bin - -# 4. Install ffmpeg -# apk base OK: 22 MiB in 40 packages -# ffmpeg OK: 113 MiB in 110 packages -# python3 OK: 161 MiB in 114 packages -RUN apk add --no-cache ffmpeg python3 - -# 5. Copy run to release -COPY run.sh / -RUN chmod a+x /run.sh - -CMD [ "/run.sh" ] diff --git a/build/hassio/config.yaml b/build/hassio/config.yaml deleted file mode 100644 index 2447a06b..00000000 --- a/build/hassio/config.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# https://github.com/home-assistant/builder/blob/master/builder.sh -name: go2rtc -description: Ultimate camera streaming application -url: https://github.com/AlexxIT/go2rtc -image: alexxit/go2rtc -arch: [ amd64, aarch64, i386, armv7 ] \ No newline at end of file diff --git a/build/hassio/run.sh b/build/hassio/run.sh deleted file mode 100644 index d59564ca..00000000 --- a/build/hassio/run.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/with-contenv bashio - -set +e - -# set cwd for go2rtc (for config file, Hass integration, etc) -cd /config - -# add the feature to override go2rtc binary from Hass config folder -export PATH="/config:$PATH" - -while true; do - go2rtc - sleep 5 -done \ No newline at end of file diff --git a/docker/run.sh b/docker/run.sh new file mode 100755 index 00000000..f9211d17 --- /dev/null +++ b/docker/run.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# ============================================================================== +# Runs go2rtc +# ============================================================================== + +set -euo pipefail + +echo 'Starting go2rtc...' >&2 + +readonly config_path="/config" + +if [[ -x "${config_path}/go2rtc" ]]; then + readonly binary_path="${config_path}/go2rtc" + echo "Using go2rtc binary from '${binary_path}' instead of the embedded one" >&2 +else + readonly binary_path="/usr/local/bin/go2rtc" +fi + +# set cwd for go2rtc (for config file, Hass integration, etc) +cd "${config_path}" || echo "Could not change working directory to '${config_path}'" >&2 + +exec "${binary_path}"