Rewrite build config to kokuwa.io infrastructure
Some checks failed
ci/woodpecker/push/lint Pipeline was successful
ci/woodpecker/manual/lint Pipeline was successful
ci/woodpecker/push/build Pipeline failed
ci/woodpecker/manual/verify/2 Pipeline was successful
ci/woodpecker/manual/verify/1 Pipeline was successful
ci/woodpecker/manual/verify/3 Pipeline was successful
ci/woodpecker/manual/verify/4 Pipeline was successful
ci/woodpecker/manual/verify/6 Pipeline failed
ci/woodpecker/manual/verify/5 Pipeline was successful
ci/woodpecker/manual/build Pipeline failed
Some checks failed
ci/woodpecker/push/lint Pipeline was successful
ci/woodpecker/manual/lint Pipeline was successful
ci/woodpecker/push/build Pipeline failed
ci/woodpecker/manual/verify/2 Pipeline was successful
ci/woodpecker/manual/verify/1 Pipeline was successful
ci/woodpecker/manual/verify/3 Pipeline was successful
ci/woodpecker/manual/verify/4 Pipeline was successful
ci/woodpecker/manual/verify/6 Pipeline failed
ci/woodpecker/manual/verify/5 Pipeline was successful
ci/woodpecker/manual/build Pipeline failed
This commit is contained in:
parent
61e7955732
commit
99bc326021
17 changed files with 305 additions and 399 deletions
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
|
@ -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
|
14
.github/dependabot.yml
vendored
14
.github/dependabot.yml
vendored
|
@ -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
|
16
.github/settings.xml
vendored
16
.github/settings.xml
vendored
|
@ -1,16 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- https://github.com/actions/setup-java/issues/85 -->
|
||||
<settings>
|
||||
<servers>
|
||||
<server>
|
||||
<id>sonatype-nexus</id>
|
||||
<username>${env.SERVER_USERNAME}</username>
|
||||
<password>${env.SERVER_PASSWORD}</password>
|
||||
</server>
|
||||
<server>
|
||||
<id>github.com</id>
|
||||
<username>nope</username>
|
||||
<password>${env.GIT_ACTION_TOKEN}</password>
|
||||
</server>
|
||||
</servers>
|
||||
</settings>
|
68
.github/workflows/build.yaml
vendored
68
.github/workflows/build.yaml
vendored
|
@ -1,50 +1,42 @@
|
|||
name: Build
|
||||
name: Verify
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
- pull_request
|
||||
- push:
|
||||
branches: [main]
|
||||
|
||||
env:
|
||||
MAVEN_ARGS: --batch-mode --color=always --no-transfer-progress
|
||||
|
||||
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
|
||||
- uses: actions/checkout@main
|
||||
- uses: actions/setup-java@main
|
||||
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 deploy
|
||||
env:
|
||||
SERVER_USERNAME: ${{ secrets.SONATYPE_NEXUS_USERNAME }}
|
||||
SERVER_PASSWORD: ${{ secrets.SONATYPE_NEXUS_PASSWORD }}
|
||||
- run: mvn verify
|
||||
|
||||
versions:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
version:
|
||||
- 22.0.5
|
||||
- 23.0.7
|
||||
- 24.0.5
|
||||
- 25.0.6
|
||||
- 26.2.5
|
||||
steps:
|
||||
- uses: actions/checkout@main
|
||||
- uses: actions/setup-java@main
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 17
|
||||
cache: maven
|
||||
- run: mvn verify -Dversion.org.keycloak.test=${{ matrix.version }}
|
||||
|
|
23
.github/workflows/lint.yaml
vendored
Normal file
23
.github/workflows/lint.yaml
vendored
Normal file
|
@ -0,0 +1,23 @@
|
|||
name: Lint
|
||||
|
||||
on: push
|
||||
|
||||
jobs:
|
||||
|
||||
renovate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@main
|
||||
- uses: docker://kokuwaio/renovate-config-validator
|
||||
|
||||
markdownlint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@main
|
||||
- uses: docker://kokuwaio/markdownlint
|
||||
|
||||
yamllint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@main
|
||||
- uses: docker://kokuwaio/yamllint
|
58
.github/workflows/pr.yaml
vendored
58
.github/workflows/pr.yaml
vendored
|
@ -1,58 +0,0 @@
|
|||
name: PullRequest
|
||||
|
||||
on: pull_request
|
||||
|
||||
env:
|
||||
MAVEN_ARGS: --batch-mode --color=always --no-transfer-progress
|
||||
|
||||
jobs:
|
||||
|
||||
yaml:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ibiqlik/action-yamllint@v3
|
||||
with:
|
||||
format: colored
|
||||
strict: true
|
||||
|
||||
markdown:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: avto-dev/markdown-lint@v1
|
||||
with:
|
||||
args: /github/workspace
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 17
|
||||
cache: maven
|
||||
- run: mvn $MAVEN_ARGS verify
|
||||
|
||||
versions:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
version:
|
||||
- 22.0.5
|
||||
- 23.0.7
|
||||
- 24.0.5
|
||||
- 25.0.6
|
||||
- 26.0.8
|
||||
- 26.1.5
|
||||
- 26.2.5
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 17
|
||||
cache: maven
|
||||
- run: mvn $MAVEN_ARGS verify -Dcheck.skip -Dversion.org.keycloak.test=${{ matrix.version }}
|
50
.github/workflows/release.yaml
vendored
50
.github/workflows/release.yaml
vendored
|
@ -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 }}
|
39
.woodpecker/build.yaml
Normal file
39
.woodpecker/build.yaml
Normal file
|
@ -0,0 +1,39 @@
|
|||
when:
|
||||
instance: ci.kokuwa.io
|
||||
repo: keycloak/keycloak-event-metrics
|
||||
event: [manual, push]
|
||||
branch: main
|
||||
path: [.woodpecker/build.yaml, pom.xml, src/main/**]
|
||||
|
||||
services:
|
||||
- name: dockerd
|
||||
image: kokuwaio/dockerd
|
||||
privileged: true
|
||||
ports: [2375, 8080]
|
||||
|
||||
steps:
|
||||
|
||||
deploy:
|
||||
image: maven:3.9.9-eclipse-temurin-17
|
||||
commands: mvn deploy
|
||||
environment:
|
||||
MAVEN_ARGS: --batch-mode --color=always --no-transfer-progress --settings=.woodpecker/maven/settings.xml
|
||||
MAVEN_GPG_KEY: {from_secret: woodpecker_gpg_key}
|
||||
SONATYPE_ORG_USERNAME: {from_secret: sonatype_org_username}
|
||||
SONATYPE_ORG_PASSWORD: {from_secret: sonatype_org_password}
|
||||
|
||||
release:
|
||||
image: maven:3.9.9-eclipse-temurin-17
|
||||
commands:
|
||||
- git config user.email "$GIT_USER_EMAIL"
|
||||
- git config user.name "$GIT_USER_NAME"
|
||||
- mvn release:prepare release:perform --settings=.woodpecker/maven/settings.xml
|
||||
environment:
|
||||
MAVEN_ARGS: --batch-mode --color=always --no-transfer-progress -DskipTests -DautoPublish=false
|
||||
MAVEN_GPG_KEY: {from_secret: woodpecker_gpg_key}
|
||||
SONATYPE_ORG_USERNAME: {from_secret: sonatype_org_username}
|
||||
SONATYPE_ORG_PASSWORD: {from_secret: sonatype_org_password}
|
||||
DOCKER_IO_USERNAME: {from_secret: docker_io_username}
|
||||
DOCKER_IO_PASSWORD: {from_secret: docker_io_password}
|
||||
GHCR_IO_USERNAME: {from_secret: ghcr_io_username}
|
||||
GHCR_IO_PASSWORD: {from_secret: ghcr_io_password}
|
21
.woodpecker/lint.yaml
Normal file
21
.woodpecker/lint.yaml
Normal file
|
@ -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"]]
|
28
.woodpecker/maven/settings.xml
Normal file
28
.woodpecker/maven/settings.xml
Normal file
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
|
||||
<interactiveMode>false</interactiveMode>
|
||||
<localRepository>/woodpecker/.m2</localRepository>
|
||||
<servers>
|
||||
<server>
|
||||
<id>sonatype.org</id>
|
||||
<username>${env.SONATYPE_ORG_USERNAME}</username>
|
||||
<password>${env.SONATYPE_ORG_PASSWORD}</password>
|
||||
</server>
|
||||
<server>
|
||||
<id>docker.io</id>
|
||||
<username>${env.DOCKER_IO_USERNAME}</username>
|
||||
<password>${env.DOCKER_IO_PASSWORD}</password>
|
||||
</server>
|
||||
<server>
|
||||
<id>ghcr.io</id>
|
||||
<username>${env.GHCR_IO_USERNAME}</username>
|
||||
<password>${env.GHCR_IO_PASSWORD}</password>
|
||||
</server>
|
||||
</servers>
|
||||
<mirrors>
|
||||
<mirror>
|
||||
<url>http://mirror.woodpecker.svc.cluster.local/maven2</url>
|
||||
<mirrorOf>central</mirrorOf>
|
||||
</mirror>
|
||||
</mirrors>
|
||||
</settings>
|
25
.woodpecker/release.yaml
Normal file
25
.woodpecker/release.yaml
Normal file
|
@ -0,0 +1,25 @@
|
|||
when:
|
||||
instance: ci.kokuwa.io
|
||||
repo: keycloak/keycloak-event-metrics
|
||||
event: deployment
|
||||
branch: main
|
||||
|
||||
services:
|
||||
- name: dockerd
|
||||
image: kokuwaio/dockerd
|
||||
ports: [2375, 8080]
|
||||
|
||||
steps:
|
||||
|
||||
deploy:
|
||||
image: maven:3.9.9-eclipse-temurin-17
|
||||
commands: mvn release:prepare release:perform --settings=.woodpecker/maven/settings.xml
|
||||
environment:
|
||||
MAVEN_ARGS: --batch-mode --color=always --no-transfer-progress -DskipTests -DautoPublish=false
|
||||
MAVEN_GPG_KEY: {from_secret: woodpecker_gpg_key}
|
||||
SONATYPE_ORG_USERNAME: {from_secret: sonatype_org_username}
|
||||
SONATYPE_ORG_PASSWORD: {from_secret: sonatype_org_password}
|
||||
DOCKER_IO_USERNAME: {from_secret: docker_io_username}
|
||||
DOCKER_IO_PASSWORD: {from_secret: docker_io_password}
|
||||
GHCR_IO_USERNAME: {from_secret: ghcr_io_username}
|
||||
GHCR_IO_PASSWORD: {from_secret: ghcr_io_password}
|
23
.woodpecker/verify.yaml
Normal file
23
.woodpecker/verify.yaml
Normal file
|
@ -0,0 +1,23 @@
|
|||
when:
|
||||
event: [manual, pull_request]
|
||||
path: [.woodpecker/verify.yaml, pom.xml, src/main/**]
|
||||
|
||||
matrix:
|
||||
KEYCLOAK_VERSION:
|
||||
- 22.0.5
|
||||
- 23.0.7
|
||||
- 24.0.5
|
||||
- 25.0.6
|
||||
- 26.2.5
|
||||
- $version.org.keycloak
|
||||
|
||||
services:
|
||||
- name: dockerd
|
||||
image: kokuwaio/dockerd
|
||||
privileged: true
|
||||
ports: [2375, 8080]
|
||||
|
||||
steps:
|
||||
verify:
|
||||
image: maven:3.9.9-eclipse-temurin-17
|
||||
commands: mvn test -Dversion.org.keycloak.test=$KEYCLOAK_VERSION --batch-mode --color=always --no-transfer-progress --settings=.woodpecker/maven/settings.xml
|
31
Dockerfile
Normal file
31
Dockerfile
Normal file
|
@ -0,0 +1,31 @@
|
|||
FROM docker.io/library/maven:3.9.9-eclipse-temurin-17 AS mvn
|
||||
WORKDIR /app
|
||||
ARG MAVEN_ARGS="--batch-mode --color=always --no-transfer-progress -DskipTests -P=-dev"
|
||||
ARG MAVEN_MIRROR_CENTRAL=https://mirror.grayc.io/maven2
|
||||
RUN mkdir "$HOME/.m2" && printf "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
|
||||
<settings>\n\
|
||||
<localRepository>/tmp/mvn-repo</localRepository>\n\
|
||||
<mirrors>\n\
|
||||
<mirror>\n\
|
||||
<url>%s</url>\n\
|
||||
<mirrorOf>central</mirrorOf>\n\
|
||||
</mirror>\n\
|
||||
</mirrors>\n\
|
||||
</settings>" "$MAVEN_MIRROR_CENTRAL" > "$HOME/.m2/settings.xml" && cat "$HOME/.m2/settings.xml"
|
||||
COPY pom.xml lombok.config ./
|
||||
COPY api/pom.xml api/pom.xml
|
||||
COPY service/pom.xml service/pom.xml
|
||||
RUN mvn install -N
|
||||
COPY .git /
|
||||
COPY api/ api/
|
||||
RUN mvn install -pl api
|
||||
COPY service/ service/
|
||||
RUN mvn install -pl service
|
||||
|
||||
FROM docker.io/library/eclipse-temurin:21.0.7_6-jre@sha256:031eb6ccad828004407c0a41f6a4009a08289961d55e9119287c28756522a945
|
||||
COPY service/target/libs /app/libs
|
||||
COPY service/target/minoa-service-*.jar /app/minoa.jar
|
||||
COPY api/openapi.yaml /static/openapi.yaml
|
||||
COPY --from=app /app/dist /static
|
||||
COPY --from=mkdocs-user-manual /mkdocs/site /static/docs
|
||||
ENTRYPOINT ["java", "-XX:+ExitOnOutOfMemoryError", "-jar", "/app/minoa.jar"]
|
23
README.md
23
README.md
|
@ -1,10 +1,15 @@
|
|||
# Keycloak Metrics
|
||||
# Keycloak Event Metrics
|
||||
|
||||
Provides metrics for Keycloak user/admin events and user/client/session count. Tested on Keycloak [22-26](.github/workflows/pr.yaml#L48-L53).
|
||||
Provides metrics for Keycloak user/admin events and user/client/session count. Tested on Keycloak [22-26](.woodpecker/verify.yaml#L7-L11).
|
||||
|
||||
[](http://www.apache.org/licenses/)
|
||||
[](https://central.sonatype.com/search?namespace=io.kokuwa.keycloak&q=keycloak-event-metrics)
|
||||
[](https://github.com/kokuwaio/keycloak-event-metrics/actions/workflows/build.yaml)
|
||||
[](https://central.sonatype.com/search?namespace=io.kokuwa.keycloak&q=keycloak-event-metrics)
|
||||
[](https://hub.docker.com/r/kokuwaio/keycloak-event-metrics)
|
||||
[](https://hub.docker.com/r/kokuwaio/keycloak-event-metrics)
|
||||
[](https://git.kokuwa.io/keycloak/keycloak-event-metrics/src/branch/main/Dockerfile)
|
||||
[](https://git.kokuwa.io/keycloak/keycloak-event-metrics/src/branch/main/LICENSE)
|
||||
[](https://git.kokuwa.io/keycloak/keycloak-event-metrics/pulls)
|
||||
[](https://git.kokuwa.io/keycloak/keycloak-event-metrics/issues)
|
||||
[](https://ci.kokuwa.io/api/badges/keycloak/keycloak-event-metrics/)
|
||||
|
||||
## Why?
|
||||
|
||||
|
@ -114,7 +119,7 @@ If scrapping takes less than `KC_METRICS_STATS_INFO_THRESHOLD` duration will be
|
|||
|
||||
### Grafana Dashboard
|
||||
|
||||
Can be found here: [kokuwaio/keycloak keycloak-metrics.json](https://github.com/kokuwaio/keycloak/blob/main/src/test/k3s/dev/grafana/files/dashboards/keycloak-metrics.json)
|
||||
Can be found here: [keycloak-metrics.json](https://git.kokuwa.io/keycloak/keycloak/blob/main/src/test/k3s/dev/grafana/files/dashboards/keycloak-metrics.json)
|
||||
|
||||
### Testcontainers
|
||||
|
||||
|
@ -131,7 +136,7 @@ This images are based on busybox, so you can use cp to copy the jar into your ke
|
|||
|
||||
### Docker
|
||||
|
||||
Check: [kokuwaio/keycloak](https://github.com/kokuwaio/keycloak)
|
||||
Check: [kowaio/keycloak](https://git.kokuwa.io/keycloak/keycloak)
|
||||
|
||||
Dockerfile:
|
||||
|
||||
|
@ -145,7 +150,7 @@ FROM debian:stable-slim AS metrics
|
|||
RUN apt-get -qq update
|
||||
RUN apt-get -qq install --yes --no-install-recommends ca-certificates wget
|
||||
|
||||
ARG METRICS_VERSION=1.0.0
|
||||
ARG METRICS_VERSION=2.0.0
|
||||
ARG METRICS_FILE=keycloak-event-metrics-${METRICS_VERSION}.jar
|
||||
ARG METRICS_URL=https://repo1.maven.org/maven2/io/kokuwa/keycloak/keycloak-event-metrics/${METRICS_VERSION}
|
||||
|
||||
|
@ -159,7 +164,7 @@ RUN mv ${METRICS_FILE} /opt/keycloak/providers
|
|||
### build keycloak with metrics
|
||||
###
|
||||
|
||||
FROM quay.io/keycloak/keycloak:25.0.1
|
||||
FROM quay.io/keycloak/keycloak:25.2.5
|
||||
|
||||
ENV KEYCLOAK_ADMIN=admin
|
||||
ENV KEYCLOAK_ADMIN_PASSWORD=password
|
||||
|
|
244
pom.xml
244
pom.xml
|
@ -8,7 +8,7 @@
|
|||
|
||||
<name>Keycloak Metrics</name>
|
||||
<description>Provides metrics for Keycloak user/admin events</description>
|
||||
<url>https://github.com/kokuwaio/keycloak-event-metrics</url>
|
||||
<url>https://git.kokuwa.io/keycloak/keycloak-event-metrics</url>
|
||||
<inceptionYear>2023</inceptionYear>
|
||||
<organization>
|
||||
<name>Kokuwa.io</name>
|
||||
|
@ -33,27 +33,23 @@
|
|||
</developers>
|
||||
|
||||
<scm>
|
||||
<url>https://github.com/kokuwaio/keycloak-event-metrics</url>
|
||||
<connection>scm:git:https://github.com/kokuwaio/keycloak-event-metrics.git</connection>
|
||||
<developerConnection>scm:git:https://github.com/kokuwaio/keycloak-event-metrics.git</developerConnection>
|
||||
<url>https://git.kokuwa.io/keycloak/keycloak-event-metrics</url>
|
||||
<connection>scm:git:https://git.kokuwa.io/keycloak/keycloak-event-metrics.git</connection>
|
||||
<developerConnection>scm:git:https://git.kokuwa.io/keycloak/keycloak-event-metrics.git</developerConnection>
|
||||
<tag>HEAD</tag>
|
||||
</scm>
|
||||
<issueManagement>
|
||||
<system>github</system>
|
||||
<url>https://github.com/kokuwaio/keycloak-event-metrics/issues</url>
|
||||
<system>forgejo</system>
|
||||
<url>https://git.kokuwa.io/keycloak/keycloak-event-metrics/issues</url>
|
||||
</issueManagement>
|
||||
<ciManagement>
|
||||
<system>github</system>
|
||||
<url>https://github.com/kokuwaio/keycloak-event-metrics/actions</url>
|
||||
<system>woodpecker</system>
|
||||
<url>https://ci.kokuwa.io/repos/keycloak/keycloak-event-metrics</url>
|
||||
</ciManagement>
|
||||
<distributionManagement>
|
||||
<repository>
|
||||
<id>sonatype-nexus</id>
|
||||
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
|
||||
</repository>
|
||||
<snapshotRepository>
|
||||
<id>sonatype-nexus</id>
|
||||
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
|
||||
<id>sonatype.org</id>
|
||||
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
|
||||
</snapshotRepository>
|
||||
</distributionManagement>
|
||||
|
||||
|
@ -83,28 +79,8 @@
|
|||
<!-- ============================= Versions ============================== -->
|
||||
<!-- ===================================================================== -->
|
||||
|
||||
<version.org.apache.maven.plugins.clean>3.4.1</version.org.apache.maven.plugins.clean>
|
||||
<version.org.apache.maven.plugins.compiler>3.14.0</version.org.apache.maven.plugins.compiler>
|
||||
<version.org.apache.maven.plugins.deploy>3.1.4</version.org.apache.maven.plugins.deploy>
|
||||
<version.org.apache.maven.plugins.gpg>3.2.7</version.org.apache.maven.plugins.gpg>
|
||||
<version.org.apache.maven.plugins.install>3.1.4</version.org.apache.maven.plugins.install>
|
||||
<version.org.apache.maven.plugins.jar>3.4.2</version.org.apache.maven.plugins.jar>
|
||||
<version.org.apache.maven.plugins.javadoc>3.11.2</version.org.apache.maven.plugins.javadoc>
|
||||
<version.org.apache.maven.plugins.release>3.1.1</version.org.apache.maven.plugins.release>
|
||||
<version.org.apache.maven.plugins.resources>3.3.1</version.org.apache.maven.plugins.resources>
|
||||
<version.org.apache.maven.plugins.site>3.21.0</version.org.apache.maven.plugins.site>
|
||||
<version.org.apache.maven.plugins.source>3.3.1</version.org.apache.maven.plugins.source>
|
||||
<version.org.apache.maven.plugins.surefire>3.5.3</version.org.apache.maven.plugins.surefire>
|
||||
<version.org.codehaus.mojo.tidy>1.4.0</version.org.codehaus.mojo.tidy>
|
||||
<version.org.codehaus.mojo.versions>2.18.0</version.org.codehaus.mojo.versions>
|
||||
<version.org.sonatype.plugins.nexus>1.7.0</version.org.sonatype.plugins.nexus>
|
||||
<version.net.revelc.code.formatter>2.26.0</version.net.revelc.code.formatter>
|
||||
<version.net.revelc.code.impsort>1.12.0</version.net.revelc.code.impsort>
|
||||
<version.io.fabric8.docker>0.46.0</version.io.fabric8.docker>
|
||||
|
||||
<version.org.keycloak>26.2.5</version.org.keycloak>
|
||||
<version.org.keycloak.test>${version.org.keycloak}</version.org.keycloak.test>
|
||||
<version.org.testcontainers>1.18.3</version.org.testcontainers>
|
||||
|
||||
</properties>
|
||||
|
||||
|
@ -236,15 +212,10 @@
|
|||
</testResources>
|
||||
<pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-clean-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.clean}</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.compiler}</version>
|
||||
<version>3.14.0</version>
|
||||
<configuration>
|
||||
<compilerArgument>${maven.compiler.compilerArgument}</compilerArgument>
|
||||
</configuration>
|
||||
|
@ -252,37 +223,37 @@
|
|||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-deploy-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.deploy}</version>
|
||||
<version>3.1.4</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-failsafe-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.surefire}</version>
|
||||
<version>3.5.3</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-gpg-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.gpg}</version>
|
||||
<version>3.2.7</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-install-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.install}</version>
|
||||
<version>3.1.4</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.jar}</version>
|
||||
<version>3.4.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.javadoc}</version>
|
||||
<version>3.11.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-release-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.release}</version>
|
||||
<version>3.1.1</version>
|
||||
<configuration>
|
||||
<preparationGoals>clean verify</preparationGoals>
|
||||
<preparationProfiles>check</preparationProfiles>
|
||||
|
@ -296,7 +267,7 @@
|
|||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.resources}</version>
|
||||
<version>3.3.1</version>
|
||||
<configuration>
|
||||
<propertiesEncoding>${project.build.propertiesEncoding}</propertiesEncoding>
|
||||
</configuration>
|
||||
|
@ -304,43 +275,32 @@
|
|||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-site-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.site}</version>
|
||||
<version>3.21.0</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.source}</version>
|
||||
<version>3.3.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>${version.org.apache.maven.plugins.surefire}</version>
|
||||
<version>3.5.3</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>tidy-maven-plugin</artifactId>
|
||||
<version>${version.org.codehaus.mojo.tidy}</version>
|
||||
<version>1.4.0</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>versions-maven-plugin</artifactId>
|
||||
<version>${version.org.codehaus.mojo.versions}</version>
|
||||
<configuration>
|
||||
<generateBackupPoms>false</generateBackupPoms>
|
||||
<ignoredVersions>
|
||||
<ignoredVersion>^.*-(alpha|beta|M)-?[0-9]+$</ignoredVersion>
|
||||
</ignoredVersions>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.sonatype.plugins</groupId>
|
||||
<artifactId>nexus-staging-maven-plugin</artifactId>
|
||||
<version>${version.org.sonatype.plugins.nexus}</version>
|
||||
<groupId>org.sonatype.central</groupId>
|
||||
<artifactId>central-publishing-maven-plugin</artifactId>
|
||||
<version>0.7.0</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>net.revelc.code.formatter</groupId>
|
||||
<artifactId>formatter-maven-plugin</artifactId>
|
||||
<version>${version.net.revelc.code.formatter}</version>
|
||||
<version>2.26.0</version>
|
||||
<configuration>
|
||||
<configFile>${formatter.configFile}</configFile>
|
||||
</configuration>
|
||||
|
@ -348,12 +308,7 @@
|
|||
<plugin>
|
||||
<groupId>net.revelc.code</groupId>
|
||||
<artifactId>impsort-maven-plugin</artifactId>
|
||||
<version>${version.net.revelc.code.impsort}</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>io.fabric8</groupId>
|
||||
<artifactId>docker-maven-plugin</artifactId>
|
||||
<version>${version.io.fabric8.docker}</version>
|
||||
<version>1.12.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
|
@ -373,18 +328,6 @@
|
|||
</executions>
|
||||
</plugin>
|
||||
|
||||
<!-- disable default executions -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-install-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>default-install</id>
|
||||
<phase />
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
@ -516,109 +459,12 @@
|
|||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>javadoc-no-fork</goal>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<!-- docker image -->
|
||||
<plugin>
|
||||
<groupId>io.fabric8</groupId>
|
||||
<artifactId>docker-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>build</id>
|
||||
<phase>install</phase>
|
||||
<goals>
|
||||
<goal>build</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>push</id>
|
||||
<phase>deploy</phase>
|
||||
<goals>
|
||||
<goal>push</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<verbose>build</verbose>
|
||||
<images>
|
||||
<image>
|
||||
<name>docker.io/kokuwaio/keycloak-event-metrics:${project.version}</name>
|
||||
<build>
|
||||
<from>docker.io/library/busybox:1.37.0-uclibc@sha256:cc57e0ff4b6d3138931ff5c7180d18078813300e2508a25fb767a4d36df30d4d</from>
|
||||
<assembly>
|
||||
<basedir>${file.separator}</basedir>
|
||||
<inline>
|
||||
<files>
|
||||
<file>
|
||||
<source>${project.build.directory}/${project.build.finalName}.jar</source>
|
||||
<destName>${project.artifactId}.jar</destName>
|
||||
<fileMode>444</fileMode>
|
||||
</file>
|
||||
</files>
|
||||
</inline>
|
||||
</assembly>
|
||||
<labels>
|
||||
<!-- https://github.com/opencontainers/image-spec/blob/main/annotations.md -->
|
||||
<org.opencontainers.image.title>${project.name}</org.opencontainers.image.title>
|
||||
<org.opencontainers.image.description>${project.description}</org.opencontainers.image.description>
|
||||
<org.opencontainers.image.url>${project.url}</org.opencontainers.image.url>
|
||||
<org.opencontainers.image.source>${project.scm.url}</org.opencontainers.image.source>
|
||||
<org.opencontainers.image.vendor>${project.organization.name}</org.opencontainers.image.vendor>
|
||||
<org.opencontainers.image.authors>https://github.com/orgs/kokuwaio/people</org.opencontainers.image.authors>
|
||||
<org.opencontainers.image.licenses>${project.licenses[0].name}</org.opencontainers.image.licenses>
|
||||
<org.opencontainers.image.version>${project.version}</org.opencontainers.image.version>
|
||||
<org.opencontainers.image.base.name>docker.io/library/busybox:1.37.0-uclibc</org.opencontainers.image.base.name>
|
||||
<org.opencontainers.image.base.digest>sha256:cc57e0ff4b6d3138931ff5c7180d18078813300e2508a25fb767a4d36df30d4d</org.opencontainers.image.base.digest>
|
||||
</labels>
|
||||
</build>
|
||||
</image>
|
||||
<image>
|
||||
<name>ghcr.io/kokuwaio/keycloak-event-metrics:${project.version}</name>
|
||||
<build>
|
||||
<from>docker.io/library/busybox:1.37.0-uclibc@sha256:cc57e0ff4b6d3138931ff5c7180d18078813300e2508a25fb767a4d36df30d4d</from>
|
||||
<assembly>
|
||||
<basedir>${file.separator}</basedir>
|
||||
<inline>
|
||||
<files>
|
||||
<file>
|
||||
<source>${project.build.directory}/${project.build.finalName}.jar</source>
|
||||
<destName>${project.artifactId}.jar</destName>
|
||||
<fileMode>444</fileMode>
|
||||
</file>
|
||||
</files>
|
||||
</inline>
|
||||
</assembly>
|
||||
<labels>
|
||||
<!-- https://github.com/opencontainers/image-spec/blob/main/annotations.md -->
|
||||
<org.opencontainers.image.title>${project.name}</org.opencontainers.image.title>
|
||||
<org.opencontainers.image.description>${project.description}</org.opencontainers.image.description>
|
||||
<org.opencontainers.image.url>${project.url}</org.opencontainers.image.url>
|
||||
<org.opencontainers.image.source>${project.scm.url}</org.opencontainers.image.source>
|
||||
<org.opencontainers.image.vendor>${project.organization.name}</org.opencontainers.image.vendor>
|
||||
<org.opencontainers.image.authors>https://github.com/orgs/kokuwaio/people</org.opencontainers.image.authors>
|
||||
<org.opencontainers.image.licenses>${project.licenses[0].name}</org.opencontainers.image.licenses>
|
||||
<org.opencontainers.image.version>${project.version}</org.opencontainers.image.version>
|
||||
<org.opencontainers.image.base.name>docker.io/library/busybox:1.37.0-uclibc</org.opencontainers.image.base.name>
|
||||
<org.opencontainers.image.base.digest>sha256:cc57e0ff4b6d3138931ff5c7180d18078813300e2508a25fb767a4d36df30d4d</org.opencontainers.image.base.digest>
|
||||
</labels>
|
||||
</build>
|
||||
</image>
|
||||
</images>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>release</id>
|
||||
<build>
|
||||
<plugins>
|
||||
|
||||
<!-- sign before upload -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
|
@ -628,22 +474,30 @@
|
|||
<goals>
|
||||
<goal>sign</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<signer>bc</signer>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<!-- autoclose sonatype nexus repo -->
|
||||
<plugin>
|
||||
<groupId>org.sonatype.plugins</groupId>
|
||||
<artifactId>nexus-staging-maven-plugin</artifactId>
|
||||
<extensions>true</extensions>
|
||||
<configuration>
|
||||
<serverId>sonatype-nexus</serverId>
|
||||
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
|
||||
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>release</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.sonatype.central</groupId>
|
||||
<artifactId>central-publishing-maven-plugin</artifactId>
|
||||
<extensions>true</extensions>
|
||||
<configuration>
|
||||
<publishingServerId>sonatype.org</publishingServerId>
|
||||
<autoPublish>true</autoPublish>
|
||||
<waitUntil>published</waitUntil>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
|
4
renovate.json
Normal file
4
renovate.json
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": ["local>infrastructure/renovate-config", ":reviewer(stephan.schnabel)"]
|
||||
}
|
|
@ -50,28 +50,29 @@ public class KeycloakExtension implements BeforeAllCallback, ParameterResolver {
|
|||
var jar = properties.getProperty("jar");
|
||||
var timeout = properties.getProperty("timeout");
|
||||
|
||||
// create and start container
|
||||
// create and start container - use fixed port in ci
|
||||
|
||||
@SuppressWarnings({ "resource", "deprecation" })
|
||||
var container = (System.getenv("CI") == null
|
||||
? new GenericContainer<>(image).withExposedPorts(8080)
|
||||
: new FixedHostPortGenericContainer<>(image).withFixedExposedPort(8080, 8080))
|
||||
.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
|
||||
.withEnv("KC_LEGACY_OBSERVABILITY_INTERFACE", "true")
|
||||
.withEnv("KC_HEALTH_ENABLED", "true")
|
||||
.withEnv("KC_METRICS_ENABLED", "true")
|
||||
.withEnv("KC_METRICS_STATS_ENABLED", "true")
|
||||
.withEnv("KC_METRICS_STATS_INTERVAL", "PT1s")
|
||||
.withCopyFileToContainer(MountableFile.forHostPath(jar), "/opt/keycloak/providers/metrics.jar")
|
||||
.withLogConsumer(out -> System.out.print(out.getUtf8String()))
|
||||
.withStartupTimeout(Duration.parse(timeout))
|
||||
.waitingFor(Wait.forHttp("/health").forPort(8080).withStartupTimeout(Duration.ofMinutes(10)))
|
||||
.withCommand("start-dev");
|
||||
: new FixedHostPortGenericContainer<>(image).withFixedExposedPort(8080, 8080));
|
||||
try {
|
||||
container.start();
|
||||
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
|
||||
.withEnv("KC_LEGACY_OBSERVABILITY_INTERFACE", "true")
|
||||
.withEnv("KC_HEALTH_ENABLED", "true")
|
||||
.withEnv("KC_METRICS_ENABLED", "true")
|
||||
.withEnv("KC_METRICS_STATS_ENABLED", "true")
|
||||
.withEnv("KC_METRICS_STATS_INTERVAL", "PT1s")
|
||||
.withCopyFileToContainer(MountableFile.forHostPath(jar), "/opt/keycloak/providers/metrics.jar")
|
||||
.withLogConsumer(out -> System.out.print(out.getUtf8String()))
|
||||
.withStartupTimeout(Duration.parse(timeout))
|
||||
.waitingFor(Wait.forHttp("/health").forPort(8080).withStartupTimeout(Duration.ofMinutes(10)))
|
||||
.withCommand("start-dev")
|
||||
.start();
|
||||
} catch (RuntimeException e) {
|
||||
throw new Exception("Failed to start keycloak", e);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue