Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 38 additions & 74 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,113 +3,77 @@ on:
push:
tags:
- "[0-9]*.[0-9]*.[0-9]*"
- "v[0-9]*.[0-9]*.[0-9]*"

jobs:
build_gem:
build_source_gem:
name: Build source gem
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ruby/setup-ruby-pkgs@v1
- uses: actions/checkout@v6.0.2
- uses: ruby/setup-ruby@v1
with:
ruby-version: 3.4
- run: sudo apt-get update && sudo apt-get install -y libopencv-dev libvips
- run: gem update --system
- run: rake gem
bundler-cache: true
- run: bundle exec rake build
- name: Upload source gem
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7.0.0
with:
name: libfacedetection.gem
name: source-gem
path: pkg/*.gem
retention-days: 1

compile_native_gems:
name: Compile native gem
needs: build_gem
build_native_gems:
name: Build native gem (${{ matrix.platform }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-24.04
platform: x86_64-linux
ruby: "3.4"
- os: ubuntu-24.04-arm
platform: aarch64-linux
ruby: "3.4"
- os: macos-latest
platform: arm64-darwin
ruby: "3.4"
runs-on: ${{ matrix.os }}
platform:
- x86_64-linux
- aarch64-linux
- x86_64-darwin
- arm64-darwin
steps:
- uses: actions/checkout@v4

- uses: ruby/setup-ruby-pkgs@v1
with:
ruby-version: ${{ matrix.ruby }}

- name: Install system dependencies on Linux
if: matrix.os == 'ubuntu-latest' || matrix.os == 'ubuntu-latest-arm64'
run: sudo apt-get update && sudo apt-get install -y libopencv-dev libvips

- name: Install system dependencies on macOS
if: matrix.os == 'macos-latest'
run: brew install opencv vips

- name: Install gem-compiler
run: gem install gem-compiler

- name: Download source gem
uses: actions/download-artifact@v4
- uses: actions/checkout@v6.0.2
- uses: ruby/setup-ruby@v1
with:
name: libfacedetection.gem
path: pkg/

- name: Compile gem
run: |
SOURCE_GEM=$(ls pkg/*.gem | grep -v -- '-x86_64-linux\|aarch64-linux\|arm64-darwin')
gem compile $SOURCE_GEM --prune

- name: Upload compiled gem
uses: actions/upload-artifact@v4
ruby-version: 3.4
bundler-cache: true
- name: Build native gems
run: bundle exec rb-sys-dock --platform ${{ matrix.platform }} --build
- name: Upload native gems
uses: actions/upload-artifact@v7.0.0
with:
name: libfacedetection-${{ matrix.platform }}.gem
path: ./*.gem
name: native-gem-${{ matrix.platform }}
path: pkg/*-${{ matrix.platform }}.gem
retention-days: 1

release:
name: Create GitHub Release
needs: compile_native_gems
needs:
- build_source_gem
- build_native_gems
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4

- name: Extract version
id: extract_version
run: |
VERSION=${GITHUB_REF#refs/tags/}
echo "GEM_VERSION=$VERSION" >> $GITHUB_ENV
VERSION=${VERSION#v}
echo "GEM_VERSION=$VERSION" >> "$GITHUB_ENV"

- name: Download all artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8.0.1
with:
path: artifacts

- name: Rename gem files with version
run: |
mkdir -p release_gems
for gem in artifacts/libfacedetection-*.gem/*.gem; do
platform=$(basename $gem | sed -E 's/libfacedetection-([^-]+-[^-]+)\.gem/\1/')

# Construct the target filename: NAME-VERSION-PLATFORM.gem
target_filename="libfacedetection-${GEM_VERSION}-${platform}.gem"
target_path="release_gems/$target_filename"
mv "$gem" "$target_path"
done
# Move source gem to release_gems directory
mv artifacts/libfacedetection.gem/*.gem release_gems/libfacedetection-${GEM_VERSION}.gem

- name: Create release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ env.GEM_VERSION }}
files: release_gems/*.gem
tag_name: ${{ github.ref_name }}
name: libfacedetection ${{ env.GEM_VERSION }}
files: artifacts/**/*.gem
generate_release_notes: true
76 changes: 27 additions & 49 deletions .github/workflows/workflow.yml
Original file line number Diff line number Diff line change
@@ -1,53 +1,31 @@
name: run-tests
on: [push]

on:
push:
branches: ["main"]
pull_request:
branches: ["main"]

jobs:
build_gem:
name: Build and test ruby extension
runs-on: ubuntu-latest
ruby_extension:
name: Ruby ${{ matrix.ruby }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
ruby: ["3.2", "3.3", "3.4", "4.0"]
steps:
- uses: actions/checkout@v3
- uses: ruby/setup-ruby-pkgs@v1
- uses: actions/checkout@v6.0.2
- uses: ruby/setup-ruby@v1
with:
ruby-version: 3.4
- run: sudo apt-get update && sudo apt-get install -y libopencv-dev libvips
- run: gem update --system
- run: rake gem
- run: gem install $(ls -1 pkg/*.gem)
- run: bundle install
- run: ruby tests/test_detection.rb
# compile_native_gem:
# name: Compile native gem
# runs-on: ubuntu-latest
# strategy:
# matrix:
# platform:
# - x86_64-linux
# - x86_64-darwin
# - arm64-darwin
# - aarch64-linux
# steps:
# - uses: actions/checkout@v2

# - uses: ruby/setup-ruby@v1
# with:
# ruby-version: '3.1'
# bundler-cache: true

# - uses: oxidize-rb/cross-gem-action@main
# with:
# platform: ${{ matrix.platform }}
# setup: | # optional
# env
# bundle install
# env: | # optional
# RUBY_CC_VERSION=3.1.0:3.0.0:2.7.0
# CXX_aarch64_unknown_linux_gnu=

# - uses: actions/download-artifact@v3
# with:
# name: cross-gem
# path: pkg/

# - name: Display structure of built gems
# run: ls -R
# working-directory: pkg/
ruby-version: ${{ matrix.ruby }}
bundler-cache: true
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Install libvips on Linux
if: runner.os == 'Linux'
run: sudo apt-get update && sudo apt-get install -y libvips
- name: Install libvips on macOS
if: runner.os == 'macOS'
run: brew install vips
- run: bundle exec rake test
20 changes: 10 additions & 10 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 20 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
[workspace]
members = ["ext/*"]
resolver = "2"
[package]
name = "libfacedetection"
version = "0.0.1"
edition = "2021"
publish = false
authors = ["Fetlife <dev@fetlife.com>"]

[lib]
name = "libfacedetection"
crate-type = ["cdylib"]

[dependencies]
libfacedetection_rs = { package = "libfacedetection", git = "https://github.com/fetlife/libfacedetection-rs.git", optional = true, rev = "7426f33ba101514932a5ef58456761735c7bf3dc" }
opencv = { version = "0.88.6", optional = true, features = ["clang-runtime"] }
magnus = { version = "0.8.2" }
rb-sys = { version = "0.9.126", default-features = false, features = ["stable-api-compiled-fallback"] }

[features]
default = ["libfacedetection"]
libfacedetection = ["dep:libfacedetection_rs"]
2 changes: 1 addition & 1 deletion Readme.md → README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ This gem is automatically released using Github Releases when a new version tag
2. Compiling native extensions for multiple platforms:
- x86_64-linux (Ubuntu 24.04)
- aarch64-linux (Ubuntu 24.04 ARM)
- x86_64-darwin (macOS)
- arm64-darwin (macOS)

To create a new release:
Expand All @@ -22,4 +23,3 @@ To create a new release:
```

You can find all releases on the [GitHub Releases page](https://github.com/fetlife/facedetection-ruby/releases).

36 changes: 14 additions & 22 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -1,29 +1,21 @@
require 'rubygems/package_task'
# frozen_string_literal: true

spec = eval(File.read("libfacedetection.gemspec"))
GEM_RUBY_VERSION = "3.4.0"
DOCKER_IMAGE = "ruby:#{GEM_RUBY_VERSION}-bullseye"
require "bundler/gem_tasks"
require "rake/testtask"
require "rb_sys/extensiontask"

def compile_cmd(_arch)
"gem instal gem-compiler; curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y; source '/root/.cargo/env'; rake gem:native"
end

gem_task = Gem::PackageTask.new(spec) do |pkg|
pkg.need_zip = true
pkg.need_tar = true
end
GEMSPEC = Gem::Specification.load("libfacedetection.gemspec")

desc "Generate a pre-compiled native gem for #{RUBY_PLATFORM}"
task "gem:native" => ["gem"] do
sh "gem compile #{gem_task.package_dir_path}.gem"
end
task default: :test
task gem: :build

desc "Generate a pre-compiled native gem for aarch64-linux"
task "gem:native:aarch64-linux" => ["gem"] do
sh %{docker run --rm --platform linux/arm64 -v $(pwd):/src -w /src #{DOCKER_IMAGE} /bin/bash -c "#{compile_cmd('aarch64-unknown-linux-musl')}"}
RbSys::ExtensionTask.new("libfacedetection", GEMSPEC) do |ext|
ext.lib_dir = "lib/libfacedetection"
end

desc "Generate a pre-compiled native gem for x86_64-linux"
task "gem:native:x86_64-linux" => ["gem"] do
sh %{docker run --rm --platform linux/amd64 -v $(pwd):/src -w /src #{DOCKER_IMAGE} /bin/bash -c "#{compile_cmd('x86_64-unknown-linux-musl')}"}
Rake::TestTask.new do |t|
t.deps << "compile:dev"
t.libs << "lib"
t.libs << "tests"
t.test_files = FileList["tests/test_*.rb"]
end
19 changes: 0 additions & 19 deletions ext/libfacedetection/Cargo.toml

This file was deleted.

5 changes: 2 additions & 3 deletions ext/libfacedetection/extconf.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
require "mkmf"
require "rb_sys/mkmf"
# frozen_string_literal: true

create_rust_makefile("libfacedetection/libfacedetection_ruby")
load File.expand_path("../../extconf.rb", __dir__)
12 changes: 12 additions & 0 deletions extconf.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# frozen_string_literal: true

require "mkmf"
require "pathname"
require "rb_sys/mkmf"

create_rust_makefile("libfacedetection") do |config|
relative_ext_dir = Pathname(__dir__).relative_path_from(Pathname.pwd)
# rb_sys strips one leading "./" while constructing the Cargo manifest path.
config.ext_dir = "./#{relative_ext_dir}"
config.profile = ENV.fetch("RB_SYS_CARGO_PROFILE", "release").to_sym
end
Loading