Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release 1.3.0 #816

Open
timothyjward opened this issue Feb 28, 2024 · 11 comments
Open

Release 1.3.0 #816

timothyjward opened this issue Feb 28, 2024 · 11 comments

Comments

@timothyjward
Copy link
Contributor

There have been numerous fixes and enhancements since the release of 1.2.1, and the list of outstanding issues has been almost totally completed.

I propose that it's time to release 1.3.0 - what do you all think?

@stbischof @maho7791 @juergen-albert @bjhargrave @rotty3000 @kriegfrj

@juergen-albert
Copy link
Contributor

+1

@timothyjward
Copy link
Contributor Author

timothyjward commented Feb 29, 2024

Good to see that we have consensus - as for the process, is it necessary to create an RC1 tag first?

As far as I can tell the release process is as follows:

  1. Create two commits locally on main, the first changing the revision to a release version, the second to the next development version.
  2. Push the two commits together to main (to avoid a build of the release without a tag)
  3. Use the GitHub release tooling to tag the commit with the release version
  4. After the release has been built upload any artifacts to the GitHub release.

Are those steps correct?

@maho7791
Copy link

maho7791 commented Feb 29, 2024 via email

@bjhargrave
Copy link
Member

As far as I can tell the release process is as follows:

See https://github.com/osgi/osgi-test/wiki/Release-Process where the process is documented.

@timothyjward
Copy link
Contributor Author

I wanted to test the issue with the empty configuration.On the first sight it only worked for Configurations but not for the FactoryConfiguration.

@maho7791 if you do find a problem please include a test case, as the current unit tests pass. I am starting to use this function and have not yet seen any problems.

@kriegfrj
Copy link
Contributor

👍

Just wanted to add a big thank you to all those who have been working hard on osgi-test. Current circumstances do not permit my involvement to the level I have been involved in the past, and besides I'm not that familiar with the OSGi Configuration Manager (which is where it seems most of the activity is happening) so I'm happy to leave this to more experienced heads anyway. 😄 But just based on the amount of activity, it does seem like a new release would be timely. Congratulations team, keep up the good work!

@kriegfrj
Copy link
Contributor

Good to see that we have consensus - as for the process, is it necessary to create an RC1 tag first?

As far as I can tell the release process is as follows:

  1. Create two commits locally on main, the first changing the revision to a release version, the second to the next development version.
  2. Push the two commits together to main (to avoid a build of the release without a tag)
  3. Use the GitHub release tooling to tag the commit with the release version
  4. After the release has been built upload any artifacts to the GitHub release.

Are those steps correct?

They look broadly correct to me, though I've never been intimately involved in a release. @bjhargrave linked to the detailed steps above, but I just wanted to highlight one step that is often overlooked in our enthusiasm to get things out - updating the release notes:

https://github.com/osgi/osgi-test/wiki/Release-Notes-1.3.0

It's important so that you can all brag about all your hard work. 😉

@timothyjward
Copy link
Contributor Author

I've created the RC1 tag and updated the release notes. Hopefully all will be well and we can release at some point next week.

@timothyjward
Copy link
Contributor Author

timothyjward commented Mar 13, 2024

Attempting to test with the osgi/osgi build has flagged a longstanding issue - our dependency tree is somewhat mismatched.

Our base level of JUnit Jupiter is 5.6 (i.e. very old) but our base level of assertj is 3.24 (i.e. very new). The assertj code optionally requires JUnit Jupiter at 5.10. As we don't directly use the assertj JUnit API the uses constraint isn't triggered and you can therefore deploy a set of bundles which do this:

TEST org.osgi.test.cases.component.junit.FieldInjectionControl <<< ERROR: Type [unknown] not present
java.lang.TypeNotPresentException: Type [unknown] not present
	at java.base/sun.reflect.annotation.TypeNotPresentExceptionProxy.generateException(TypeNotPresentExceptionProxy.java:47)
	at java.base/sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:89)
	at jdk.proxy3/jdk.proxy3.$Proxy7.value(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at org.junit.jupiter.engine.extension.MutableExtensionRegistry.createRegistryFrom(MutableExtensionRegistry.java:103)
	at org.junit.jupiter.engine.descriptor.ExtensionUtils.populateNewExtensionRegistryFromExtendWithAnnotation(ExtensionUtils.java:74)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.prepare(ClassBasedTestDescriptor.java:145)
	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.prepare(ClassBasedTestDescriptor.java:80)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:123)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:123)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:90)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
	at aQute.tester.bundle.engine.BundleDescriptor.executeChild(BundleDescriptor.java:49)
	at aQute.tester.bundle.engine.BundleEngine.lambda$executeBundle$7(BundleEngine.java:120)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.executeBundle(BundleEngine.java:120)
	at aQute.tester.bundle.engine.BundleEngine.lambda$execute$5(BundleEngine.java:100)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.BundleEngine.execute(BundleEngine.java:100)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
	at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
	at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
	at aQute.tester.junit.platform.Activator.test(Activator.java:441)
	at aQute.tester.junit.platform.Activator.automatic(Activator.java:345)
	at aQute.tester.junit.platform.Activator.run(Activator.java:217)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at aQute.launcher.Launcher.handleMainCallable(Launcher.java:465)
	at aQute.launcher.Launcher.launch(Launcher.java:438)
	at aQute.launcher.Launcher.run(Launcher.java:186)
	at aQute.launcher.Launcher.main(Launcher.java:162)
	at aQute.launcher.pre.EmbeddedLauncher.executeWithRunPath(EmbeddedLauncher.java:170)
	at aQute.launcher.pre.EmbeddedLauncher.findAndExecute(EmbeddedLauncher.java:135)
	at aQute.launcher.pre.EmbeddedLauncher.main(EmbeddedLauncher.java:52)
