diff --git a/.automation/build-rpm.sh b/.automation/build-rpm.sh deleted file mode 100755 index dc4eab1..0000000 --- a/.automation/build-rpm.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -xe - -source $(dirname "$(readlink -f "$0")")/build-srpm.sh - -# Install build dependencies -dnf builddep -y rpmbuild/SRPMS/*src.rpm - -# Build binary package -rpmbuild \ - --define "_topmdir rpmbuild" \ - --define "_rpmdir rpmbuild" \ - --rebuild rpmbuild/SRPMS/*src.rpm - -# Move RPMs to exported artifacts -[[ -d $ARTIFACTS_DIR ]] || mkdir -p $ARTIFACTS_DIR -find rpmbuild -iname \*rpm | xargs mv -t $ARTIFACTS_DIR diff --git a/.automation/build-srpm.sh b/.automation/build-srpm.sh deleted file mode 100755 index cd2270c..0000000 --- a/.automation/build-srpm.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -xe - -# Directory, where build artifacts will be stored, should be passed as the 1st parameter -ARTIFACTS_DIR=${1:-exported-artifacts} -export ARTIFACTS_DIR - -# Prepare source archive -[[ -d rpmbuild/SOURCES ]] || mkdir -p rpmbuild/SOURCES - -./autogen.sh --system -./configure - -# clean -rm -rf rpmbuild/SOURCES/* -make clean - -# build tarballs -make dist - -# SUFFIX=".$(date -u +%Y%m%d%H%M%S).git$(git rev-parse --short HEAD)" - -# Build SRPMs -rpmbuild \ - -D "_topdir rpmbuild" \ - ${SUFFIX:+ -D "release_suffix ${SUFFIX}"} \ - -ts ./*.tar.gz diff --git a/.copr/Makefile b/.copr/Makefile deleted file mode 100644 index dac2433..0000000 --- a/.copr/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -.PHONY: installdeps srpm git-safe - -installdeps: - dnf -y install \ - apache-commons-lang3 \ - autoconf \ - automake \ - createrepo_c \ - dnf-utils \ - findutils \ - gcc \ - git \ - jackson-annotations \ - jackson-core \ - jackson-databind \ - java-21-openjdk-devel \ - javapackages-tools \ - make \ - maven-source-plugin \ - maven \ - rpm-build \ - slf4j \ - slf4j-jdk14 \ - sed - -# explicity mark the copr generated git repo directory (which is done prior to the mock -# # call to the make_srpm and will be the current pwd) as safe for git commands -git-safe: - git config --global --add safe.directory "$(shell pwd)" - -srpm: installdeps git-safe - # $(eval SUFFIX=$(shell sh -c " echo '.$$(date -u +%Y%m%d%H%M%S).git$$(git rev-parse --short HEAD)'")) - # changing the spec file as passing -D won't preserve the suffix when rebuilding in mock - # sed "s:%{?release_suffix}:${SUFFIX}:" -i vdsm-jsonrpc-java.spec.in - .automation/build-srpm.sh - cp rpmbuild/SRPMS/$(shell sh -c "basename '$(spec)'|cut -f1 -d.")*.src.rpm $(outdir) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3020811..bf78067 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,7 +1,10 @@ +--- name: build + on: push: branches: [master] + tags: ['*'] pull_request: branches: [master] workflow_dispatch: @@ -9,60 +12,106 @@ on: jobs: build: runs-on: ubuntu-latest - name: Test and build - container: - image: quay.io/ovirt/buildcontainer:el10stream - - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - name: Run maven build - run: | - ./autogen.sh - ./configure - mvn test -P\!slow-tests-disabled - - build-rpms: - runs-on: ubuntu-latest - needs: build + permissions: + contents: read strategy: fail-fast: false matrix: include: + - name: almalinux-9 + shortcut: el9 + container-name: almalinux9 + - name: almalinux-10 + shortcut: el10 + container-name: almalinux10 - name: centos-stream-9 - shortcut: cs9 + shortcut: el9s container-name: el9stream - name: centos-stream-10 - shortcut: cs10 + shortcut: el10s container-name: el10stream - name: ${{ matrix.name }} - - env: - ARTIFACTS_DIR: exported-artifacts - + name: Build on ${{ matrix.name }} container: image: quay.io/ovirt/buildcontainer:${{ matrix.container-name }} steps: + - name: Checkout sources + uses: actions/checkout@v7 - - name: Checkout sources - uses: ovirt/checkout-action@main + - name: Mark repository as safe + run: git config --global --add safe.directory "$(pwd)" - - name: Mark git repo as safe - run: git config --global --add safe.directory $(pwd) + - name: Install dependencies + run: | + dnf install -y \ + apache-commons-lang3 \ + autoconf \ + automake \ + gcc \ + git \ + jackson-annotations \ + jackson-core \ + jackson-databind \ + java-21-openjdk-devel \ + javapackages-tools \ + junit \ + make \ + maven \ + maven-local-openjdk21 \ + maven-source-plugin \ + mockito \ + rpm-build \ + slf4j \ + slf4j-jdk14 + + - name: Set build environment + run: | + TAG=$(git tag --points-at HEAD | head -1) + if [[ -n "$TAG" ]]; then + if [[ "$TAG" =~ -([0-9]+)$ ]]; then + echo "PACKAGE_RPM_RELEASE=${BASH_REMATCH[1]}" >> $GITHUB_ENV + else + echo "PACKAGE_RPM_RELEASE=1" >> $GITHUB_ENV + fi + else + echo "RELEASE_SUFFIX=.$(date --utc +%Y%m%d%H%M%S).git$(git rev-parse --short HEAD)" >> $GITHUB_ENV + fi + + - name: Autogen + run: ./autogen.sh + + - name: Configure + run: ./configure + + - name: Run tests + run: mvn test -P\!slow-tests-disabled + + - name: Build RPM + run: make -j rpm + + - name: Collect artifacts + run: | + mkdir -p exported-artifacts + find tmp.repos -iname \*rpm -exec mv "{}" exported-artifacts/ \; + mv ./*tar.gz exported-artifacts/ - - name: Perform build - run: | - .automation/build-rpm.sh $ARTIFACTS_DIR + - name: Upload artifacts + uses: actions/upload-artifact@v7 + with: + name: rpm-${{ matrix.shortcut }} + path: exported-artifacts - - name: Upload artifacts - uses: ovirt/upload-rpms-action@main - with: - directory: ${{ env.ARTIFACTS_DIR }} + publish-rpms: + permissions: + artifact-metadata: read + needs: build + if: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }} + uses: ovirt/ovirt-workflows/.github/workflows/publish-rpms.yml@main + secrets: inherit publish-snapshot: - needs: build-rpms + needs: build if: ${{ github.ref == 'refs/heads/master' }} runs-on: ubuntu-latest name: Publish snapshot to maven central @@ -72,13 +121,13 @@ jobs: steps: - name: Checkout sources - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Mark git repo as safe run: git config --global --add safe.directory $(pwd) - name: Use cache for maven - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/Makefile.am b/Makefile.am index c782b52..bd2140f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -19,7 +19,27 @@ AUTOMAKE_OPTIONS = foreign 1.9 ACLOCAL_AMFLAGS = -I m4 +SHELL := /bin/bash +TMPREPOS = tmp.repos +RPMBUILD_ARGS := --define="_topdir `pwd`/$(TMPREPOS)" +RPMBUILD_ARGS += $(if $(RELEASE_SUFFIX), --define="release_suffix $(RELEASE_SUFFIX)") + +srpm: dist + rm -fr "$(TMPREPOS)" + mkdir -p $(TMPREPOS)/{SPECS,RPMS,SRPMS,SOURCES} + rpmbuild $(RPMBUILD_ARGS) -ts "$(PACKAGE_TARNAME)-$(PACKAGE_VERSION).tar.gz" + @echo + @echo "srpm available at '$(TMPREPOS)'" + @echo + +rpm: srpm + rpmbuild $(RPMBUILD_ARGS) --rebuild "$(TMPREPOS)"/SRPMS/*.src.rpm + @echo + @echo "rpm(s) available at '$(TMPREPOS)'" + @echo + +.PHONY: srpm rpm MAINTAINERCLEANFILES = \ config.log config.status \ $(srcdir)/Makefile.in \ @@ -46,7 +66,7 @@ dist_noinst_DATA = \ $(NULL) clean-local: - rm -fr target + rm -fr target tmp.repos if !WITH_DIST_ONLY $(MVN) clean endif diff --git a/client/src/main/java/org/ovirt/vdsm/jsonrpc/client/reactors/ReactorListener.java b/client/src/main/java/org/ovirt/vdsm/jsonrpc/client/reactors/ReactorListener.java index d83704a..1ac09a0 100644 --- a/client/src/main/java/org/ovirt/vdsm/jsonrpc/client/reactors/ReactorListener.java +++ b/client/src/main/java/org/ovirt/vdsm/jsonrpc/client/reactors/ReactorListener.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.net.InetSocketAddress; +import java.net.StandardSocketOptions; import java.nio.channels.ClosedChannelException; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; @@ -45,6 +46,7 @@ private ServerSocketChannel setupChannel(InetSocketAddress address) serverSocketChannel.configureBlocking(false); try { + serverSocketChannel.setOption(StandardSocketOptions.SO_REUSEADDR, true); serverSocketChannel.register(this.selector, SelectionKey.OP_ACCEPT, this); log.debug("Binding to {}", address); serverSocketChannel.bind(address); diff --git a/client/src/test/java/org/ovirt/vdsm/jsonrpc/client/reactors/ReactorTestCase.java b/client/src/test/java/org/ovirt/vdsm/jsonrpc/client/reactors/ReactorTestCase.java index 6ecf597..05e19fa 100644 --- a/client/src/test/java/org/ovirt/vdsm/jsonrpc/client/reactors/ReactorTestCase.java +++ b/client/src/test/java/org/ovirt/vdsm/jsonrpc/client/reactors/ReactorTestCase.java @@ -118,10 +118,6 @@ public void testNotConnectedRetry() throws InterruptedException, TimeoutExceptio assertTrue(closeTask.isDone()); futureListener = this.reactorForListener.createListener(HOSTNAME, - //fixme this port is occasionally not free. Most likely it is because of combination of - // 1. its state in TIME_WAIT where it enters after listener.close() - // 2. and delayed TCP packets(fragments) more details at [1] - // [1] https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux port, _client -> _client.addEventListener(_client::sendMessage)); diff --git a/configure.ac b/configure.ac index 3746016..bf69377 100644 --- a/configure.ac +++ b/configure.ac @@ -21,13 +21,15 @@ AC_PREREQ(2.60) define([VERSION_MAJOR], [1]) define([VERSION_MINOR], [7]) -define([VERSION_FIX], [4]) +define([VERSION_FIX], [5]) define([VERSION_NUMBER], VERSION_MAJOR[.]VERSION_MINOR[.]VERSION_FIX) -define([VERSION_SUFFIX], []) -AC_INIT([vdsm-jsonrpc-java], VERSION_NUMBER[]VERSION_SUFFIX) +AC_INIT([vdsm-jsonrpc-java], VERSION_NUMBER) PACKAGE_RPM_VERSION="VERSION_NUMBER" -PACKAGE_RPM_RELEASE="1" +AC_ARG_VAR([PACKAGE_RPM_RELEASE], + [RPM release field (default: 0.master for development, release number for release builds)]) +AS_IF([test -z "$PACKAGE_RPM_RELEASE"], + [PACKAGE_RPM_RELEASE="0.master"]) PACKAGE_MAVEN_VERSION="VERSION_MAJOR.VERSION_MINOR.VERSION_FIX" AC_SUBST([PACKAGE_RPM_VERSION]) AC_SUBST([PACKAGE_RPM_RELEASE])