Skip to content

gem-test-and-release #771

gem-test-and-release

gem-test-and-release #771

# Copyright (c) 2023-2024 [Ribose Inc](https://www.ribose.com)
# All rights reserved.
# This file is a part of tamatebako
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
name: gem-test-and-release
on:
schedule:
- cron: "0 6 * * 1"
push:
branches: [ main ]
tags: [ 'v*' ]
paths-ignore:
- 'docs/**'
- '**.adoc'
- '**.md'
- .github/workflows/alpine.yml
- .github/workflows/lint.yml
- .github/workflows/macos.yml
- .github/workflows/ubuntu.yml
- .github/workflows/windows-msys.yml
- .cirrus.yml
pull_request:
workflow_dispatch:
concurrency:
group: '${{ github.workflow }}-${{ github.job }}-${{ github.head_ref || github.ref_name }}'
cancel-in-progress: true
env:
CACHE_VER: 08
DEBIAN_FRONTEND: "noninteractive"
TZ: "Etc/UTC"
# show cmake output
VERBOSE: no
jobs:
build-gem:
name: build-gem
runs-on: ubuntu-latest
steps:
- name: Checkout tebako packaging environment
uses: actions/checkout@v4
with:
fetch-depth: 1
submodules: true
- name: Setup environment
run: cat common.env >> $GITHUB_ENV
- name: Install Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ env.RUBY_VER }}
bundler-cache: true
- name: Build gem
run: bundle exec rake build
- name: Upload gem
uses: actions/upload-artifact@v4
with:
name: gem
retention-days: 1
path: pkg/*
- name: Upload actions
uses: actions/upload-artifact@v4
with:
name: actions
retention-days: 1
path: .github/actions/*
package-tests-windows:
needs: build-gem
name: Use gem to package ${{ matrix.gem }} ${{ matrix.os }} Ruby ${{ matrix.package_ruby_ver }} CC ${{ matrix.env.CC }}
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
os: [ 'windows-latest' ]
gem: [ fontist ]
package_ruby_ver: [ '3.2.5' ]
env:
- { CC: gcc, CXX: g++ }
env: ${{ matrix.env }}
defaults:
run:
shell: msys2 {0}
steps:
- name: Setup MSys
uses: msys2/setup-msys2@v2
with:
msystem: ucrt64
path-type: minimal
update: true
- name: Download actions
uses: actions/download-artifact@v4
with:
name: actions
path: .github/actions
- name: Setup ci environment
uses: ./.github/actions/setup-tebako
with:
cache: off
cc: ${{ env.CC }}
cxx: ${{ env.CXX }}
install: off
verbose: ${{ env.VERBOSE }}
- name: Setup integration testing environment
uses: ./.github/actions/setup-tebako-integration-test-msys
with:
path: .tebako/deps
os: ${{ matrix.os }}
cc: ${{ env.CC }}
version: ${{ env.CACHE_VER }}
- name: Package fontist
if: matrix.gem == 'fontist'
uses: ./.github/actions/test-package-fontist-windows
- name: Package metanorma
if: matrix.gem == 'metanorma'
uses: ./.github/actions/test-package-metanorma-windows
package-tests-alpine:
needs: build-gem
name: Use gem to package ${{ matrix.gem }} ${{ matrix.os }} Ruby ${{ matrix.package_ruby_ver }} CC ${{ matrix.env.CC }}
runs-on: ubuntu-latest
container:
image: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ 'alpine:3.17' ]
gem: [ metanorma, fontist ]
package_ruby_ver: [ '3.2.5' ]
env:
- { CC: gcc, CXX: g++ }
env: ${{ matrix.env }}
steps:
- name: Install packages
run: apk --no-cache --upgrade add bash
- name: Download actions
uses: actions/download-artifact@v4
with:
name: actions
path: .github/actions
- name: Setup ci environment
uses: ./.github/actions/setup-tebako
with:
cache: off
cc: ${{ env.CC }}
cxx: ${{ env.CXX }}
install: off
verbose: ${{ env.VERBOSE }}
- name: Setup integration testing environment
uses: ./.github/actions/setup-tebako-integration-test
with:
path: .tebako/deps
os: ${{ matrix.os }}
cc: ${{ env.CC }}
version: ${{ env.CACHE_VER }}
- name: Package fontist
if: matrix.gem == 'fontist'
uses: ./.github/actions/test-package-fontist
- name: Package metanorma
if: matrix.gem == 'metanorma'
uses: ./.github/actions/test-package-metanorma
package-tests-macos:
needs: build-gem
name: Use gem to package ${{ matrix.gem }} ${{ matrix.os }} Ruby ${{ matrix.package_ruby_ver }} CC ${{ matrix.env.CC }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ macos-12, macos-14 ]
gem: [ metanorma, fontist ]
package_ruby_ver: [ '3.2.5' ]
env:
- { CC: clang, CXX: clang++ }
env: ${{ matrix.env }}
steps:
- name: Download actions
uses: actions/download-artifact@v4
with:
name: actions
path: .github/actions
- name: Setup ci environment
uses: ./.github/actions/setup-tebako
with:
cache: off
ruby_version: ${{ matrix.package_ruby_ver }}
cc: ${{ env.CC }}
cxx: ${{ env.CXX }}
install: off
verbose: ${{ env.VERBOSE }}
- name: Setup integration testing environment
uses: ./.github/actions/setup-tebako-integration-test
with:
path: .tebako/deps
os: ${{ matrix.os }}
cc: ${{ env.CC }}
version: ${{ env.CACHE_VER }}
- name: Package fontist
if: matrix.gem == 'fontist'
uses: ./.github/actions/test-package-fontist
- name: Package metanorma
if: matrix.gem == 'metanorma'
uses: ./.github/actions/test-package-metanorma
package-tests-ubuntu:
needs: build-gem
name: Use gem to package ${{ matrix.gem }} ${{ matrix.os }} Ruby ${{ matrix.package_ruby_ver }} CC ${{ matrix.env.CC }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ ubuntu-20.04 ]
gem: [ metanorma, fontist ]
package_ruby_ver: [ '3.2.5' ]
env:
- { CC: clang-12, CXX: clang++-12 }
env: ${{ matrix.env }}
steps:
- name: Download actions
uses: actions/download-artifact@v4
with:
name: actions
path: .github/actions
- name: Setup ci environment
uses: ./.github/actions/setup-tebako
with:
cache: off
ruby_version: ${{ matrix.package_ruby_ver }}
cc: ${{ env.CC }}
cxx: ${{ env.CXX }}
install: off
verbose: ${{ env.VERBOSE }}
- name: Setup integration testing environment
uses: ./.github/actions/setup-tebako-integration-test
with:
path: .tebako/deps
os: ${{ matrix.os }}
cc: ${{ env.CC }}
version: ${{ env.CACHE_VER }}
- name: Package fontist
if: matrix.gem == 'fontist'
uses: ./.github/actions/test-package-fontist
- name: Upload fontist test package
if: matrix.gem == 'fontist'
uses: actions/upload-artifact@v4
with:
name: fontist-package
retention-days: 1
path: |
fontist-package
- name: Package metanorma
if: matrix.gem == 'metanorma'
uses: ./.github/actions/test-package-metanorma
- name: Upload metanorma test package
if: matrix.gem == 'metanorma'
uses: actions/upload-artifact@v4
with:
name: metanorma-package
retention-days: 1
path: |
metanorma-package
package-tests-ubuntu-newer:
name: cross-test on ${{ matrix.os }}
needs: [ package-tests-ubuntu ]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ 'ubuntu-22.04', 'ubuntu-24.04' ]
steps:
- name: Download test packages
uses: actions/download-artifact@v4
with:
pattern: '*-package'
- name: Run test packages
run: |
set -o errexit -o pipefail -o noclobber -o nounset
for TP in *-package; do chmod +x "$TP/$TP"; "$TP/$TP" help; done
# ----- Release -----
release:
name: Release gem
needs: [ package-tests-windows, package-tests-ubuntu-newer, package-tests-alpine, package-tests-macos ]
runs-on: ubuntu-latest
if: contains(github.ref, 'refs/tags/v') && !contains(github.ref, 'pre')
steps:
# - uses: actions/checkout@v4
# with:
# fetch-depth: 1
# submodules: true
#
# - uses: cadwallion/publish-rubygems-action@master
# env:
# RUBYGEMS_API_KEY: ${{secrets.TEBAKO_CI_RUBYGEMS_API_KEY}}
# - uses: actions/download-artifact@v4
# with:
# name: gem
# path: pkg
# - name: Publish to rubygems.org
# env:
# RUBYGEMS_API_KEY: ${{secrets.TEBAKO_CI_RUBYGEMS_API_KEY}}
# run: |
# mkdir -p ~/.gem
# touch ~/.gem/credentials
# cat > ~/.gem/credentials << EOF
# ---
# :rubygems_api_key: ${RUBYGEMS_API_KEY}
# EOF
# chmod 0600 ~/.gem/credentials
# gem signin
# for gem in pkg/*.gem; do gem push -V $gem; done
- name: Dispatch dependent repositories
uses: peter-evans/repository-dispatch@v3
if: contains(github.ref, 'refs/tags/v') && !contains(github.ref, 'pre')
with:
token: ${{ secrets.TEBAKO_CI_PAT_TOKEN }}
repository: tamatebako/tebako-ci-containers
event-type: 'tebako release'
client-payload: '{ "tag": "${{ github.ref_name }}" }'