Caused by: java.lang.NoClassDefFoundError: org/junit/jupiter/api/extension/TestInstancePostProcessor
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
	at org.eclipse.osgi.internal.loader.ModuleClassLoader.defineClass(ModuleClassLoader.java:283)
	at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.defineClass(ClasspathManager.java:716)
	at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findClassImpl(ClasspathManager.java:639)
	at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClassImpl(ClasspathManager.java:607)
	at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClassImpl(ClasspathManager.java:587)
	at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:566)
	at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:335)
	at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:397)
	at org.eclipse.osgi.internal.loader.sources.SingleSourcePackage.loadClass(SingleSourcePackage.java:41)
	at org.eclipse.osgi.internal.loader.BundleLoader.findClass0(BundleLoader.java:479)
	at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:416)
	at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:168)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:467)
	at java.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114)
	at java.base/sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125)
	at java.base/sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
	at java.base/sun.reflect.annotation.AnnotationParser.parseSig(AnnotationParser.java:441)
	at java.base/sun.reflect.annotation.AnnotationParser.parseClassValue(AnnotationParser.java:427)
	at java.base/sun.reflect.annotation.AnnotationParser.lambda$parseClassArray$0(AnnotationParser.java:715)
	at java.base/sun.reflect.annotation.AnnotationParser.parseArrayElements(AnnotationParser.java:743)
	at java.base/sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:714)
	at java.base/sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:527)
	at java.base/sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:352)
	at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:282)
	at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:227)
	at java.base/sun.reflect.annotation.AnnotationParser.lambda$parseAnnotationArray$2(AnnotationParser.java:732)
	at java.base/sun.reflect.annotation.AnnotationParser.parseArrayElements(AnnotationParser.java:743)
	at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotationArray(AnnotationParser.java:731)
	at java.base/sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:532)
	at java.base/sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:352)
	at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:282)
	at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:121)
	at java.base/sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:73)
	at java.base/java.lang.Class.createAnnotationData(Class.java:4068)
	at java.base/java.lang.Class.annotationData(Class.java:4057)
	at java.base/java.lang.Class.getAnnotations(Class.java:3980)
	at aQute.tester.bundle.engine.discovery.BundleSelectorResolver.tryToResolveTestClass(BundleSelectorResolver.java:389)
	at aQute.tester.bundle.engine.discovery.BundleSelectorResolver.lambda$getSelectorsFromTestCasesHeader$27(BundleSelectorResolver.java:408)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at aQute.libg.qtokens.QuotedTokenizer$TokenSpliterator.forEachRemaining(QuotedTokenizer.java:198)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
	at aQute.tester.bundle.engine.discovery.BundleSelectorResolver.getSelectorsFromTestCasesHeader(BundleSelectorResolver.java:420)
	at aQute.tester.bundle.engine.discovery.BundleSelectorResolver.computeChildren(BundleSelectorResolver.java:581)
	at aQute.tester.bundle.engine.discovery.BundleSelectorResolver.lambda$resolve$18(BundleSelectorResolver.java:276)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
	at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at aQute.tester.bundle.engine.discovery.BundleSelectorResolver.resolve(BundleSelectorResolver.java:270)
	at aQute.tester.bundle.engine.discovery.BundleSelectorResolver.resolve(BundleSelectorResolver.java:103)
	at aQute.tester.bundle.engine.BundleEngine.discover(BundleEngine.java:63)
	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:152)
	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverSafely(EngineDiscoveryOrchestrator.java:134)
	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:108)
	at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:80)
	at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:110)
	... 14 more
Caused by: java.lang.ClassNotFoundException: org.junit.jupiter.api.extension.TestInstancePostProcessor cannot be found by assertj-core_3.24.0
	at org.eclipse.osgi.internal.loader.BundleLoader.generateException(BundleLoader.java:541)
	at org.eclipse.osgi.internal.loader.BundleLoader.findClass0(BundleLoader.java:536)
	at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:416)
	at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:168)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
	... 86 more

I have tried rolling back to assertj 3.19 (the newest version that supports JUnit 5.6), but that causes test failures when running with the latest assertj. I think we will need to establish something in the middle, perhaps a mutual dependency on JUnit 5.8?

Does that seem like an acceptable compromise? If not then we can leave things as they are, but warn people to use a new enough JUnit Jupiter to satisfy assertj.

@bjhargrave
Copy link
Member

This is why smoke testing with the osgi/osgi build is useful :-)

@timothyjward
Copy link
Contributor Author

timothyjward commented Mar 13, 2024

1.3.0.RC2 is now tagged. Please let me know of any more issues that we find.

UPDATE the RC2 build works in the osgi/osgi build

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants