Compare commits

...

24 Commits

Author SHA1 Message Date
c1108aab19 Added options to mount nexus secrets 2025-10-31 23:42:12 +01:00
e91c0ef89a Updated signature public keys for node 2025-10-31 23:37:52 +01:00
5436730ee2 Updated Dockerfile 2025-10-31 23:28:37 +01:00
0aa131d155 Updated devcontainer names 2025-10-31 23:12:35 +01:00
c7e7086709 Update .devcontainer/ui/Dockerfile 2025-10-31 13:24:21 +00:00
de37e7fa92 add insights 2025-09-27 07:47:09 +00:00
c17d0a51f3 update Dockerfile 2025-09-20 21:04:56 +02:00
2d1b609531 update Dockerfile 2025-09-20 20:54:49 +02:00
ce56e8f4e8 update Dockerfile 2025-09-20 20:44:38 +02:00
cca1bbc691 update Dockerfile 2025-09-20 20:20:56 +02:00
Christophe VILA
560ea768d3 update CLAUDE.md 2025-09-04 16:41:43 +00:00
Christophe VILA
759b17fc53 update CLAUDE.md 2025-09-04 13:01:01 +00:00
cvila
0e2c377779 updated notes 2025-08-07 18:48:24 +02:00
cvila
5850f4a0b1 updated notes 2025-08-06 17:32:46 +02:00
cvila
4acd5f4af7 updated notes 2025-08-04 18:01:09 +02:00
6b576ad7de Updated maven version 2025-07-23 17:38:06 +00:00
2aa3a793d3 added node in docker image 2025-06-08 10:12:34 +02:00
e7ddfe9fcb devcontainer server from scratch 2025-06-07 10:20:28 +02:00
613b8c6e34 update devcontainer 2025-06-06 20:39:19 +02:00
7481d1ab63 update devcontainer 2025-06-06 19:40:57 +02:00
2b183a4416 update devcontainers 2025-06-06 19:25:34 +02:00
2e2c419f0a change directories for devcontainer 2025-06-06 08:41:31 +02:00
8665e38b0c devcontainer update 2025-06-06 08:34:40 +02:00
aedfc4c1d8 remove workspaceMount as it seems ignored at creation time 2025-06-06 08:32:48 +02:00
11 changed files with 460 additions and 50 deletions

View File

@@ -0,0 +1,147 @@
FROM debian:trixie
RUN groupadd debian \
--gid 1000 \
&& useradd debian \
--uid 1000 \
--gid debian \
--shell /bin/bash \
--create-home
RUN apt-get update \
&& apt-get -y install --no-install-recommends \
ca-certificates \
curl \
dirmngr \
git \
gnupg \
gpg \
gpg-agent \
libatomic1 \
nano \
python3 \
unzip \
vim-tiny \
wget \
xz-utils \
&& apt-get auto-remove -y \
&& apt-get clean -y \
&& rm -rf /var/lib/apt/lists/* \
&& echo 'export PS1="\e[01;32m\u\e[m:\e[01;34m\w\e[m\$ "' >> /home/debian/.bashrc
ENV JAVA_HOME=/opt/java/openjdk
COPY --from=eclipse-temurin:21 $JAVA_HOME $JAVA_HOME
ENV PATH="${JAVA_HOME}/bin:${PATH}"
ENV MAVEN_HOME=/opt/maven
ENV PATH=$MAVEN_HOME/bin:$PATH
ARG MAVEN_VERSION=3.9.11
ARG BASE_URL=https://dlcdn.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries
RUN mkdir -p $MAVEN_HOME \
&& curl -fsSL -o /tmp/apache-maven.tar.gz ${BASE_URL}/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
&& tar -xzf /tmp/apache-maven.tar.gz -C $MAVEN_HOME --strip-components=1 \
&& rm -f /tmp/apache-maven.tar.gz
ARG NODE_VERSION=22.21.1
RUN ARCH= OPENSSL_ARCH= && dpkgArch="$(dpkg --print-architecture)" \
&& case "${dpkgArch##*-}" in \
amd64) ARCH='x64' OPENSSL_ARCH='linux-x86_64';; \
ppc64el) ARCH='ppc64le' OPENSSL_ARCH='linux-ppc64le';; \
s390x) ARCH='s390x' OPENSSL_ARCH='linux*-s390x';; \
arm64) ARCH='arm64' OPENSSL_ARCH='linux-aarch64';; \
armhf) ARCH='armv7l' OPENSSL_ARCH='linux-armv4';; \
i386) ARCH='x86' OPENSSL_ARCH='linux-elf';; \
*) echo "unsupported architecture"; exit 1 ;; \
esac \
&& set -ex \
# use pre-existing gpg directory, see https://github.com/nodejs/docker-node/pull/1895#issuecomment-1550389150
&& export GNUPGHOME="$(mktemp -d)" \
# gpg keys listed at https://github.com/nodejs/node#release-keys
&& for key in \
5BE8A3F6C8A5C01D106C0AD820B1A390B168D356 \
DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7 \
CC68F5A3106FF448322E48ED27F5E38D5B0A215F \
8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \
890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4 \
C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C \
108F52B48DB57BB0CC439B2997B01419BD92F80A \
A363A499291CBBC940DD62E41F10027AF002F8B0 \
; do \
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" || \
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" ; \
done \
&& curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" \
&& curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
&& gpgconf --kill all \
&& rm -rf "$GNUPGHOME" \
&& grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
&& tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \
&& rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \
# Remove unused OpenSSL headers to save ~34MB. See this NodeJS issue: https://github.com/nodejs/node/issues/46451
&& find /usr/local/include/node/openssl/archs -mindepth 1 -maxdepth 1 ! -name "$OPENSSL_ARCH" -exec rm -rf {} \; \
&& npm install -g npm \
&& npm install -g @anthropic-ai/claude-code \
# smoke tests
&& node --version \
&& npm --version \
&& rm -rf /tmp/*
ARG BUN_VERSION=1.3.1
RUN arch="$(dpkg --print-architecture)" \
&& case "${arch##*-}" in \
amd64) build="x64-baseline";; \
arm64) build="aarch64";; \
*) echo "error: unsupported architecture: $arch"; exit 1 ;; \
esac \
&& version="$BUN_VERSION" \
&& case "$version" in \
latest | canary | bun-v*) tag="$version"; ;; \
v*) tag="bun-$version"; ;; \
*) tag="bun-v$version"; ;; \
esac \
&& case "$tag" in \
latest) release="latest/download"; ;; \
*) release="download/$tag"; ;; \
esac \
&& curl "https://github.com/oven-sh/bun/releases/$release/bun-linux-$build.zip" \
-fsSLO \
--compressed \
--retry 5 \
|| (echo "error: failed to download: $tag" && exit 1) \
&& for key in \
"F3DCC08A8572C0749B3E18888EAB4D40A7B22B59" \
; do \
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" \
|| gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" ; \
done \
&& curl "https://github.com/oven-sh/bun/releases/$release/SHASUMS256.txt.asc" \
-fsSLO \
--compressed \
--retry 5 \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
|| (echo "error: failed to verify: $tag" && exit 1) \
&& grep " bun-linux-$build.zip\$" SHASUMS256.txt | sha256sum -c - \
|| (echo "error: failed to verify: $tag" && exit 1) \
&& unzip "bun-linux-$build.zip" \
&& mv "bun-linux-$build/bun" /usr/local/bin/bun \
&& rm -f "bun-linux-$build.zip" SHASUMS256.txt.asc SHASUMS256.txt \
&& chmod +x /usr/local/bin/bun
ARG NEXUS_REPO=https://rm.vilanet.fr/repository/raw
RUN --mount=type=secret,id=nexus_login,target=/tmp/nexus_login \
--mount=type=secret,id=nexus_pwd,target=/tmp/nexus_pwd \
curl -Lo /tmp/jetbrains.zip -u$(cat /tmp/nexus_login):$(cat /tmp/nexus_pwd) ${NEXUS_REPO}/jetbrains.zip
# Set the default user
USER debian
RUN mkdir -p /home/debian/.local/share \
&& unzip -d /home/debian/.local/share /tmp/jetbrains.zip
#ENV IDEA_VM_OPTIONS=/home/debian/.local/share/jetbrains/vmoptions/idea.vmoptions
# Set the working directory
WORKDIR /home/debian

View File

@@ -0,0 +1,22 @@
{
"name": "slot-server",
"build": {
"dockerfile": "Dockerfile",
"options": [
"--secret", "id=nexus_login,src=/tmp/nexus_login",
"--secret", "id=nexus_pwd,src=/tmp/nexus_pwd"
]
},
"containerEnv": {
"GIT_REPO_URL": "https://scm.vilanet.fr/kriss/slot"
},
"customizations": {
"jetbrains": {
"backend": "IntelliJ"
}
},
"forwardPorts": [8080],
"workspaceFolder": "/workspace",
"//": "workspaceMount: source=jb_devcontainer_sources_f31d2e11122d7a0f1e78fb3337cc2916,target=/workspace,type=volume",
"//": "postCreateCommand: if [ ! -d .git ]; then git clone $GIT_REPO_URL .; fi"
}

147
.devcontainer/ui/Dockerfile Normal file
View File

@@ -0,0 +1,147 @@
FROM debian:trixie
RUN groupadd debian \
--gid 1000 \
&& useradd debian \
--uid 1000 \
--gid debian \
--shell /bin/bash \
--create-home
RUN apt-get update \
&& apt-get -y install --no-install-recommends \
ca-certificates \
curl \
dirmngr \
git \
gnupg \
gpg \
gpg-agent \
libatomic1 \
nano \
python3 \
unzip \
vim-tiny \
wget \
xz-utils \
&& apt-get auto-remove -y \
&& apt-get clean -y \
&& rm -rf /var/lib/apt/lists/* \
&& echo 'export PS1="\e[01;32m\u\e[m:\e[01;34m\w\e[m\$ "' >> /home/debian/.bashrc
ENV JAVA_HOME=/opt/java/openjdk
COPY --from=eclipse-temurin:21 $JAVA_HOME $JAVA_HOME
ENV PATH="${JAVA_HOME}/bin:${PATH}"
ENV MAVEN_HOME=/opt/maven
ENV PATH=$MAVEN_HOME/bin:$PATH
ARG MAVEN_VERSION=3.9.11
ARG BASE_URL=https://dlcdn.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries
RUN mkdir -p $MAVEN_HOME \
&& curl -fsSL -o /tmp/apache-maven.tar.gz ${BASE_URL}/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
&& tar -xzf /tmp/apache-maven.tar.gz -C $MAVEN_HOME --strip-components=1 \
&& rm -f /tmp/apache-maven.tar.gz
ARG NODE_VERSION=22.21.1
RUN ARCH= OPENSSL_ARCH= && dpkgArch="$(dpkg --print-architecture)" \
&& case "${dpkgArch##*-}" in \
amd64) ARCH='x64' OPENSSL_ARCH='linux-x86_64';; \
ppc64el) ARCH='ppc64le' OPENSSL_ARCH='linux-ppc64le';; \
s390x) ARCH='s390x' OPENSSL_ARCH='linux*-s390x';; \
arm64) ARCH='arm64' OPENSSL_ARCH='linux-aarch64';; \
armhf) ARCH='armv7l' OPENSSL_ARCH='linux-armv4';; \
i386) ARCH='x86' OPENSSL_ARCH='linux-elf';; \
*) echo "unsupported architecture"; exit 1 ;; \
esac \
&& set -ex \
# use pre-existing gpg directory, see https://github.com/nodejs/docker-node/pull/1895#issuecomment-1550389150
&& export GNUPGHOME="$(mktemp -d)" \
# gpg keys listed at https://github.com/nodejs/node#release-keys
&& for key in \
5BE8A3F6C8A5C01D106C0AD820B1A390B168D356 \
DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7 \
CC68F5A3106FF448322E48ED27F5E38D5B0A215F \
8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \
890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4 \
C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C \
108F52B48DB57BB0CC439B2997B01419BD92F80A \
A363A499291CBBC940DD62E41F10027AF002F8B0 \
; do \
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" || \
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" ; \
done \
&& curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" \
&& curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
&& gpgconf --kill all \
&& rm -rf "$GNUPGHOME" \
&& grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
&& tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \
&& rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \
# Remove unused OpenSSL headers to save ~34MB. See this NodeJS issue: https://github.com/nodejs/node/issues/46451
&& find /usr/local/include/node/openssl/archs -mindepth 1 -maxdepth 1 ! -name "$OPENSSL_ARCH" -exec rm -rf {} \; \
&& npm install -g npm \
&& npm install -g @anthropic-ai/claude-code \
# smoke tests
&& node --version \
&& npm --version \
&& rm -rf /tmp/*
ARG BUN_VERSION=1.3.1
RUN arch="$(dpkg --print-architecture)" \
&& case "${arch##*-}" in \
amd64) build="x64-baseline";; \
arm64) build="aarch64";; \
*) echo "error: unsupported architecture: $arch"; exit 1 ;; \
esac \
&& version="$BUN_VERSION" \
&& case "$version" in \
latest | canary | bun-v*) tag="$version"; ;; \
v*) tag="bun-$version"; ;; \
*) tag="bun-v$version"; ;; \
esac \
&& case "$tag" in \
latest) release="latest/download"; ;; \
*) release="download/$tag"; ;; \
esac \
&& curl "https://github.com/oven-sh/bun/releases/$release/bun-linux-$build.zip" \
-fsSLO \
--compressed \
--retry 5 \
|| (echo "error: failed to download: $tag" && exit 1) \
&& for key in \
"F3DCC08A8572C0749B3E18888EAB4D40A7B22B59" \
; do \
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" \
|| gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" ; \
done \
&& curl "https://github.com/oven-sh/bun/releases/$release/SHASUMS256.txt.asc" \
-fsSLO \
--compressed \
--retry 5 \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
|| (echo "error: failed to verify: $tag" && exit 1) \
&& grep " bun-linux-$build.zip\$" SHASUMS256.txt | sha256sum -c - \
|| (echo "error: failed to verify: $tag" && exit 1) \
&& unzip "bun-linux-$build.zip" \
&& mv "bun-linux-$build/bun" /usr/local/bin/bun \
&& rm -f "bun-linux-$build.zip" SHASUMS256.txt.asc SHASUMS256.txt \
&& chmod +x /usr/local/bin/bun
ARG NEXUS_REPO=https://rm.vilanet.fr/repository/raw
RUN --mount=type=secret,id=nexus_login,target=/tmp/nexus_login \
--mount=type=secret,id=nexus_pwd,target=/tmp/nexus_pwd \
curl -Lo /tmp/jetbrains.zip -u$(cat /tmp/nexus_login):$(cat /tmp/nexus_pwd) ${NEXUS_REPO}/jetbrains.zip
# Set the default user
USER debian
RUN mkdir -p /home/debian/.local/share \
&& unzip -d /home/debian/.local/share /tmp/jetbrains.zip
#ENV IDEA_VM_OPTIONS=/home/debian/.local/share/jetbrains/vmoptions/idea.vmoptions
# Set the working directory
WORKDIR /home/debian

View File

@@ -0,0 +1,22 @@
{
"name": "slot-ui",
"build": {
"dockerfile": "Dockerfile",
"options": [
"--secret", "id=nexus_login,src=/tmp/nexus_login",
"--secret", "id=nexus_pwd,src=/tmp/nexus_pwd"
]
},
"containerEnv": {
"GIT_REPO_URL": "https://scm.vilanet.fr/kriss/slot"
},
"customizations": {
"jetbrains": {
"backend": "WebStorm"
}
},
"forwardPorts": [5173],
"workspaceFolder": "/workspace",
"//": "workspaceMount: source=jb_devcontainer_sources_f31d2e11122d7a0f1e78fb3337cc2916,target=/workspace,type=volume",
"//": "postCreateCommand: if [ ! -d .git ]; then git clone $GIT_REPO_URL .; fi"
}

View File

@@ -0,0 +1,8 @@
#!/bin/sh
set -e
if [ "${1#-}" != "${1}" ] || [ -z "$(command -v "${1}")" ] || { [ -f "${1}" ] && ! [ -x "${1}" ]; }; then
set -- /usr/local/bin/bun "$@"
fi
exec "$@"

View File

@@ -1,16 +0,0 @@
{
"name": "OpenJDK21",
"image": "mcr.microsoft.com/openjdk/jdk:21-ubuntu",
"features": {
"ghcr.io/devcontainers/features/java:1": {
"installMaven": "true"
},
"ghcr.io/devcontainers/features/git:1": {}
},
"customizations": {
"jetbrains": {
"backend": "IntelliJ"
}
},
"workspaceFolder": "/workspace"
}

33
server/CLAUDE.md Normal file
View File

@@ -0,0 +1,33 @@
# General information
This project will be used by following kind of users :
- program managers:
they manage a program, which encompasses all activities allowing to reach a company objective. there are different kind of programs:
- strategic customer program: in this case, the program represents all the go-to-market activities for this customer (from pre-sales to maintenance)
- business program: in this case, objectives will allow to address new market shares or ensure business continuity on existing market shares. some examples: support new languages, implement country regulatory new rules, ...
- technical program: in this case, objectives are usually transversal and benefits for all products and solutions of the company. some examples: ability to deploy on public cloud, going from monolith to micro-services architecture, ...
- other transversal activities like innovation can also be run through a program
- product managers:
they manage one or several products, defining the feature set for each.
they design features to match needs expressed by customers in the pipe, as well as needs that should arise from future customers, based on market analysis.
they also decide if a given customer request has to be processed as a custom or through a product feature.
- business owners:
they decide strategy and priorities in case of unability to address all needs with current budget
- engineering managers:
they manage a set of agile teams in charge of developing the features.
they run an organization which is based on SAFe principles, meaning scope is committed through program increments of 3 months.
Objective of this project is to provide a UI that would :
- help program managers and product managers to record their needs in term of new features or customs to implement in a product, based on priorities, expected start and end dates, ...
- help business owners to see when these needs will be fulfilled and let them change constraints like priority,
This component is server-side.
Its aim is to provide API that would be used by UI whenever a core business logic has to be executed.
Core business logic is around computing start and end dates for each
# Technical constraints
UI written in React, using ShadCN UI
Backend written in Java, using Quarkus
# Features definition

64
server/MyApp.md Normal file
View File

@@ -0,0 +1,64 @@
# MyApp
My standards for an App
### Documentation
- Dev: Backstage (security, alerting, CI/CD, configuration, observability, infra)
- Project: Hugo
### Observability
- Otel
- Observability as a code (dashboard => grafana.json, alerts => alerts.yaml)
- Prometheus exporters for applicative metrics
- UI batched logs to server endpoint
- Thanos (long-lived + consolidation)
- Zabbix
### Quality
- PACT (backend-backend)
- squashtest.com
- Selenium/Cypress
- Code coverage (Sonar + Cobertura)
- Code security (Gitlab SAST/DAST ?)
- Code maturity (Sonar + OpenSSF ?)
- Test reports (AllureReport)
### Packaging
- Docker
- Helm
### Database
- PostgreSQL / Mongo
- Migration (liquidbase, flyway)
### Configuration
- X-Context approach (override conf by request)
- Simple vs. profile parameters
- Multi-tenancy ?
### Technical
- Redis (create async request API endpoint)
- Websocket UI - server
### Auth
- Dex
### Backend
- Quarkus
### UI
- React
- Shadcn UI
- TailwindCSS
### Build
- Maven
- Gitea/Gitlab actions
- Devcontainer
- Devfile
### API
- OpenAPI swagger
- Apicurio (lint)
- Smartbear
- High level protocol (at least for homogeneous error management)

View File

@@ -1,3 +1,5 @@
To be moved to CLAUDE.md
initiative 1..n engagement 1..n epic 1..n feature 1..n story initiative 1..n engagement 1..n epic 1..n feature 1..n story
initiative initiative
@@ -14,3 +16,18 @@ epic
feature (au sens tuleap, utile pour eXtreme quotation) feature (au sens tuleap, utile pour eXtreme quotation)
story (au sens tuleap) story (au sens tuleap)
capacity management with PMP standards (LoE, discrete, apportioned + MyNFR cut) + activity tracker (préparation engagement, follow-up post-engagement)
flags for product vs custom
ARR/IRR
ARR = accounting rate of return / annual recurring revenue = annual predicted net profit / initial investment
IRR = internal rate of return
features:
- capacity/scope long-term
- capacity/scope PI term
- suivi engagement (risk, event, deps, done vs planned)
- burn-up
- EVM (ACT, BAC, ...)

View File

@@ -1,15 +0,0 @@
ARG VARIANT=latest
FROM oven/bun:${VARIANT}
RUN apt-get update \
&& apt-get -y install --no-install-recommends \
ca-certificates \
git \
nano \
vim-tiny \
&& apt-get auto-remove -y \
&& apt-get clean -y \
&& chsh -s $(which bash) bun \
&& echo 'export PS1="\e[01;32m\u\e[m:\e[01;34m\w\e[m\$ "' >> /home/bun/.bashrc
USER bun

View File

@@ -1,19 +0,0 @@
{
"name": "Bun",
"build": {
"dockerfile": "Dockerfile",
"args": {
"VARIANT": "latest"
}
},
"containerEnv": {
"GIT_REPO_URL": "https://scm.vilanet.fr/kriss/slot"
},
"customizations": {
"jetbrains": {}
},
"forwardPorts": [5173],
"workspaceMount": "source=slot_sources,target=/workspace,type=volume",
"workspaceFolder": "/workspace",
"postCreateCommand": "if [ ! -d .git ]; then git clone $GIT_REPO_URL .; fi"
}