diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 00000000..14d21897 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,29 @@ +trigger: + branches: + include: + - master + - refs/tags/* + +jobs: +- job: + displayName: 'Snapshot build' + condition: eq(variables['build.sourceBranch'], 'refs/heads/master') + pool: + vmImage: 'macOS-10.15' + + steps: + - checkout: self + + - task: Maven@3 + inputs: + mavenPomFile: 'pom.xml' + goals: 'clean install' + options: '-Drevision=$(Build.BuildNumber)' + publishJUnitResults: false + testResultsFiles: '**/surefire-reports/TEST-*.xml' + javaHomeOption: 'JDKVersion' + jdkVersionOption: '1.11' + mavenVersionOption: 'Default' + mavenAuthenticateFeed: false + effectivePomSkip: false + sonarQubeRunAnalysis: false diff --git a/pom.xml b/pom.xml index 3b0c2ca8..8bb433cb 100644 --- a/pom.xml +++ b/pom.xml @@ -6,9 +6,9 @@ acegi-standard-project 0.2.3 - org.lmdbjava + org.lmdbjava.alt lmdbjava - 0.7.1-SNAPSHOT + 0.7.1-${revision}-SNAPSHOT jar LmdbJava Low latency Java API for the ultra-fast, embedded Symas Lightning Database (LMDB) diff --git a/src/main/java/org/lmdbjava/Library.java b/src/main/java/org/lmdbjava/Library.java index 3cb44fae..2a28f7ca 100644 --- a/src/main/java/org/lmdbjava/Library.java +++ b/src/main/java/org/lmdbjava/Library.java @@ -23,6 +23,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.File; import static java.io.File.createTempFile; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -33,6 +34,7 @@ import static java.util.Locale.ENGLISH; import static java.util.Objects.nonNull; import static java.util.Objects.requireNonNull; +import java.util.Properties; import static jnr.ffi.LibraryLoader.create; import jnr.ffi.Pointer; import static jnr.ffi.Runtime.getRuntime; @@ -97,7 +99,8 @@ final class Library { if (SHOULD_USE_LIB) { libToLoad = getProperty(LMDB_NATIVE_LIB_PROP); } else if (SHOULD_EXTRACT && arch64 && linux) { - libToLoad = extract("org/lmdbjava/lmdbjava-native-linux-x86_64.so"); + final String flavor = refineLinux(); + libToLoad = extract(String.format("org/lmdbjava/lmdbjava-native-%s-x86_64.so", flavor)); } else if (SHOULD_EXTRACT && arch64 && osx) { libToLoad = extract("org/lmdbjava/lmdbjava-native-osx-x86_64.dylib"); } else if (SHOULD_EXTRACT && arch64 && windows) { @@ -137,6 +140,28 @@ private static String extract(final String name) { } } + @SuppressWarnings({"checkstyle:returncount", "PMD.AvoidFileStream"}) + private static String refineLinux() { + // /etc/os-release is a very cross-platform way to determine the linux distribution + // and just happens to be specified in properties format + try (InputStream inputStream = new FileInputStream("/etc/os-release")) { + final Properties properties = new Properties(); + properties.load(inputStream); + + final String flavor = String.valueOf(properties.get("ID")).trim(); + + // We only care if it's Alpine for now as it uses MUSL instead of GLIBC + if ("alpine".equals(flavor)) { + return "linux-alpine"; + } else { + return "linux"; + } + } catch (final IOException e) { + // Default to plain 'linux' if anything fails + return "linux"; + } + } + /** * Structure to wrap a native MDB_envinfo. Not for external use. */