Merge pull request #24 from aillwee/charles-dev

Stale action + updates from public repo (docker).
This commit is contained in:
Mike Brady
2021-07-19 20:35:06 +01:00
committed by GitHub
11 changed files with 292 additions and 28 deletions
+1 -1
View File
@@ -1 +1 @@
custom: [paypal.me/UMBr]
custom: [paypal.me/UMBr]
@@ -0,0 +1,70 @@
# Builds & pushes a docker image when a release occurs.
# The following tags are created:
# 'latest' & 'latest-airplay1'
# '[RELEASE TAG]' & '[RELEASE TAG]-airplay1'
name: Build and push docker images on releases.
on:
release:
types: [ ]
env:
DOCKER_PLATFORMS: linux/386,linux/amd64,linux/arm/v6,linux/arm64,linux/arm/v7
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set SHAIRPORT_SYNC_BRANCH env.
run: echo "SHAIRPORT_SYNC_BRANCH=${GITHUB_REF##*/}" >> $GITHUB_ENV
- name: Determine NQPTP env (part 1).
if: ${{ env.SHAIRPORT_SYNC_BRANCH == 'development' }}
run: echo "NQPTP_BRANCH=development" >> $GITHUB_ENV
- name: Determine NQPTP env (part 2).
if: ${{ env.SHAIRPORT_SYNC_BRANCH != 'development' }}
run: echo "NQPTP_BRANCH=main" >> $GITHUB_ENV
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Docker Registry
uses: docker/login-action@v1
with:
registry: ${{ secrets.DOCKER_REGISTRY }}
username: ${{ secrets.DOCKER_REGISTRY_USER }}
password: ${{ secrets.DOCKER_REGISTRY_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v2
with:
context: ./
file: ./docker/Dockerfile
platforms: ${{ env.PLATFORMS }}
push: true
tags: ${{ secrets.DOCKER_IMAGE_NAME }}:latest ${{ secrets.DOCKER_IMAGE_NAME }}:${{ github.event.release.tag_name }}
build-args: |
SHAIRPORT_SYNC_BRANCH=${{ env.SHAIRPORT_SYNC_BRANCH }}
NQPTP_BRANCH=${{ env.NQPTP_BRANCH }}
- name: Build and push (AirPlay 1)
uses: docker/build-push-action@v2
with:
context: ./
file: ./docker/airplay1/Dockerfile-AirPlay1
platforms: ${{ env.PLATFORMS }}
push: true
tags: ${{ secrets.DOCKER_IMAGE_NAME }}:latest-airplay1, ${{ secrets.DOCKER_IMAGE_NAME }}:${{ github.event.release.tag_name }}-airplay1
build-args: |
SHAIRPORT_SYNC_BRANCH=${{ env.SHAIRPORT_SYNC_BRANCH }}
+35 -11
View File
@@ -1,11 +1,15 @@
# Pushes to tag 'unstable-BRANCH'.
# Releases are pushed to latest and tagged - see docker-build-releases.yaml.
# Builds & pushes a docker image when a commit is made to one of the branches specified below.
# Tag pattern: 'unstable-[BRANCH NAME]' & 'unstable-[BRANCH NAME]-airplay1'
# See docker-build-releases.yaml for release build process.
name: Build and push docker image based on specified branches.
name: Build and push docker image based on commit to specified branches.
on:
push:
branches: [ master, development, charles-dev ]
env:
DOCKER_PLATFORMS: linux/386,linux/amd64,linux/arm/v6,linux/arm64,linux/arm/v7
jobs:
main:
@@ -15,30 +19,50 @@ jobs:
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set SHAIRPORT_SYNC_BRANCH env.
run: echo "SHAIRPORT_SYNC_BRANCH=${GITHUB_REF##*/}" >> $GITHUB_ENV
- name: Set up ssh agent
uses: webfactory/ssh-agent@v0.5.2 # Can be removed when no longer pulling from private repos.
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Determine NQPTP env (part 1).
if: ${{ env.SHAIRPORT_SYNC_BRANCH == 'development' }}
run: echo "NQPTP_BRANCH=development" >> $GITHUB_ENV
- name: Determine NQPTP env (part 2).
if: ${{ env.SHAIRPORT_SYNC_BRANCH != 'development' }}
run: echo "NQPTP_BRANCH=main" >> $GITHUB_ENV
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Docker Registry
uses: docker/login-action@v1
with:
registry: registry.nova.do
registry: ${{ secrets.DOCKER_REGISTRY }}
username: ${{ secrets.DOCKER_REGISTRY_USER }}
password: ${{ secrets.DOCKER_REGISTRY_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v2
with:
context: ./
file: ./docker/Dockerfile
platforms: linux/386,linux/amd64,linux/arm/v6,linux/arm64,linux/arm/v7
platforms: ${{ env.DOCKER_PLATFORMS }}
push: true
tags: registry.nova.do/shairport-sync:unstable-${{ env.SHAIRPORT_SYNC_BRANCH }}
tags: ${{ secrets.DOCKER_IMAGE_NAME }}:unstable-${{ env.SHAIRPORT_SYNC_BRANCH }}
build-args: |
SHAIRPORT_SYNC_BRANCH=${{ env.SHAIRPORT_SYNC_BRANCH }}
ssh: default=${{ env.SSH_AUTH_SOCK }} # Can be removed when no longer pulling from private repos.
NQPTP_BRANCH=${{ env.NQPTP_BRANCH }}
- name: Build and push (AirPlay 1)
uses: docker/build-push-action@v2
with:
context: ./
file: ./docker/airplay1/Dockerfile
platforms: ${{ env.DOCKER_PLATFORMS }}
push: true
tags: ${{ secrets.DOCKER_IMAGE_NAME }}:unstable-${{ env.SHAIRPORT_SYNC_BRANCH }}-airplay1
build-args: |
SHAIRPORT_SYNC_BRANCH=${{ env.SHAIRPORT_SYNC_BRANCH }}
+20
View File
@@ -0,0 +1,20 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '0 0 * * *'
permissions:
issues: write
pull-requests: write
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v4
with:
stale-issue-message: 'This issue has been inactive for 60 days so will be closed 7 days from now. To prevent this, please remove the "stale" label or post a comment.'
stale-pr-message: 'This PR has been inactive for 60 days so will be closed 7 days from now. To prevent this, please remove the "stale" label or post a comment.'
# These are the defaults at the time of writing. https://github.com/marketplace/actions/close-stale-issues
# days-before-stale: 60
# days-before-close: 7
+7 -10
View File
@@ -43,22 +43,21 @@ RUN make install
# Shairport Sync Build System:
FROM builder-base AS builder-sps
# This will be modified by the Github Action Workflow and is required
# to ensure the correct branch is being used.
# These will be modified by the Github Action Workflow and are required
# to ensure the correct branches are being used.
ARG SHAIRPORT_SYNC_BRANCH
RUN test -n "$SHAIRPORT_SYNC_BRANCH"
ARG NQPTP_BRANCH
RUN test -n "$NQPTP_BRANCH"
COPY --from=builder-alac /usr/local/lib/libalac.* /usr/local/lib/
COPY --from=builder-alac /usr/local/lib/pkgconfig/alac.pc /usr/local/lib/pkgconfig/alac.pc
COPY --from=builder-alac /usr/local/include /usr/local/include
# TODO: Remove when no longer pulling from private repos.
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
RUN --mount=type=ssh git clone git@github.com:mikebrady/nqptp.git
RUN git clone https://github.com/mikebrady/nqptp
WORKDIR /nqptp
# Use development branch for now.
RUN git checkout development
RUN git checkout "$NQPTP_BRANCH"
RUN autoreconf -fi
RUN ./configure
RUN make
@@ -67,9 +66,7 @@ WORKDIR /
WORKDIR /shairport-sync
COPY . .
RUN git checkout $SHAIRPORT_SYNC_BRANCH
RUN git submodule init
RUN git submodule update
RUN git checkout "$SHAIRPORT_SYNC_BRANCH"
RUN autoreconf -fi
# RUN ./configure \
# --with-alsa \
+38 -3
View File
@@ -2,11 +2,46 @@
Available at: https://hub.docker.com/r/mikebrady/shairport-sync
## Example Docker Compose File
See the `docker-compose.yaml` file in this folder for an example.
## Basic Usage
```
$ docker run -d --restart unless-stopped --net host --device /dev/snd \
mikebrady/shairport-sync
```
The above command will run Shairport Sync as a daemon in a Docker container, accessing the computer's ALSA audio infrastructure. It will send audio to the default output device and make no use of any hardware mixers the default device might have. The AirPlay service name will be the host's `hostname` with the first letter capitalised, e.g. `Ubuntu`.
## Options
Any options you add to the command above will be passed to Shairport Sync. Here is an example:
```
$ docker run -d --restart unless-stopped --net host --device /dev/snd \
mikebrady/shairport-sync -a DenSystem -- -d hw:0 -c PCM
```
This will sent audio to alsa hardware device `hw:0` and make use of the that device's mixer control called `PCM`. The service will be visible as `DenSystem` on the network.
## Configuration File
Edit the configuration file `/etc/shairport-sync.conf` in the container (or use the `-v` option to mirror an external copy of `shairport-sync.conf` in to `/etc/shairport-sync.conf`) to get access to the full range of configuration options.
## Build Example (for arm7 devices)
TODO: remove `--ssh` when going public as this is only for private repos.
```
docker buildx build --ssh default=$SSH_AUTH_SOCK --platform linux/arm/v7 -f ./docker/Dockerfile --build-arg SHAIRPORT_SYNC_BRANCH=development -t registry.nova.do/shairport-sync:unstable-development .
docker buildx build --platform linux/arm/v7 -f ./docker/Dockerfile --build-arg SHAIRPORT_SYNC_BRANCH=development --build-arg NQPTP_BRANCH=development -t shairport-sync:unstable-development .
```
`SHAIRPORT_SYNC_BRANCH` is required to ensure the image is built using the expected branch.
`SHAIRPORT_SYNC_BRANCH` is required to ensure the image is built using the expected branch.
## AirPlay 1 Only
The AirPlay1 only dockerfile is in the `airplay1` folder. This also includes the `start.sh` script used by the container. Please note that the AirPlay 1 image build via the AirPlay 2 branch does not work with multiple instances on the same hardware.
## GitHub Action Builds
Requires the following secrets to be set in the repo:
- `DOCKER_REGISTRY` - docker.io if using Docker Hub, else set to your registry URL.
- `DOCKER_REGISTRY_TOKEN` - Access token for your registry.
- `DOCKER_REGISTRY_USER` - Login user for your registry.
- `DOCKER_IMAGE_NAME` - The name of the image, for example `your-registry.com/shairport-sync` or just `your-username/shairport-sync` if using Docker Hub.
+103
View File
@@ -0,0 +1,103 @@
FROM alpine:3.12 AS builder-base
# General Build System:
RUN apk -U add \
git \
build-base \
autoconf \
automake \
libtool \
dbus \
su-exec \
alsa-lib-dev \
libdaemon-dev \
popt-dev \
mbedtls-dev \
soxr-dev \
avahi-dev \
libconfig-dev \
libsndfile-dev \
mosquitto-dev \
xmltoman
# ALAC Build System:
FROM builder-base AS builder-alac
RUN git clone https://github.com/mikebrady/alac
WORKDIR alac
RUN autoreconf -fi
RUN ./configure
RUN make
RUN make install
# Shairport Sync Build System:
FROM builder-base AS builder-sps
# This will be modified by the Github Action Workflow and is required
# to ensure the correct branch is being used.
ARG SHAIRPORT_SYNC_BRANCH
RUN test -n "$SHAIRPORT_SYNC_BRANCH"
COPY --from=builder-alac /usr/local/lib/libalac.* /usr/local/lib/
COPY --from=builder-alac /usr/local/lib/pkgconfig/alac.pc /usr/local/lib/pkgconfig/alac.pc
COPY --from=builder-alac /usr/local/include /usr/local/include
WORKDIR shairport-sync
COPY . .
RUN git checkout "$SHAIRPORT_SYNC_BRANCH"
RUN autoreconf -fi
RUN ./configure \
--with-alsa \
--with-dummy \
--with-pipe \
--with-stdout \
--with-avahi \
--with-ssl=mbedtls \
--with-soxr \
--sysconfdir=/etc \
--with-dbus-interface \
--with-mpris-interface \
--with-mqtt-client \
--with-apple-alac \
--with-convolution
RUN make -j $(nproc)
RUN make install
# Shairport Sync Runtime System:
FROM alpine:3.12
RUN apk -U add \
alsa-lib \
dbus \
popt \
glib \
mbedtls \
soxr \
avahi \
libconfig \
libsndfile \
mosquitto-libs \
su-exec \
libgcc \
libgc++
RUN rm -rf /lib/apk/db/*
COPY --from=builder-alac /usr/local/lib/libalac.* /usr/local/lib/
COPY --from=builder-sps /etc/shairport-sync* /etc/
COPY --from=builder-sps /etc/dbus-1/system.d/shairport-sync-dbus.conf /etc/dbus-1/system.d/
COPY --from=builder-sps /etc/dbus-1/system.d/shairport-sync-mpris.conf /etc/dbus-1/system.d/
COPY --from=builder-sps /usr/local/bin/shairport-sync /usr/local/bin/shairport-sync
# Create non-root user for running the container -- running as the user 'shairport-sync' also allows
# Shairport Sync to provide the D-Bus and MPRIS interfaces within the container
RUN addgroup shairport-sync
RUN adduser -D shairport-sync -G shairport-sync
# Add the shairport-sync user to the pre-existing audio group, which has ID 29, for access to the ALSA stuff
RUN addgroup -g 29 docker_audio && addgroup shairport-sync docker_audio
COPY ./docker/airplay1/start.sh /
RUN chmod +x /start.sh
ENTRYPOINT [ "/start.sh" ]
+3
View File
@@ -0,0 +1,3 @@
# AirPlay 1 Only Docker Image
See the [Shairport Sync Docker Hub Repo](https://hub.docker.com/r/mikebrady/shairport-sync) for available tags.
+13
View File
@@ -0,0 +1,13 @@
#!/bin/sh
set -e
rm -rf /var/run/dbus.pid
#mkdir -p /var/run/dbus
dbus-uuidgen --ensure
dbus-daemon --system
avahi-daemon --daemonize --no-chroot
su-exec shairport-sync shairport-sync $@
+1 -2
View File
@@ -1,9 +1,8 @@
# Example docker compose config.
version: "3.8"
services:
shairport-sync:
image: registry.nova.do/shairport-sync:unstable-development
image: mikebrady/shairport-sync:unstable-development
network_mode: host
restart: unless-stopped
devices:
+1 -1
View File
@@ -10,7 +10,7 @@ dbus-daemon --system
avahi-daemon --daemonize --no-chroot
# TODO: This should probably be implemented in a better way and using the correct nqptp group.
# TODO: This should probably be implemented in a better way.
nqptp &
# su-exec shairport-sync shairport-sync $@