Skip to content

Commit

Permalink
Merge pull request #4 from samply/ci
Browse files Browse the repository at this point in the history
CI/CD: Docker build
  • Loading branch information
lablans authored Oct 6, 2023
2 parents 4ba160a + ef4d4db commit 4719cf7
Show file tree
Hide file tree
Showing 5 changed files with 253 additions and 0 deletions.
21 changes: 21 additions & 0 deletions .github/workflows/dockerhub_readme.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Update Docker Hub Readme
on:
push:
branches:
- main
jobs:
PushContainerReadme:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v2
- name: Sync Readme
uses: lablans/sync-dockerhub-readme@feature/replace-patterns
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD_REQUIRED_FOR_README_SYNC }}
repository: ${{ github.repository }}
readme: "./README.md"
replace_pattern: "](./"
replace_with: "](https://raw.githubusercontent.com/${{ github.repository }}/${{ github.ref_name }}/"
171 changes: 171 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
name: Build with rust and docker

on:
push:
workflow_dispatch:
pull_request:
schedule:
# Fetch new base image updates every night at 1am
- cron: '0 1 * * *'

env:
CARGO_TERM_COLOR: always
PROFILE: release

jobs:
pre-check:
name: Security, License Check
runs-on: ubuntu-22.04

steps:
- uses: actions/checkout@v3
- uses: EmbarkStudios/cargo-deny-action@v1

build-rust:
name: Build (Rust)
runs-on: ubuntu-22.04

strategy:
matrix:
arch:
- amd64
- arm64
# features:
# - ""

