CI/CD: Create initial version of CI/CD workflow.

The CI/CD workflow will only execute on Ubuntu and MacOS latest version.
The workflow will attempt to build with autotools and CMake and execute
the tests. The workflow will run for all pull requests and pushes done
to the master branch.
This commit is contained in:
Jia Tan 2022-12-23 00:34:48 +08:00
parent 1275ebfba7
commit 9f05c27a58
2 changed files with 213 additions and 0 deletions

72
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,72 @@
#############################################################################
#
# Author: Jia Tan
#
# This file has been put into the public domain.
# You can do whatever you want with this file.
#
#############################################################################
name: CI
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
branches: [ master ]
pull_request:
branches: [ master ]
# Allows running workflow manually
workflow_dispatch:
jobs:
# When CMake can support disabling check types and
# encoders/decoders/threads, it will be combined to one Linux job
# and another matrix list.
Linux-Autotools:
# Just run on latest ubuntu
runs-on: ubuntu-latest
strategy:
matrix:
check_types: ["crc32", "crc32,crc64", "crc32,sha256", "crc32,crc64,sha256"]
disable: [encoders, decoders, bcj, delta, threads]
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
- name: Install Dependencies
run: sudo apt-get install -y autoconf automake build-essential po4a autopoint
- name: Build
run: ./build-aux/ci_build.sh -b autotools -c ${{ matrix.check_types }} -d ${{ matrix.disable }}
Linux-CMake:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install Dependencies
run: sudo apt-get install -y build-essential cmake
- name: Build
run: ./build-aux/ci_build.sh -b cmake
MacOS-Autotools:
runs-on: macos-latest
strategy:
matrix:
check_types: ["crc32", "crc32,crc64", "crc32,sha256", "crc32,crc64,sha256"]
disable: [encoders, decoders, bcj, delta, threads]
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
- name: Install Dependencies
run: brew install autoconf automake libtool po4a
- name: Build
run: ./build-aux/ci_build.sh -b autotools -c ${{ matrix.check_types }} -d ${{ matrix.disable }}
MacOS-CMake:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: Install Dependencies
run: brew install cmake
- name: Build
run: ./build-aux/ci_build.sh -b cmake

141
build-aux/ci_build.sh Executable file
View File

@ -0,0 +1,141 @@
#!/bin/sh
#
#############################################################################
#
# Script meant to be used for Continuous Integration automation for POSIX
# systems. On GitHub, this is used by Ubuntu and MacOS builds.
#
#############################################################################
#
# Author: Jia Tan
#
# This file has been put into the public domain.
# You can do whatever you want with this file.
#
#############################################################################
set -e
USAGE="Usage: $0 -b [autotools|cmake] -c [crc32|crc64|sha256] -d [encoders,decoders,bcj,delta,threads] -l [destdir] -s [srcdir]"
# Absolute path of script directory
ABS_DIR=$(cd -- "$(dirname -- "$0")" && pwd)
# Default CLI option values
BUILD_SYSTEM="autotools"
CHECK_TYPE="crc32,crc64,sha256"
BCJ="y"
DELTA="y"
ENCODERS="y"
DECODERS="y"
THREADS="y"
SRC_DIR="$ABS_DIR/../"
DEST_DIR="$SRC_DIR/../xz_build"
# Parse arguments
while getopts b:c:d:l:s: opt; do
# b option can have either value "autotools" OR "cmake"
case ${opt} in
b)
case "$OPTARG" in
autotools) ;;
cmake) ;;
*) echo "Invalid build system: $OPTARG"; exit 1;;
esac
BUILD_SYSTEM="$OPTARG"
;;
# c options can be a comma separated list of check types to support
c)
for crc in $(echo $OPTARG | sed "s/,/ /g"); do
case "$crc" in
crc32) ;;
crc64) ;;
sha256) ;;
*) echo "Invalid check type: $crc"; exit 1 ;;
esac
done
CHECK_TYPE="$OPTARG"
;;
# d options can be a comma separated list of things to disable at
# configure time
d)
for disable_arg in $(echo $OPTARG | sed "s/,/ /g"); do
case "$disable_arg" in
encoders) ENCODERS="n" ;;
decoders) DECODERS="n" ;;
bcj) BCJ="n" ;;
delta) DELTA="n" ;;
threads) THREADS="n" ;;
*) echo "Invalid disable value: $disable_arg"; exit 1 ;;
esac
done
;;
l) DEST_DIR="$OPTARG"
;;
s) SRC_DIR="$OPTARG"
;;
esac
done
# Build based on arguments
mkdir -p "$DEST_DIR"
case $BUILD_SYSTEM in
autotools)
# Run autogen.sh script
cd "$SRC_DIR"
"./autogen.sh"
cd "$DEST_DIR"
# Generate configure option values
EXTRA_OPTIONS=""
FILTER_LIST="lzma1,lzma2"
if [ "$BCJ" = "y" ]
then
FILTER_LIST="$FILTER_LIST,x86,powerpc,ia64,arm,armthumb,arm64,sparc"
fi
if [ "$DELTA" = "y" ]
then
FILTER_LIST="$FILTER_LIST,delta"
fi
if [ "$ENCODERS" = "y" ]
then
EXTRA_OPTIONS="$EXTRA_OPTIONS --enable-encoders=$FILTER_LIST"
else
EXTRA_OPTIONS="$EXTRA_OPTIONS --disable-encoders"
fi
if [ "$DECODERS" = "y" ]
then
EXTRA_OPTIONS="$EXTRA_OPTIONS --enable-decoders=$FILTER_LIST"
else
EXTRA_OPTIONS="$EXTRA_OPTIONS --disable-decoders"
fi
if [ "$THREADS" = "n" ]
then
EXTRA_OPTIONS="$EXTRA_OPTIONS --disable-threads"
fi
# Run configure script
"$SRC_DIR"/configure --enable-checks=$CHECK_TYPE $EXTRA_OPTIONS
# Build the project
make
# Run the tests
make check
;;
cmake)
# CMake currently does not support disabling encoders, decoders,
# threading, or check types. For now, just run the full build.
cd "$DEST_DIR"
cmake "$SRC_DIR/CMakeLists.txt" -B "$DEST_DIR"
make
make test
;;
esac