Skip to content

Build Docker image using pre-built executables #32

Build Docker image using pre-built executables

Build Docker image using pre-built executables #32

Workflow file for this run

name: CI
on:
push:
branches:
- master
- improve-docker-image-build
tags:
- "jq-*"
pull_request:
jobs:
linux:
strategy:
fail-fast: false
matrix:
compiler: [gcc, clang]
image: [ubuntu-22.04]
arch: [x86_64, aarch64]
include:
- compiler: gcc
arch: x86_64
cc: x86_64-linux-gnu-gcc
- compiler: gcc
arch: aarch64
cc: aarch64-linux-gnu-gcc
- compiler: clang
arch: x86_64
cc: clang -target x86_64-linux-gnu
- compiler: clang
arch: aarch64
cc: clang -target aarch64-linux-gnu
runs-on: ${{ matrix.image }}
env:
CC: ${{ matrix.cc }}
SUFFIX: linux-${{ matrix.image }}-${{ matrix.compiler }}-${{ matrix.arch }}
ARCH: ${{ matrix.arch }}
steps:
- name: Clone repository
uses: actions/checkout@v3
with:
submodules: true
- name: Install packages
run: |
sudo apt-get install -y automake autoconf gcc-${ARCH/_/-}-linux-gnu
- name: Build
run: |
autoreconf -i
./configure \
--disable-docs \
--disable-maintainer-mode \
--disable-valgrind \
--with-oniguruma=builtin \
--host=${{ matrix.arch }}-linux-gnu \
--enable-static \
--enable-all-static
make
${ARCH}-linux-gnu-strip jq
file ./jq
- name: Test
# Only run tests for x86_64 matching the CI machine arch
if: ${{ matrix.arch == 'x86_64' }}
run: |
make check
git diff --exit-code
- name: Upload Test Logs
if: ${{ failure() }}
uses: actions/upload-artifact@v3
with:
name: test-logs-${{ env.SUFFIX }}
retention-days: 7
path: |
test-suite.log
tests/*.log
- name: Upload Artifacts
uses: actions/upload-artifact@v3
with:
name: jq-${{ env.SUFFIX }}
if-no-files-found: error
retention-days: 7
path: jq
macos:
strategy:
fail-fast: false
matrix:
image: [macos-11, macos-12, macos-13]
arch: [x86_64, arm64]
runs-on: ${{ matrix.image }}
env:
SUFFIX: macos-${{ matrix.image }}-clang-${{ matrix.arch }}
steps:
- name: Clone repository
uses: actions/checkout@v3
with:
submodules: true
- name: Install packages
run: |
# brew update sometimes fails with "Fetching /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask failed!"
brew update || brew update-reset
brew install autoconf automake libtool
- name: "Set CC"
run: |
echo "CC=clang -target ${{ matrix.arch }}-apple-darwin$(uname -r)" >> $GITHUB_ENV
- name: Build
run: |
autoreconf -i
./configure \
--disable-docs \
--disable-maintainer-mode \
--disable-valgrind \
--with-oniguruma=builtin \
--enable-static \
--enable-all-static \
--host=${{ matrix.arch }}-apple-darwin$(uname -r)
make
strip jq
file ./jq
- name: Test
# Only run tests for x86_64 matching the CI machine arch
if: ${{ matrix.arch == 'x86_64' }}
run: |
make check
git diff --exit-code
- name: Upload Test Logs
if: ${{ failure() }}
uses: actions/upload-artifact@v3
with:
name: test-logs-${{ env.SUFFIX }}
retention-days: 7
path: |
test-suite.log
tests/*.log
- name: Upload Artifacts
uses: actions/upload-artifact@v3
with:
name: jq-${{ env.SUFFIX }}
if-no-files-found: error
retention-days: 7
path: jq
windows:
strategy:
fail-fast: false
matrix:
image: [windows-2019, windows-2022]
runs-on: ${{ matrix.image }}
env:
CC: gcc
SUFFIX: windows-${{ matrix.image }}-gcc
steps:
- name: Clone repository
uses: actions/checkout@v3
with:
submodules: true
- uses: msys2/setup-msys2@v2
with:
update: true
install: >-
base-devel
git
clang
autoconf
automake
libtool
- name: Build
shell: msys2 {0}
run: |
autoreconf -i
./configure \
--disable-docs \
--disable-maintainer-mode \
--disable-valgrind \
--with-oniguruma=builtin \
--disable-shared \
--enable-static \
--enable-all-static
make
strip jq.exe
- name: Test
shell: msys2 {0}
run: |
make check
git diff --exit-code --ignore-submodules
- name: Upload Test Logs
if: ${{ failure() }}
uses: actions/upload-artifact@v3
with:
name: test-logs-${{ env.SUFFIX }}
retention-days: 7
path: |
test-suite.log
tests/*.log
- name: Upload Artifacts
uses: actions/upload-artifact@v3
with:
name: jq-${{ env.SUFFIX }}
if-no-files-found: error
retention-days: 7
path: jq.exe
dist:
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/jq-')
steps:
- name: Clone repository
uses: actions/checkout@v3
with:
submodules: true
- name: Install packages
run: |
sudo apt-get update -qq
sudo apt-get install -y automake autoconf
- name: Create dist
run: |
autoreconf -i
./configure \
--disable-docs \
--disable-maintainer-mode \
--disable-valgrind \
--with-oniguruma=builtin
make dist dist-zip
git diff --exit-code
- name: Upload Artifacts
uses: actions/upload-artifact@v3
with:
name: jq-dist
if-no-files-found: error
retention-days: 7
path: |
jq-*.tar.gz
jq-*.zip
docker:
needs: linux
strategy:
matrix:
platform: [linux/amd64, linux/arm64]
include:
- platform: linux/amd64
suffix: linux-ubuntu-22.04-gcc-x86_64
- platform: linux/arm64
suffix: linux-ubuntu-22.04-gcc-aarch64
runs-on: ubuntu-latest
permissions:
packages: write
# if: startsWith(github.ref, 'refs/tags/jq-')
steps:
- name: Clone repository
uses: actions/checkout@v3
- name: Download executable
uses: actions/download-artifact@v3
with:
name: jq-${{ matrix.suffix }}
- name: Create Dockerfile
run: |
chmod +x jq
cat <<EOF >Dockerfile
FROM scratch
COPY AUTHORS COPYING jq /
RUN ["/jq", "--version"]
ENTRYPOINT ["/jq"]
EOF
- name: Docker metadata
uses: docker/metadata-action@v4
id: metadata
with:
images: ghcr.io/${{ github.repository }}
tags: latest # type=match,pattern=jq-(.*),group=1,value=${{ github.ref_name }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and release Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
provenance: false
platforms: ${{ matrix.platform }}
tags: ${{ steps.metadata.outputs.tags }}
labels: ${{ steps.metadata.outputs.labels }}
release:
runs-on: ubuntu-latest
permissions:
contents: write
needs: [linux, macos, windows, dist, docker]
if: startsWith(github.ref, 'refs/tags/jq-')
steps:
- name: Clone repository
uses: actions/checkout@v3
- name: Merge built artifacts
uses: actions/download-artifact@v3
with:
path: artifacts
- name: Upload release
env:
TAG_NAME: ${{ github.ref_name }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
mkdir release
cp artifacts/jq-linux-ubuntu-22.04-gcc-x86_64/jq release/jq-linux-amd64
cp artifacts/jq-linux-ubuntu-22.04-gcc-aarch64/jq release/jq-linux-arm64
cp artifacts/jq-macos-macos-13-clang-x86_64/jq release/jq-macos-amd64
cp artifacts/jq-macos-macos-13-clang-arm64/jq release/jq-macos-arm64
cp artifacts/jq-windows-windows-2022-gcc/jq.exe release/jq-windows-amd64.exe
cp artifacts/jq-dist/jq-* release/
gh release create "$TAG_NAME" --draft --title "jq ${TAG_NAME#jq-}" --generate-notes
gh release upload "$TAG_NAME" --clobber release/jq-*