Merge commit '437e0f343dcd66ac344556c03bd340ce791b1fdd' into correct-history

This commit is contained in:
Trask Stalnaker 2020-04-21 12:55:03 -07:00
commit ce3d764ffa
22 changed files with 248 additions and 114 deletions

View File

@ -0,0 +1,42 @@
name: Add milestone to pull requests
on:
pull_request:
types: [closed]
branches:
- master
jobs:
add_milestone_to_merged:
if: github.event.pull_request.merged && github.event.pull_request.milestone == null
name: Add milestone to merged pull requests
runs-on: ubuntu-latest
steps:
- name: Get project milestones
id: milestones
uses: actions/github-script@0.9.0
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const list = await github.issues.listMilestonesForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open'
})
// Need to manually sort because "sort by number" isn't part of the api
// highest number first
const milestones = list.data.sort((a,b) => (b.number - a.number))
return milestones.length == 0 ? null : milestones[0].number
- name: Update Pull Request
if: steps.milestones.outputs.result != null
uses: actions/github-script@0.9.0
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
// Confusingly, the issues api is used because pull requests are issues
await github.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: ${{ github.event.pull_request.number }},
milestone: ${{ steps.milestones.outputs.result }},
});

View File

@ -0,0 +1,20 @@
name: Create next milestone
on:
milestone:
types: [closed]
jobs:
create_next_milestone:
runs-on: ubuntu-latest
steps:
- name: Get next minor version
id: semvers
uses: WyriHaximus/github-action-next-semvers@0.1.0
with:
version: ${{ github.event.milestone.title }}
- name: Create next milestone
uses: WyriHaximus/github-action-create-milestone@0.1.0
with:
title: ${{ steps.semvers.outputs.minor }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -0,0 +1,51 @@
name: Create draft release notes
on:
milestone:
types: [closed]
jobs:
draft_release_notes:
runs-on: ubuntu-latest
steps:
- name: Get pull requests for milestone
id: pullsA
uses: actions/github-script@0.9.0
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const options = github.pulls.list.endpoint.merge({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'closed'
})
const pullRequests = await github.paginate(options)
return pullRequests.filter(pullRequest => pullRequest.merged_at
&& pullRequest.milestone
&& pullRequest.milestone.number == ${{ github.event.milestone.number }})
- name: Generate release notes text
id: generate
uses: actions/github-script@0.9.0
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
var draftText = "# Improvements \n\n# Changes \n\n"
for (let pull of ${{ steps.pullsA.outputs.result }}) {
draftText += "* " + pull.title + " #" + pull.number + " \n"
}
draftText += "\n# Fixes \n"
return draftText
- name: Create release notes draft
uses: actions/github-script@0.9.0
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
await github.repos.createRelease({
owner: context.repo.owner,
repo: context.repo.repo,
tag_name: 'v' + '${{ github.event.milestone.title }}',
name: '${{ github.event.milestone.title}}',
draft: true,
body: ${{ steps.generate.outputs.result }}
})

View File

@ -0,0 +1,62 @@
name: Update issues on release
on:
release:
types: [published]
jobs:
update_issues:
runs-on: ubuntu-latest
steps:
- name: Get milestone for release
id: milestone
uses: actions/github-script@0.9.0
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const options = github.issues.listMilestonesForRepo.endpoint.merge({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'all'
})
const milestones = await github.paginate(options)
return milestones.find( milestone => milestone.title == "${{github.event.release.name}}" ).number
- name: Get issues for milestone
id: issues
uses: actions/github-script@0.9.0
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const options = github.issues.listForRepo.endpoint.merge({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'all',
milestone: ${{steps.milestone.outputs.result}}
})
const issues = await github.paginate(options)
// Pull requests are issues so filter them out
return issues.filter( issue => !issue["pull_request"] )
- name: Comment and close issues
uses: actions/github-script@0.9.0
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
for (let issue of ${{ steps.issues.outputs.result }}) {
// This can be parallelized better by moving the await but it might trip rate limits
await github.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
body: ':robot: This issue has been addressed in the latest release. See full details in the [Release Notes]( ${{ github.event.release.html_url }}).'
})
await github.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
state: 'closed'
})
}