steps:
- name: Print matrix vars
run: |
echo "Arch: ${{ matrix.arch }}"
echo "Features: ${{ matrix.features }}"
- name: Set arch ${{ matrix.arch }}
env:
ARCH: ${{ matrix.arch }}
run: |
if [ "${ARCH}" == "arm64" ]; then
echo "rustarch=aarch64-unknown-linux-gnu" >> $GITHUB_ENV
elif [ "${ARCH}" == "amd64" ]; then
echo "rustarch=x86_64-unknown-linux-gnu" >> $GITHUB_ENV
else
exit 1
fi
if [ "$(dpkg --print-architecture)" != "${ARCH}" ]; then
echo "Cross-compiling to ${ARCH}."
echo "is_cross=true" >> $GITHUB_ENV
else
echo "Natively compiling to ${ARCH}."
echo "is_cross=false" >> $GITHUB_ENV
fi
- name: Set profile ${{ env.PROFILE }}
env:
PROFILE: ${{ env.PROFILE }}
run: |
if [ "${PROFILE}" == "release" ]; then
echo "profilestr=--release" >> $GITHUB_ENV
elif [ "${PROFILE}" == "debug" ]; then
echo "profilestr=" >> $GITHUB_ENV
else
echo "profilestr=--profile $PROFILE" >> $GITHUB_ENV
fi
- uses: actions/checkout@v3
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
target: ${{ env.rustarch }}
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.arch }}-${{ env.PROFILE }}
prefix-key: v1-rust-${{ matrix.features && format('features_{0}', matrix.features) || 'nofeatures' }} # Increase to invalidate old caches.
- name: Build (cross to ${{ matrix.arch }})
if: env.is_cross == 'true'
uses: actions-rs/cargo@v1
with:
use-cross: ${{ env.is_cross }}
command: build
args: --target ${{ env.rustarch }} ${{ matrix.features && format('--features {0}', matrix.features) }} ${{ env.profilestr }}
- name: Build (native)
if: env.is_cross == 'false'
run: |
BINS=$(cargo build --tests --bins --message-format=json --target ${{ env.rustarch }} ${{ matrix.features && format('--features {0}', matrix.features) }} ${{ env.profilestr }} | jq -r 'select(.profile.test == true) | .executable | select(. != null)')
mkdir -p testbinaries/
for testbin in $BINS; do
mv -v $testbin testbinaries/
done
- name: Upload (bins)
uses: actions/upload-artifact@v3
with:
name: binaries-${{ matrix.arch }}-${{ matrix.features }}
path: |
target/${{ env.rustarch }}/${{ env.PROFILE }}/beamctl
- name: Upload (test, native only)
if: matrix.arch == 'amd64'
uses: actions/upload-artifact@v3
with:
name: testbinaries-${{ matrix.arch }}-${{ matrix.features }}
path: |
testbinaries/*
test:
name: Run tests
needs: [ build-rust ]
runs-on: ubuntu-22.04

# strategy:
# matrix:
# features:
# - ""
# - "sockets"

steps:
- uses: actions/checkout@v3
- name: Download bins
uses: actions/download-artifact@v3
with:
name: binaries-amd64-${{ matrix.features }}
path: artifacts/binaries-amd64/
- name: Download tests
uses: actions/download-artifact@v3
with:
name: testbinaries-amd64-${{ matrix.features }}
path: testbinaries/
- run: ./dev/test ci ${{ matrix.features && format('--features {0}', matrix.features) }}

docker:
needs: [ build-rust, pre-check, test ]
if: github.ref_protected == true || github.event_name == 'workflow_dispatch'

strategy:
matrix:
components:
- beamctl
# features:
# - ""
# - "sockets"

# This workflow defines how a maven package is built, tested and published.
# Visit: https://github.com/samply/github-workflows/blob/develop/.github/workflows/docker-ci.yml, for more information
uses: samply/github-workflows/.github/workflows/docker-ci.yml@main
with:
# The Docker Hub Repository you want eventually push to, e.g samply/share-client
image-name: "samply/beamctl"
image-tag-suffix: ${{ matrix.features && format('-{0}', matrix.features) }}
# Define special prefixes for docker tags. They will prefix each images tag.
# image-tag-prefix: "foo"
# Define the build context of your image, typically default '.' will be enough
# build-context: '.'
# Define the Dockerfile of your image, typically default './Dockerfile' will be enough
build-file: './Dockerfile'
# NOTE: This doesn't work currently
# A list of build arguments, passed to the docker build
build-args: |
FEATURE=-${{ matrix.features }}
COMPONENT=${{ matrix.components }}
# Define the target platforms of the docker build (default "linux/amd64,linux/arm64/v8")
# build-platforms: "linux/amd64"
# If your actions generate an artifact in a previous build step, you can tell this workflow to download it
artifact-name: '*'
# This passes the secrets from calling workflow to the called workflow
secrets:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
2 changes: 2 additions & 0 deletions Cross.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[target.aarch64-unknown-linux-gnu]
pre-build = ["dpkg --add-architecture arm64 && apt-get update && apt-get install --assume-yes libssl-dev:arm64 && rm -rf /var/lib/apt/lists/*"]
16 changes: 16 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# This Dockerfile is infused with magic to speedup the build.
# In particular, it requires built binaries to be present (see COPY directive).
#
# tl;dr: To make this build work, run
# ./dev/beamdev build
# and find your freshly built images tagged with the `localbuild` tag.

FROM alpine AS chmodder
ARG FEATURE
ARG TARGETARCH
COPY /artifacts/binaries-$TARGETARCH$FEATURE/beamctl /app/beamctl
RUN chmod +x /app/*

FROM gcr.io/distroless/cc-debian12
COPY --from=chmodder /app/beamctl /usr/local/bin/
ENTRYPOINT [ "/usr/local/bin/beamctl" ]
43 changes: 43 additions & 0 deletions dev/test
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/bin/bash -e

SD=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )

cd $SD

#source beamdev noop

#function start() {
# trap "echo; echo; clean" EXIT
# start_bg
#}

#function test() {
# for test in test_*.sh; do
# echo "======="
# echo "=> $(basename $test) ..."
# source $test
# done
#
# echo -e " ${COL_GREEN}All tests have completed successfully.${COL_NONE}"
#}

case "$1" in
noci)
test
shift
cargo test $@
;;
ci)
# start
# test
shift
for testbin in $SD/../testbinaries/*; do
chmod +x $testbin
$testbin
done
;;
*)
echo "Usage: $0 noci|ci"
exit 1
;;
esac

0 comments on commit 4719cf7

Please sign in to comment.