diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 3f0ccf3..0000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,2 +0,0 @@ -# https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners#codeowners-syntax -* @sschnabe @rpahli @fabian-schlegel @jschwarze @wistefan @monotek diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 415bfca..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: 2 -updates: - - package-ecosystem: maven - directory: / - schedule: - interval: daily - allow: - - dependency-name: io.kokuwa.maven:maven-parent - - dependency-name: org.keycloak:keycloak-quarkus-server - - package-ecosystem: github-actions - directory: / - schedule: - interval: monthly - day: monday diff --git a/.github/settings.xml b/.github/settings.xml deleted file mode 100644 index 44fd9ea..0000000 --- a/.github/settings.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - sonatype-nexus - ${env.SERVER_USERNAME} - ${env.SERVER_PASSWORD} - - - github.com - nope - ${env.GIT_ACTION_TOKEN} - - - diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml deleted file mode 100644 index 5ed003d..0000000 --- a/.github/workflows/build.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: Build - -on: - push: - branches: [main] - -jobs: - - build: - runs-on: ubuntu-latest - env: - MAVEN_ARGS: --batch-mode --color=always --no-transfer-progress --settings=.github/settings.xml - steps: - - run: git config --global user.name "${{ vars.KOKUWA_IO_BOT_NAME }}" - - run: git config --global user.email "${{ vars.KOKUWA_IO_BOT_EMAIL }}" - - uses: actions/checkout@v4 - with: - token: ${{ secrets.GIT_ACTION_TOKEN }} - - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: 17 - cache: maven - - run: mvn $MAVEN_ARGS deploy - env: - SERVER_USERNAME: ${{ secrets.SONATYPE_NEXUS_USERNAME }} - SERVER_PASSWORD: ${{ secrets.SONATYPE_NEXUS_PASSWORD }} - - run: mvn $MAVEN_ARGS site-deploy - env: - GIT_ACTION_TOKEN: ${{ secrets.GIT_ACTION_TOKEN }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml deleted file mode 100644 index e3240ed..0000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,50 +0,0 @@ -name: Release - -on: workflow_dispatch - -jobs: - build: - runs-on: ubuntu-latest - env: - MAVEN_ARGS: --batch-mode --color=always --no-transfer-progress --settings=.github/settings.xml - steps: - - name: docker/login-action docker.io - uses: docker/login-action@v3.4.0 - with: - registry: docker.io - username: ${{ secrets.DOCKERIO_USERNAME }} - password: ${{ secrets.DOCKERIO_TOKEN }} - - name: docker/login-action ghcr.io - uses: docker/login-action@v3.4.0 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GIT_ACTION_TOKEN }} - - run: git config --global user.name "${{ vars.KOKUWA_IO_BOT_NAME }}" - - run: git config --global user.email "${{ vars.KOKUWA_IO_BOT_EMAIL }}" - - uses: actions/checkout@v4 - with: - token: ${{ secrets.GIT_ACTION_TOKEN }} - - uses: crazy-max/ghaction-import-gpg@v6 - with: - gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} - passphrase: ${{ secrets.GPG_PASSPHRASE }} - git_user_signingkey: true - git_commit_gpgsign: true - - uses: actions/setup-java@v4 - with: - distribution: temurin - java-version: 17 - cache: maven - server-id: sonatype-nexus - server-username: SERVER_USERNAME - server-password: SERVER_PASSWORD - gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} - gpg-passphrase: GPG_PASSPHRASE - - run: mvn $MAVEN_ARGS release:prepare -Darguments="$MAVEN_ARGS" - - run: mvn $MAVEN_ARGS release:perform -Darguments="$MAVEN_ARGS" - env: - SERVER_USERNAME: ${{ secrets.SONATYPE_NEXUS_USERNAME }} - SERVER_PASSWORD: ${{ secrets.SONATYPE_NEXUS_PASSWORD }} - GIT_ACTION_TOKEN: ${{ secrets.GIT_ACTION_TOKEN }} - GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/verify.yaml similarity index 58% rename from .github/workflows/pr.yaml rename to .github/workflows/verify.yaml index 86a8eb1..3238458 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/verify.yaml @@ -1,44 +1,43 @@ -name: PullRequest +name: Verify -on: pull_request +on: + - pull_request + - push: + branches: [main] env: MAVEN_ARGS: --batch-mode --color=always --no-transfer-progress -Dmaven.test.redirectTestOutputToFile=false jobs: - yaml: + renovate: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: ibiqlik/action-yamllint@v3 - with: - format: colored - strict: true + - uses: actions/checkout@main + - uses: docker://kokuwaio/renovate-config-validator - markdown: + markdownlint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: avto-dev/markdown-lint@v1 - with: - args: /github/workspace + - uses: actions/checkout@main + - uses: docker://kokuwaio/markdownlint + + yamllint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@main + - uses: docker://kokuwaio/yamllint build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@main + - uses: actions/setup-java@main with: distribution: temurin java-version: 17 cache: maven - run: mvn $MAVEN_ARGS verify - - run: mvn $MAVEN_ARGS site - - uses: actions/upload-artifact@v4 - if: always() - with: - path: target/site versions: runs-on: ubuntu-latest @@ -54,8 +53,8 @@ jobs: - 26.1.5 - 26.2.1 steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - uses: actions/checkout@main + - uses: actions/setup-java@main with: distribution: temurin java-version: 17 diff --git a/.woodpecker/build.yaml b/.woodpecker/build.yaml new file mode 100644 index 0000000..a738643 --- /dev/null +++ b/.woodpecker/build.yaml @@ -0,0 +1,29 @@ +when: + event: [manual, push] + branch: main + path: [.woodpecker/build.yaml, pom.xml, src/**] + +services: + - name: dockerd + image: kokuwaio/dockerd + ports: [2375, 8080] + +steps: + + build: + image: maven:3.9.9-eclipse-temurin-17 + commands: + - env | sort + - mvn deploy --settings=.woodpecker/maven/settings.xml -Dmaven.test.redirectTestOutputToFile=true -X + environment: + NEXUS_USERNAME: {from_secret: nexus_username} + NEXUS_PASSWORD: {from_secret: nexus_password} + + debug: + image: kokuwaio/dockerd + commands: + - docker ps --all + - docker logs keylcoak + - exit 1 + when: + status: failure diff --git a/.woodpecker/lint.yaml b/.woodpecker/lint.yaml new file mode 100644 index 0000000..74bb114 --- /dev/null +++ b/.woodpecker/lint.yaml @@ -0,0 +1,21 @@ +when: + event: [manual, pull_request, push] + branch: main + path: [.woodpecker/lint.yaml, renovate.json, "**/*.y*ml", "**/*.md"] + +steps: + + renovate: + image: kokuwaio/renovate-config-validator + depends_on: [] + when: [path: [.woodpecker/lint.yaml, renovate.json]] + + yaml: + image: kokuwaio/yamllint + depends_on: [] + when: [path: [.woodpecker/lint.yaml, .yamllint.yaml, "**/*.y*ml"]] + + markdown: + image: kokuwaio/markdownlint + depends_on: [] + when: [path: [.woodpecker/lint.yaml, .markdownlint.yaml, "**/*.md"]] diff --git a/.woodpecker/maven/settings.xml b/.woodpecker/maven/settings.xml new file mode 100644 index 0000000..9676f61 --- /dev/null +++ b/.woodpecker/maven/settings.xml @@ -0,0 +1,18 @@ + + + false + /woodpecker/.m2 + + + sonatype-nexus + ${env.NEXUS_USERNAME} + ${env.NEXUS_PASSWORD} + + + + + http://mirror.woodpecker.svc/maven2 + central + + + diff --git a/.woodpecker/verify.yaml b/.woodpecker/verify.yaml new file mode 100644 index 0000000..3b16e79 --- /dev/null +++ b/.woodpecker/verify.yaml @@ -0,0 +1,23 @@ +when: + event: [manual, pull_request] + path: [.woodpecker/verify.yaml, pom.xml, src/**] + +matrix: + KEYCLOAK_VERSION: + - 22.0.5 + - 23.0.7 + - 24.0.5 + - 25.0.6 + - 26.0.8 + - 26.1.5 + - 26.2.5 + +services: + - name: dockerd + image: kokuwaio/dockerd + ports: [2375, 8080] + +steps: + verify: + image: maven:3.9.9-eclipse-temurin-17 + commands: mvn verify --settings=.woodpecker/maven/settings.xml -Dversion.org.keycloak.test=$KEYCLOAK_VERSION diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..942e54b --- /dev/null +++ b/renovate.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "labels": ["renovate", "renovate-manager/{{{manager}}}", "renovate-type/{{{updateType}}}"], + "dependencyDashboard": true, + "dependencyDashboardLabels": ["renovate"], + "dependencyDashboardApproval": true, + "dependencyDashboardOSVVulnerabilitySummary": "all", + "separateMajorMinor": true, + "separateMinorPatch": true, + "separateMultipleMinor": true, + "separateMultipleMajor": true, + "pinDigests": true, + "automerge": false, + "automergeStrategy": "fast-forward", + "rebaseWhen": "behind-base-branch", + "packageRules": [ + { + "matchUpdateTypes": ["digest"], + "dependencyDashboardApproval": false, + "automergeType": "branch" + },{ + "matchUpdateTypes": ["patch"], + "dependencyDashboardApproval": false, + "automerge": true + },{ + "matchUpdateTypes": ["minor"], + "dependencyDashboardApproval": false + },{ + "matchManagers": ["woodpecker"], + "pinDigests": false + } + ] +} diff --git a/src/test/java/io/kokuwa/keycloak/metrics/junit/KeycloakExtension.java b/src/test/java/io/kokuwa/keycloak/metrics/junit/KeycloakExtension.java index e2b1175..df5bd0e 100644 --- a/src/test/java/io/kokuwa/keycloak/metrics/junit/KeycloakExtension.java +++ b/src/test/java/io/kokuwa/keycloak/metrics/junit/KeycloakExtension.java @@ -13,6 +13,7 @@ import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.api.extension.ParameterResolver; import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.token.TokenService; +import org.testcontainers.containers.FixedHostPortGenericContainer; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.MountableFile; @@ -29,6 +30,7 @@ public class KeycloakExtension implements BeforeAllCallback, ParameterResolver { private static KeycloakClient client; private static Prometheus prometheus; + @SuppressWarnings({ "resource", "deprecation" }) @Override public void beforeAll(ExtensionContext context) throws Exception { @@ -45,14 +47,20 @@ public class KeycloakExtension implements BeforeAllCallback, ParameterResolver { throw new Exception("Failed to read properties", e); } var version = properties.getProperty("version"); + var image = "quay.io/keycloak/keycloak:" + version; var jar = properties.getProperty("jar"); var timeout = properties.getProperty("timeout"); // create and start container - @SuppressWarnings("resource") - var container = new GenericContainer<>("quay.io/keycloak/keycloak:" + version) - .withEnv("KEYCLOAK_ADMIN", "admin") + var container = new GenericContainer<>(image).withExposedPorts(8080); + if (System.getenv("CI") != null) { + // use fixed port and hostname in ci + container = new FixedHostPortGenericContainer<>(image) + .withFixedExposedPort(8080, 8080) + .withCreateContainerCmdModifier(c -> c.withName("keycloak")); + } + container.withEnv("KEYCLOAK_ADMIN", "admin") .withEnv("KEYCLOAK_ADMIN_PASSWORD", "password") .withEnv("KC_LOG_LEVEL", "io.kokuwa:trace") // otherwise port 9000 will be used, with this config we can test different keycloak versions @@ -63,7 +71,6 @@ public class KeycloakExtension implements BeforeAllCallback, ParameterResolver { .withEnv("KC_METRICS_STATS_INTERVAL", "PT1s") .withCopyFileToContainer(MountableFile.forHostPath(jar), "/opt/keycloak/providers/metrics.jar") .withLogConsumer(out -> System.out.print(out.getUtf8String())) - .withExposedPorts(8080) .withStartupTimeout(Duration.parse(timeout)) .waitingFor(Wait.forHttp("/health").forPort(8080)) .withCommand("start-dev"); @@ -76,6 +83,12 @@ public class KeycloakExtension implements BeforeAllCallback, ParameterResolver { // create client for keycloak container var url = "http://" + container.getHost() + ":" + container.getMappedPort(8080); + System.out.println(container.getHost()); + System.out.println(container.getHost()); + System.out.println(container.getHost()); + System.out.println(container.getExtraHosts()); + System.out.println(container.getExtraHosts()); + System.out.println(container.getExtraHosts()); var keycloak = Keycloak.getInstance(url, "master", "admin", "password", "admin-cli"); assertEquals(version, keycloak.serverInfo().getInfo().getSystemInfo().getVersion(), "version invalid"); var target = ClientBuilder.newClient().target(url);