View File

@ -37,8 +37,15 @@ class MuzzlePlugin implements Plugin<Project> {
private static final AtomicReference<ClassLoader> TOOLING_LOADER = new AtomicReference<>()
static {
RemoteRepository central = new RemoteRepository.Builder("central", "default", "https://repo1.maven.org/maven2/").build()
RemoteRepository sonatype = new RemoteRepository.Builder("sonatype", "default", "https://oss.sonatype.org/content/repositories/releases/").build()
RemoteRepository jcenter = new RemoteRepository.Builder("jcenter", "default", "https://jcenter.bintray.com/").build()
RemoteRepository spring = new RemoteRepository.Builder("spring", "default", "https://repo.spring.io/libs-release/").build()
RemoteRepository jboss = new RemoteRepository.Builder("jboss", "default", "https://repository.jboss.org/nexus/content/repositories/releases/").build()
RemoteRepository typesafe = new RemoteRepository.Builder("typesafe", "default", "https://repo.typesafe.com/typesafe/releases").build()
MUZZLE_REPOS = new ArrayList<RemoteRepository>(Arrays.asList(central, typesafe))
RemoteRepository akka = new RemoteRepository.Builder("akka", "default", "https://dl.bintray.com/akka/maven/").build()
RemoteRepository atlassian = new RemoteRepository.Builder("atlassian", "default", "https://maven.atlassian.com/content/repositories/atlassian-public/").build()
// MUZZLE_REPOS = Arrays.asList(central, sonatype, jcenter, spring, jboss, typesafe, akka, atlassian)
MUZZLE_REPOS = Arrays.asList(central, jcenter, typesafe)
}
@Override
@ -205,7 +212,10 @@ class MuzzlePlugin implements Plugin<Project> {
rangeRequest.setArtifact(directiveArtifact)
final VersionRangeResult rangeResult = system.resolveVersionRange(session, rangeRequest)
final List<Artifact> allVersionArtifacts = filterVersion(rangeResult.versions).collect { version ->
// println "Range Request: " + rangeRequest
// println "Range Result: " + rangeResult
final List<Artifact> allVersionArtifacts = filterVersion(rangeResult.versions, muzzleDirective.skipVersions).collect { version ->
new DefaultArtifact(muzzleDirective.group, muzzleDirective.module, "jar", version.toString())
}
@ -236,7 +246,7 @@ class MuzzlePlugin implements Plugin<Project> {
rangeRequest.setArtifact(directiveArtifact)
final VersionRangeResult rangeResult = system.resolveVersionRange(session, rangeRequest)
filterVersion(allRangeResult.versions).collect { version ->
filterVersion(allRangeResult.versions, muzzleDirective.skipVersions).collect { version ->
if (!rangeResult.versions.contains(version)) {
final MuzzleDirective inverseDirective = new MuzzleDirective()
inverseDirective.group = muzzleDirective.group
@ -350,7 +360,7 @@ class MuzzlePlugin implements Plugin<Project> {
/**
* Filter out snapshot-type builds from versions list.
*/
private static filterVersion(List<Version> list) {
private static filterVersion(List<Version> list, Set<String> skipVersions) {
list.removeIf {
def version = it.toString().toLowerCase()
return version.contains("rc") ||
@ -361,7 +371,10 @@ class MuzzlePlugin implements Plugin<Project> {
version.contains(".m") ||
version.contains("-m") ||
version.contains("-dev") ||
version.contains("-ea") ||
version.contains("-atlassian-") ||
version.contains("public_draft") ||
skipVersions.contains(version) ||
version.matches(GIT_SHA_PATTERN)
}
return list
@ -387,6 +400,7 @@ class MuzzleDirective {
String group
String module
String versions
Set<String> skipVersions = new HashSet<>()
List<String> additionalDependencies = new ArrayList<>()
boolean assertPass
boolean assertInverse = false
@ -442,6 +456,7 @@ class MuzzleExtension {
void pass(Action<? super MuzzleDirective> action) {
final MuzzleDirective pass = objectFactory.newInstance(MuzzleDirective)
action.execute(pass)
postConstruct(pass)
pass.assertPass = true
directives.add(pass)
}
@ -449,7 +464,15 @@ class MuzzleExtension {
void fail(Action<? super MuzzleDirective> action) {
final MuzzleDirective fail = objectFactory.newInstance(MuzzleDirective)
action.execute(fail)
postConstruct(fail)
fail.assertPass = false
directives.add(fail)
}
private postConstruct(MuzzleDirective directive) {
// Make skipVersions case insensitive.
directive.skipVersions = directive.skipVersions.collect {
it.toLowerCase()
}
}
}

View File

@ -358,8 +358,9 @@ tasks.withType(Test).configureEach {
useJUnitPlatform()
}
// All tests must complete within 3 minutes.
timeout = Duration.ofMinutes(3)
// All tests must complete within 15 minutes.
// This value is quite big because with lower values (3 mins) we were experiencing large number of false positives
timeout = Duration.ofMinutes(15)
// Disable all tests if skipTests property was specified
onlyIf { !project.rootProject.hasProperty("skipTests") }

View File

@ -6,6 +6,7 @@ muzzle {
group = "commons-httpclient"
module = "commons-httpclient"
versions = "[2.0,]"
skipVersions += "3.1-jenkins-1" // odd version in jcenter
assertInverse = true
}
}

View File

@ -6,6 +6,7 @@ muzzle {
group = "commons-httpclient"
module = "commons-httpclient"
versions = "[,4.0)"
skipVersions += '3.1-jenkins-1'
}
pass {
group = "org.apache.httpcomponents"

View File

@ -44,9 +44,8 @@ dependencies {
testCompile group: 'org.elasticsearch.plugin', name: 'transport-netty4-client', version: '6.4.0'
// TODO: The tests are incompatible with 7.x. The instrumentation may be as well.
// FIXME: Lock to specific version due to bad deploy rollout.
latestDepTestCompile group: 'org.elasticsearch.client', name: 'elasticsearch-rest-client', version: '6.8.3'
latestDepTestCompile group: 'org.elasticsearch.client', name: 'transport', version: '6.8.3'
latestDepTestCompile group: 'org.elasticsearch', name: 'elasticsearch', version: '6.8.3'
latestDepTestCompile group: 'org.elasticsearch.plugin', name: 'transport-netty4-client', version: '6.8.3'
latestDepTestCompile group: 'org.elasticsearch.client', name: 'elasticsearch-rest-client', version: '6.+'
latestDepTestCompile group: 'org.elasticsearch.client', name: 'transport', version: '6.+'
latestDepTestCompile group: 'org.elasticsearch', name: 'elasticsearch', version: '6.+'
latestDepTestCompile group: 'org.elasticsearch.plugin', name: 'transport-netty4-client', version: '6.+'
}

View File

@ -10,8 +10,7 @@ muzzle {
group = "org.elasticsearch.client"
module = "transport"
versions = "[5.0.0,5.3.0)"
// Work around for a bad release of 6.8.4
// assertInverse = true
assertInverse = true
}
pass {
group = "org.elasticsearch"

View File

@ -11,8 +11,7 @@ muzzle {
group = "org.elasticsearch.client"
module = "transport"
versions = "[5.3.0,6.0.0)"
// Work around for a bad release of 6.8.4
// assertInverse = true
assertInverse = true
}
pass {
group = "org.elasticsearch"

View File

@ -10,14 +10,13 @@ muzzle {
pass {
group = "org.elasticsearch.client"
module = "transport"
versions = "[6.0.0,6.8.4)"
// Work around for a bad release of 6.8.4
// assertInverse = true
versions = "[6.0.0,]"
assertInverse = true
}
pass {
group = "org.elasticsearch"
module = "elasticsearch"
versions = "[6.0.0,)"
versions = "[6.0.0,]"
assertInverse = true
}
}

View File

@ -27,6 +27,6 @@ dependencies {
testCompile group: 'org.glassfish.jersey.containers', name: 'jersey-container-grizzly2-http', version: '2.0'
latestDepTestCompile group: 'org.glassfish.grizzly', name: 'grizzly-http-server', version: '+'
latestDepTestCompile group: 'org.glassfish.jersey.containers', name: 'jersey-container-grizzly2-http', version: '+'
latestDepTestCompile group: 'org.glassfish.jersey.inject', name: 'jersey-hk2', version: '+'
latestDepTestCompile group: 'org.glassfish.jersey.containers', name: 'jersey-container-grizzly2-http', version: '2.+'
latestDepTestCompile group: 'org.glassfish.jersey.inject', name: 'jersey-hk2', version: '2.+'
}

View File

@ -16,6 +16,7 @@
package io.opentelemetry.auto.instrumentation.javaconcurrent;
import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
@ -27,8 +28,6 @@ import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.AdviceUti
import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.State;
import io.opentelemetry.auto.instrumentation.api.SpanWithScope;
import io.opentelemetry.auto.tooling.Instrumenter;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import lombok.extern.slf4j.Slf4j;
@ -53,18 +52,14 @@ public final class CallableInstrumentation extends Instrumenter.Default {
@Override
public Map<String, String> contextStore() {
final Map<String, String> map = new HashMap<>();
map.put(Callable.class.getName(), State.class.getName());
return Collections.unmodifiableMap(map);
return singletonMap(Callable.class.getName(), State.class.getName());
}
@Override
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
final Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
transformers.put(
return singletonMap(
named("call").and(takesArguments(0)).and(isPublic()),
CallableInstrumentation.class.getName() + "$CallableAdvice");
return transformers;
}
public static class CallableAdvice {

View File

@ -28,7 +28,6 @@ import io.opentelemetry.auto.tooling.Instrumenter;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.Future;
@ -107,9 +106,7 @@ public final class FutureInstrumentation extends Instrumenter.Default {
@Override
public Map<String, String> contextStore() {
final Map<String, String> map = new HashMap<>();
map.put(Future.class.getName(), State.class.getName());
return Collections.unmodifiableMap(map);
return singletonMap(Future.class.getName(), State.class.getName());
}
@Override

View File

@ -16,6 +16,7 @@
package io.opentelemetry.auto.instrumentation.javaconcurrent;
import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
@ -27,8 +28,6 @@ import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.AdviceUti
import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.State;
import io.opentelemetry.auto.instrumentation.api.SpanWithScope;
import io.opentelemetry.auto.tooling.Instrumenter;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.asm.Advice;
@ -52,18 +51,14 @@ public final class RunnableInstrumentation extends Instrumenter.Default {
@Override
public Map<String, String> contextStore() {
final Map<String, String> map = new HashMap<>();
map.put(Runnable.class.getName(), State.class.getName());
return Collections.unmodifiableMap(map);
return singletonMap(Runnable.class.getName(), State.class.getName());
}
@Override
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
final Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
transformers.put(
return singletonMap(
named("run").and(takesArguments(0)).and(isPublic()),
RunnableInstrumentation.class.getName() + "$RunnableAdvice");
return transformers;
}
public static class RunnableAdvice {

View File

@ -5,7 +5,9 @@ muzzle {
pass {
group = "com.sun.jersey"
module = "jersey-client"
versions = "[,]"
versions = "[1.1,]"
skipVersions += ['1.0.3-atlassian-1-logpatch', '1.8-atlassian-6']
assertInverse = true
}
}

View File

@ -13,38 +13,20 @@ testSets {
}
muzzle {
// 2.0.5 was a bad release
fail {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.11'
versions = '[,2.0.0)'
}
pass {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.11'
versions = '[2.0.0,2.0.4]'
}
pass {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.11'
versions = '[2.0.6,]'
versions = '[2.0.0,]'
assertInverse = true
}
fail {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.12'
versions = '[,2.0.0)'
}
pass {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.12'
versions = '[2.0.0,2.0.4]'
}
pass {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.12'
versions = '[2.0.6,2.1.0)'
versions = '[2.0.0,2.1.0)'
skipVersions += '2.0.5' // Bad release
assertInverse = true
}
// No Scala 2.13 versions below 2.0.6 exist

View File

@ -13,45 +13,27 @@ testSets {
}
muzzle {
// 2.0.5 was a bad release
fail {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.11'
versions = '[,2.0.4]'
}
fail {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.11'
versions = '[2.0.6,)'
versions = '[,]'
}
fail {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.12'
versions = '[,2.0.4]'
}
fail {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.12'
versions = '[2.0.6,2.1.0)'
}
pass {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.12'
versions = '[2.1.0,]'
skipVersions += '2.0.5' // Bad release
assertInverse = true
}
// No Scala 2.13 versions below 2.0.6 exist
fail {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.13'
versions = '[2.0.6,2.1.0)'
}
pass {
group = 'com.typesafe.play'
module = 'play-ahc-ws-standalone_2.13'
versions = '[2.1.0,]'
skipVersions += '2.0.5' // Bad release
assertInverse = true
}
}

View File

@ -11,6 +11,8 @@ muzzle {
group = "javax.servlet"
module = 'servlet-api'
versions = "[,]"
skipVersions += '0'
assertInverse = true
}
}

View File

@ -1,38 +1,22 @@
apply from: "${rootDir}/gradle/instrumentation.gradle"
muzzle {
fail {
group = 'org.springframework'
module = 'spring-webmvc'
versions = "[,1.2.1)"
extraDependency "javax.servlet:javax.servlet-api:3.0.1"
}
// 1.2.1-1.2.4 have broken dependencies.
fail {
group = 'org.springframework'
module = 'spring-webmvc'
versions = "(1.2.4,3.1.0.RELEASE)"
extraDependency "javax.servlet:javax.servlet-api:3.0.1"
}
pass {
group = 'org.springframework'
module = 'spring-webmvc'
versions = "[3.1.0.RELEASE,3.2.1.RELEASE)"
extraDependency "javax.servlet:javax.servlet-api:3.0.1"
}
// 3.2.1.RELEASE is missing a required class. (bad release?)
pass {
group = 'org.springframework'
module = 'spring-webmvc'
versions = "(3.2.1.RELEASE,]"
versions = "[3.1.0.RELEASE,]"
skipVersions += ['1.2.1', '1.2.2', '1.2.3', '1.2.4'] // broken releases... missing dependencies
skipVersions += '3.2.1.RELEASE' // missing a required class. (bad release?)
extraDependency "javax.servlet:javax.servlet-api:3.0.1"
assertInverse = true
}
// FIXME: webmvc depends on web, so we need a separate integration for spring-web specifically.
fail {
group = 'org.springframework'
module = 'spring-web'
versions = "(1.2.4,]"
versions = "[,]"
skipVersions += ['1.2.1', '1.2.2', '1.2.3', '1.2.4'] // broken releases... missing dependencies
extraDependency "javax.servlet:javax.servlet-api:3.0.1"
}
}

View File

@ -25,7 +25,6 @@ import com.google.common.collect.Sets;
import io.opentelemetry.auto.config.Config;
import io.opentelemetry.auto.tooling.Instrumenter;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import lombok.extern.slf4j.Slf4j;
@ -169,9 +168,8 @@ public class TraceConfigInstrumentation implements Instrumenter {
}
}
final Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
transformers.put(methodMatchers, packageName + ".TraceAdvice");
return transformers;
return Collections.<ElementMatcher<? super MethodDescription>, String>singletonMap(
methodMatchers, packageName + ".TraceAdvice");
}
}
}