Skip to content

Commit

Permalink
Do automatic release builds and publish on GitHub (#340)
Browse files Browse the repository at this point in the history
Do automatic release builds and publish on GitHub
  • Loading branch information
badboy authored Oct 3, 2019
2 parents 5b0463f + aa8fff4 commit 716669d
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 179 deletions.
10 changes: 7 additions & 3 deletions .buildconfig.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@ groupId: org.mozilla.telemetry
projects:
glean-core:
path: glean-core/android
artifactId: glean-core
publishedArtifacts: [glean-core, glean-core-forUnitTests, glean-core-withoutLib]
description: 'The Glean core library'
artifactId: glean
publications:
- name: glean
type: aar
- name: glean-forUnitTests
type: jar
description: 'The Glean SDK is a modern approach for a Telemetry library and is part of the Glean project.'
glean-sample-app:
path: samples/android/app
artifactId: glean-core-sample-app
Expand Down
51 changes: 51 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,40 @@ jobs:
$CODECOV_CMD || (sleep 5 && $CODECOV_CMD) || (sleep 5 && $CODECOV_CMD)
- store_artifacts:
path: glean-core/android/build/reports/tests
- run:
name: Package a release artifact
command: ./gradlew --no-daemon publish
environment:
GRADLE_OPTS: -Xmx2048m
- persist_to_workspace:
root: .
paths: build

android-release:
docker:
- image: circleci/golang:1.13
steps:
- checkout
- attach_workspace:
at: .
- run:
name: Publish a release on GitHub
command: |
go get github.com/tcnksm/ghr
VERSION=$(git describe --tag)
RAWVERSION="${VERSION#v}"
VERSIONFILE=.buildconfig.yml
if ! grep -q "libraryVersion: ${RAWVERSION}" "${VERSIONFILE}"; then
echo "=================================================="
echo "${VERSIONFILE} does not contain the expected tagged version ${RAWVERSION}"
echo "Instead it has:"
grep "libraryVersion:" "${VERSIONFILE}"
echo "Ensure the tag corresponds to the version in ${VERSIONFILE}"
echo "=================================================="
exit 1
fi
ARTIFACTS="./build/maven/org/mozilla/telemetry/glean/${RAWVERSION}/"
ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} ${VERSION} ${ARTIFACTS}
# via https://circleci.com/blog/deploying-documentation-to-github-pages-with-continuous-integration/
Generate Rust documentation:
Expand Down Expand Up @@ -384,3 +418,20 @@ workflows:
coverage:
jobs:
- Rust code coverage

