name: CI on: push: branches: - master tags: - "jq-*" pull_request: jobs: linux: strategy: fail-fast: false matrix: arch: [ amd64, arm64, armel, armhf, i386, mips, mips64, mips64el, mips64r6, mips64r6el, mipsel, mipsr6, mipsr6el, powerpc, ppc64el, s390x, riscv64, ] include: - arch: amd64 CC: "x86_64-linux-gnu" - arch: arm64 CC: "aarch64-linux-gnu" - arch: armel CC: "arm-linux-gnueabi" - arch: armhf CC: "arm-linux-gnueabihf" - arch: i386 CC: "i686-linux-gnu" - arch: mips CC: "mips-linux-gnu" - arch: mips64 CC: "mips64-linux-gnuabi64" - arch: mips64el CC: "mips64el-linux-gnuabi64" - arch: mips64r6 CC: "mipsisa64r6-linux-gnuabi64" - arch: mips64r6el CC: "mipsisa64r6el-linux-gnuabi64" - arch: mipsel CC: "mipsel-linux-gnu" - arch: mipsr6 CC: "mipsisa32r6-linux-gnu" - arch: mipsr6el CC: "mipsisa32r6el-linux-gnu" - arch: powerpc CC: "powerpc-linux-gnu" - arch: ppc64el CC: "powerpc64le-linux-gnu" - arch: s390x CC: "s390x-linux-gnu" - arch: riscv64 CC: "riscv64-linux-gnu" runs-on: ubuntu-22.04 env: AR: ${{ matrix.CC }}-ar CHOST: ${{ matrix.cc }} CC: ${{ matrix.cc }}-gcc CPP: ${{ matrix.cc }}-cpp CXX: ${{ matrix.cc }}-g++ LDFLAGS: -s SUFFIX: linux-${{ matrix.arch }} steps: - name: Clone repository uses: actions/checkout@v3 with: submodules: true - name: Install packages run: | sudo apt-get update sudo apt-get upgrade sudo apt-get install -y automake autoconf libtool crossbuild-essential-${{ matrix.arch }} - name: Build run: | autoreconf -i ./configure \ --host=${{ matrix.CC }} \ --disable-docs \ --disable-maintainer-mode \ --disable-valgrind \ --with-oniguruma=builtin \ --enable-static \ --enable-all-static make -j$(nproc) file ./jq cp ./jq jq-${{ env.SUFFIX }} - name: Test # Only run tests for amd64 matching the CI machine arch if: ${{ matrix.arch == 'amd64' }} 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 }} path: jq-${{ env.SUFFIX }} if-no-files-found: error retention-days: 7 macos: strategy: fail-fast: false matrix: arch: [ amd64, arm64, ] include: - arch: amd64 target: "x86_64-apple-darwin" - arch: arm64 target: "arm64-apple-darwin" runs-on: macos-13 env: LDFLAGS: -s SUFFIX: macos-${{ 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.target }}$(uname -r)" >> $GITHUB_ENV - name: Build run: | autoreconf -i ./configure \ --host=${{ matrix.target }}$(uname -r) \ --disable-docs \ --disable-maintainer-mode \ --disable-valgrind \ --with-oniguruma=builtin \ --enable-static \ --enable-all-static make -j$(nproc) file ./jq cp ./jq jq-${{ env.SUFFIX }} - name: Test # Only run tests for amd64 matching the CI machine arch if: ${{ matrix.arch == 'amd64' }} 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 }} path: jq-${{ env.SUFFIX }} if-no-files-found: error retention-days: 7 windows: strategy: fail-fast: false matrix: arch: [ amd64, i386, ] include: - arch: amd64 CC: "x86_64-pc-msys" toolchain: "gcc" msystem: msys - arch: i386 CC: "i686-w64-mingw32" toolchain: "mingw-w64-i686-toolchain" msystem: mingw32 runs-on: windows-2022 env: CHOST: ${{ matrix.CC }} CC: ${{ matrix.CC }}-gcc LDFLAGS: -s SUFFIX: windows-${{ matrix.arch }} steps: - name: Clone repository uses: actions/checkout@v3 with: submodules: true - uses: msys2/setup-msys2@v2 with: update: true msystem: ${{ matrix.msystem }} install: >- base-devel git autoconf automake libtool ${{ matrix.toolchain }} - name: Build shell: msys2 {0} run: | autoreconf -i ./configure \ --host=${{ matrix.CC }} \ --disable-docs \ --disable-maintainer-mode \ --disable-valgrind \ --with-oniguruma=builtin \ --disable-shared \ --enable-static \ --enable-all-static make -j$(nproc) file ./jq.exe cp ./jq.exe jq-${{ env.SUFFIX }}.exe - name: Test # Only run tests for amd64 matching the CI machine arch if: ${{ matrix.arch == 'amd64' }} 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 }} path: jq-${{ env.SUFFIX }}.exe if-no-files-found: error retention-days: 7 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: runs-on: ubuntu-latest permissions: packages: write if: startsWith(github.ref, 'refs/tags/jq-') steps: - name: Clone repository uses: actions/checkout@v3 with: submodules: true - name: Docker metadata uses: docker/metadata-action@v4 id: metadata with: images: ghcr.io/${{ github.repository }} tags: 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: linux/amd64,linux/arm64,linux/ppc64le,linux/s390x 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 - name: Upload release env: TAG_NAME: ${{ github.ref_name }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | mkdir -p "release" for files in jq-*; do cp -rf "${files}/"* "release/" done gh release create "$TAG_NAME" --draft --title "jq ${TAG_NAME#jq-}" --generate-notes gh release upload "$TAG_NAME" --clobber release/jq-*