release:
jobs:
- Android tests:
filters:
branches:
ignore: /.*/
tags:
only: /^v.*/
- android-release:
requires:
- Android tests
filters:
branches:
ignore: /.*/
tags:
only: /^v.*/
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ members = [

[profile.release]
opt-level = "s"
debug = true
debug = false
lto = true
17 changes: 3 additions & 14 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,8 @@ if (file('local.properties').canRead()) {
logger.lifecycle('Local configuration: loaded local.properties')
}

// For non-megazord builds, don't do a release build unless we explicitly want
// it (e.g. in CI, or if specified in local.properties). This avoids some cases
// where two builds of some crates are required when they wouldn't otherwise be,
// as well as improving build times for local development.
ext.nonMegazordProfile = "debug"
// Default to debug builds, but force release builds on CI
ext.cargoProfile = "debug"
// Additionally, we require `--locked` in CI, but not for local builds.
// Unlike the above, this can't be overridden by `local.properties` (mainly
// because doing so seems pointless, not for any security reason)
Expand All @@ -114,18 +111,10 @@ ext.extraCargoBuildArguments = []
if (System.getenv("CI")) {
// Note: CI can still override this (and does for PRs), this
// is just the default
ext.nonMegazordProfile = "release"
ext.cargoProfile = "release"
ext.extraCargoBuildArguments = ["--locked"]
}

if (localProperties != null) {
String localNonMegazordProfile = localProperties.getProperty(
"application-services.nonmegazord-profile")
if (localNonMegazordProfile != null) {
ext.nonMegazordProfile = localNonMegazordProfile
}
}

// The Cargo targets to invoke. The mapping from short name to target
// triple is defined by the `rust-android-gradle` plugin.
// They can be overwritten in `local.properties` by the `rust.targets`
Expand Down
5 changes: 2 additions & 3 deletions glean-core/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ cargo {

targets = rootProject.ext.rustTargets

profile = rootProject.ext.nonMegazordProfile
profile = rootProject.ext.cargoProfile

exec = rootProject.ext.cargoExec

Expand Down Expand Up @@ -223,8 +223,7 @@ apply from: "$rootDir/publish.gradle"
// please also update the corresponding .buildconfig-android.yml
// `publishedArtifacts` property.
ext.configurePublish(
/* jnaForTestConfiguration= */ configurations.jnaForTest,
/* variantWithoutLib= */ 'androidWithoutLib',
/* jnaForTestConfiguration= */ configurations.jnaForTest
)

task docs(type: org.jetbrains.dokka.gradle.DokkaAndroidTask, overwrite: true) {
Expand Down
171 changes: 13 additions & 158 deletions publish.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,63 +9,19 @@ def libProjectName = properties.libProjectName
def libUrl = properties.libUrl
def libVcsUrl = properties.libVcsUrl

// If using jnaForTestConfiguration or variantWithoutLib,
// please also update the corresponding .buildconfig-android.yml
// `publishedArtifacts` property.
ext.configurePublish = { jnaForTestConfiguration = null,
variantWithoutLib = null ->
// `jnaForTestConfiguration` is a hacky way to say yes, I'm using JNA and want
// to pack the JNA dispatch libraries and my Rust libraries into a single JAR
// for use in unit tests that run on a development host (and not an Android
// target device). We extract the JNA libraries and our local Rust libraries
// and stick them into a JAR that consumers augment their test configuration
// with.
//
// It's only used for megazords, for which it's required. Passing it in for a
// non-megazord is allowed, but will trigger a warning.
ext.configurePublish = { jnaForTestConfiguration = null ->
def theGroupId = rootProject.ext.library.groupId
def theArtifactId = project.ext.artifactId
def theDescription = project.ext.description
// `jnaForTestConfiguration` is a hacky way to say yes, I'm using JNA and
// want to pack the JNA dispatch libraries and my Rust libraries into a
// single JAR for use in unit tests that run on a development host (and not
// an Android target device). We extract the JNA libraries and our local
// Rust libraries and stick them into a JAR that consumers augment their
// test configuration with.
//
// `variantWithoutLib` says to publish an AAR that doesn't have native Rust
// libraries packed into it. Such an AAR will be aggregated into another
// Maven publication that has a single megazord Rust library that provides
// the native code functionality.
if (jnaForTestConfiguration != null) {
task extractJnaResources(type: Sync) {
dependsOn jnaForTestConfiguration

from {
// Defer the resolution of the configuration. This helps to
// avoid a nasty issue with the Android-Gradle plugin 3.2.1,
// like `Cannot change attributes of configuration
// ':PROJECT:kapt' after it has been resolved`.
zipTree(jnaForTestConfiguration.singleFile)
}

into "${buildDir}/jnaResources/"

eachFile { FileCopyDetails fcp ->
// The intention is to just keep the various `*jnidispatch.*` files.
if (fcp.relativePath.pathString.startsWith("META-INFO") || fcp.relativePath.pathString.endsWith(".class")) {
fcp.exclude()
}
}

includeEmptyDirs false
}

def forUnitTestsJarTask = task forUnitTestsJar(type: Jar) {
from extractJnaResources
from "$buildDir/rustJniLibs/desktop"
from "$buildDir/nativeLibs/desktop"
}

project.afterEvaluate {
def copyNativeLibsTask = tasks.findByName("copyNativeLibs")
if (copyNativeLibsTask != null) {
forUnitTestsJarTask.dependsOn(copyNativeLibsTask)
}
forUnitTestsJarTask.dependsOn(tasks["cargoBuild"])
}
}

task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
Expand Down Expand Up @@ -101,6 +57,7 @@ ext.configurePublish = { jnaForTestConfiguration = null,
artifactId = theArtifactId
description = theDescription
version = rootProject.ext.library.version
packaging = "aar"

licenses {
license {
Expand All @@ -111,7 +68,7 @@ ext.configurePublish = { jnaForTestConfiguration = null,

developers {
developer {
name = 'Firefox Telemetry'
name = 'Mozilla Glean Team'
email = 'glean-team@mozilla.com'
}
}
Expand All @@ -122,111 +79,9 @@ ext.configurePublish = { jnaForTestConfiguration = null,
url = libUrl
}
}

if (variantWithoutLib != null) {
// If we are publishing a `-withoutLib` publication, we
// never want to choose the real one when a parent project
// has us as a child `project()` dependency.
alias = true
}
}

if (variantWithoutLib != null) {
aarWithoutLib(MavenPublication) {
project.afterEvaluate {
from components.findByName(variantWithoutLib)
}
artifact sourcesJar
// Can't publish Javadoc yet: fxaclient isn't well behaved.
// artifact javadocJar

pom {
groupId = theGroupId
artifactId = "${theArtifactId}-withoutLib"
description = theDescription
version = rootProject.ext.library.version

licenses {
license {
name = properties.libLicense
url = properties.libLicenseUrl
}
}

developers {
developer {
name = 'Firefox Telemetry'
email = 'glean-team@mozilla.com'
}
}

scm {
connection = properties.libVcsUrl
developerConnection = properties.libVcsUrl
url = properties.libUrl
}
}
}
}

if (jnaForTestConfiguration != null) {
forUnitTestsJar(MavenPublication) {
artifact tasks['forUnitTestsJar']

pom {
groupId = theGroupId
artifactId = "${theArtifactId}-forUnitTests"
description = theDescription
version = rootProject.ext.library.version

licenses {
license {
name = libLicense
url = libLicenseUrl
}
}

developers {
developer {
name = 'Firefox Telemetry'
email = 'glean-team@mozilla.com'
}
}

scm {
connection = libVcsUrl
developerConnection = libVcsUrl
url = libUrl
}
}

// This is never the publication we want to use when publishing a
// parent project with us as a child `project()` dependency.
alias = true
}
}
}
}

task zipMavenArtifacts

publishing.publications.withType(MavenPublication).each {publication ->
def zipTask = task "zipMavenArtifact-${publication.artifactId}"(type: Zip) {
from "${project.buildDir}/maven"

include "**/${publication.artifactId}/**/*.aar"
include "**/${publication.artifactId}/**/*.md5"
include "**/${publication.artifactId}/**/*.sha1"
include "**/${publication.artifactId}/**/*.pom"
include "**/${publication.artifactId}/**/*.jar"

// Metadata is generated by maven.mozilla.org directly
exclude '**/*maven-metadata.xml*'

archiveName "${publication.artifactId}.maven.zip"
includeEmptyDirs = false
destinationDir(file("${project.buildDir}"))
}
zipMavenArtifacts.dependsOn(zipTask)
}
task checkMavenArtifacts
}

0 comments on commit 716669d

Please sign in to comment.