17 Commits
Author SHA1 Message Date
Liosha84 6666fca194 Merge pull request 'fix(ci): split drone into two separate pipelines for PR and main' (#4) from develop into master
Reviewed-on: #4
2026-10-29 00:56:56 +01:00
Liosha84 9d03b0977d fix(ci): split drone into two separate pipelines for PR and main
continuous-integration/drone/pr Build is failing
2026-10-29 00:55:51 +01:00
Liosha84 3a0c22abf0 Merge pull request 'Develop' (#3) from develop into master
continuous-integration/drone/push Build is failing
Reviewed-on: #3
2026-10-29 00:52:19 +01:00
Liosha84 ed48cacfbc Revert "chore: translate README.md to Russian"
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
This reverts commit 3f9ecc1113.
2026-10-29 00:50:55 +01:00
Liosha84 3f9ecc1113 chore: translate README.md to Russian
continuous-integration/drone/push Build is failing
2026-10-29 00:48:43 +01:00
Liosha84 eb73c55ac2 fix(drone): use full commit SHA for Docker tag and fix non-interactive adduser
continuous-integration/drone/push Build is failing
- Replace bash substring syntax ${DRONE_COMMIT_SHA:0:7} with
  ${DRONE_COMMIT_SHA} which is supported by Drone YAML variables
- Use 'adduser -D -g ""' in Dockerfile to skip interactive prompts
  for user information during Docker image build
2026-10-29 00:47:28 +01:00
Liosha84 8369b2a6ba Merge pull request 'Develop->main' (#2) from develop into master
continuous-integration/drone/push Build is failing
Reviewed-on: #2
2026-10-29 00:43:36 +01:00
Liosha84 d4a6726930 feat: automatic releases on merge to main
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
- Drone now triggers on push to main branch instead of Git tags
- Each merge produces two Docker tags: main-{commit-sha} and main-latest
- No manual Git tags needed — merging PR develop → main is the release
- Updated docs/DEVELOPMENT.md with new Git-flow workflow
- Updated CHANGELOG.md with automatic releases feature
2026-10-29 00:39:31 +01:00
Liosha84andJunie 0d6e0fa565 fix(docker): skip frontend Gradle tasks when SKIP_FRONTEND is set
Add onlyIf predicate to installFrontendDependencies and buildFrontend tasks
so they are skipped when SKIP_FRONTEND env var is present. This fixes the
Docker multi-stage build which failed because Gradle validated input files
(package.json, package-lock.json) that don't exist in the builder stage.

Also moved the skipFrontend variable definition before task registration
for cleaner code organization.

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-29 00:25:37 +01:00
Liosha84 3e78dcff0f Merge pull request 'feat(drone): add pull request trigger for CI/CD testing' (#1) from develop into master
Reviewed-on: #1
2026-10-29 00:20:20 +01:00
Liosha84andJunie 291167e683 feat(drone): add pull request trigger for CI/CD testing
continuous-integration/drone/pr Build is failing
Co-authored-by: Junie <junie@jetbrains.com>
2026-10-29 00:19:31 +01:00
Liosha84 42f606610a remake of REST Controllers 2026-10-29 00:11:08 +01:00
Liosha84andJunie dc8c6b0dc6 Release v0.3.0: migrate CI/CD to Drone
Co-authored-by: Junie <junie@jetbrains.com>
2026-10-29 00:02:14 +01:00
Liosha84andJunie 7f2ea4f3b4 Fix Drone CI/CD: use from_secret instead of from for secrets
The correct Drone syntax for referencing secrets is 'from_secret:',
not 'from:'. Without this fix, Drone cannot read the registry
credentials and the docker login step will fail with 401 Unauthorized.

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-29 00:00:17 +01:00
Liosha84andJunie 923b1e7c57 Migrate CI/CD from Gitea Actions to Drone
Replace .gitea/workflows/docker.yml with .drone.yml using the Drone
Docker plugin with auto_tag enabled. On Git tag pushes (v0.2.0),
Drone automatically creates Docker image tags: full version (0.2.0),
minor version (0.2), and latest.

Updated docs/DEVELOPMENT.md to document Drone CI/CD setup instead
of Gitea Actions. Updated CHANGELOG.md to reflect the Drone migration.

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-28 23:57:30 +01:00
Liosha84andJunie ee263d6224 Fix: use GITHUB_OUTPUT instead of GITEA_OUTPUT in CI/CD workflow
Docker Build and Push / build-and-push (push) Canceled after 0s
Gitea Actions uses GITHUB_OUTPUT to set step outputs, not GITEA_OUTPUT.
This was causing version and minor variables to be empty, so only the
'latest' tag was pushed to the registry. Added debug logging to help
diagnose future issues.

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-28 23:50:23 +01:00
Liosha84andJunie cb1c8b9a2c Fix: update Gitea token menu name to 'Manage Access Tokens'
Docker Build and Push / build-and-push (push) Canceled after 0s
The actual Gitea UI shows 'Manage Access Tokens' with the subtitle
'These tokens grant access to your account using the Gitea API',
not 'Authorization tokens'. Updated docs/DEVELOPMENT.md to match.

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-28 23:43:13 +01:00
7 changed files with 164 additions and 77 deletions
+38
View File
@@ -0,0 +1,38 @@
kind: pipeline
type: docker
name: build-test
trigger:
event:
- pull_request
steps:
- name: build-test
image: plugins/docker
settings:
dockerfile: Dockerfile
context: .
---
kind: pipeline
type: docker
name: build-and-push
trigger:
event:
- push
branch:
- main
steps:
- name: build-and-push
image: plugins/docker
settings:
dockerfile: Dockerfile
context: .
registry: gitea.jambotron.com
repo: gitea.jambotron.com/liosha84/htop-web
tags: ${DRONE_COMMIT_SHA},main-latest
username:
from_secret: REGISTRY_USERNAME
password:
from_secret: REGISTRY_PASSWORD
-50
View File
@@ -1,50 +0,0 @@
name: Docker Build and Push
on:
push:
tags:
- 'v*'
env:
REGISTRY: gitea.jambotron.com
IMAGE_NAME: liosha84/htop-web
jobs:
build-and-push:
runs-on: ubuntu-latest
container:
image: catthehacker/ubuntu:act-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Extract version from tag
id: version
run: |
# Remove 'v' prefix from tag (e.g., v0.1.0 → 0.1.0)
VERSION=$(echo "${{ gitea.ref }}" | sed 's|refs/tags/v||')
echo "version=${VERSION}" >> "${GITEA_OUTPUT}"
# Extract major.minor for minor tag (e.g., 0.1.0 → 0.1)
MINOR=$(echo "${VERSION}" | sed 's/\.[0-9]*$//')
echo "minor=${MINOR}" >> "${GITEA_OUTPUT}"
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Gitea Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.minor }}
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
+8 -1
View File
@@ -6,9 +6,16 @@ This project follows [Semantic Versioning](https://semver.org/). For more detail
## Unreleased ## Unreleased
- **Automatic releases on merge** — Drone now builds and pushes Docker images automatically when a Pull Request is merged into `main`. No manual Git tags are needed. Each merge produces two tags: `main-{commit-sha}` for traceability and `main-latest` for the most recent stable build.
- **Git-flow workflow** — development happens in the `develop` branch. When code is ready for release, create a Pull Request from `develop` → `main`. Merging the PR triggers the automatic release.
## v0.3.0
- **CI/CD migrated to Drone** — replaced Gitea Actions with Drone CI/CD (`.drone.yml`). The Docker plugin `auto_tag` feature automatically creates Semantic Versioning tags (`0.3.0`, `0.3`) on Git tag pushes. Configure `REGISTRY_USERNAME` and `REGISTRY_PASSWORD` secrets in the Gitea repository settings.
## v0.2.0 ## v0.2.0
- **CI/CD with Gitea Actions** — automated Docker image build and push on Git tags. Each release produces three tags: full version (`0.2.0`), minor version (`0.2`), and `latest`. Configure `REGISTRY_USERNAME` and `REGISTRY_PASSWORD` secrets in Gitea repository settings. - **CI/CD with Drone** — automated Docker image build and push on Git tags using Drone CI/CD. Each release produces three tags: full version (`0.2.0`), minor version (`0.2`), and `latest`. Configure `REGISTRY_USERNAME` and `REGISTRY_PASSWORD` secrets in Gitea repository settings.
- **Docker build optimization** — added `.dockerignore` to exclude unnecessary files from the build context, reducing build time and image size. - **Docker build optimization** — added `.dockerignore` to exclude unnecessary files from the build context, reducing build time and image size.
- **Release documentation** — added detailed release process guide in `docs/DEVELOPMENT.md` with Semantic Versioning workflow. - **Release documentation** — added detailed release process guide in `docs/DEVELOPMENT.md` with Semantic Versioning workflow.
+1 -1
View File
@@ -23,7 +23,7 @@ FROM eclipse-temurin:21-jre
WORKDIR /app WORKDIR /app
COPY --from=builder /app/build/libs/backend-0.0.1-SNAPSHOT.jar app.jar COPY --from=builder /app/build/libs/backend-0.0.1-SNAPSHOT.jar app.jar
RUN adduser --disabled-password --no-create-home appuser && \ RUN adduser -D -g "" appuser && \
chown appuser:appuser /app chown appuser:appuser /app
USER appuser USER appuser
+1 -1
View File
@@ -5,7 +5,7 @@
**A self-hosted, browser-based system monitoring dashboard powered by Angular and Spring Boot.** **A self-hosted, browser-based system monitoring dashboard powered by Angular and Spring Boot.**
htop-web packages its Angular frontend and Spring Boot WebFlux backend into a single Docker container, providing a web interface for viewing system metrics and process information. htop-web packages its Angular frontend and Spring Boot WebFlux backend into a single Docker container, providing a web interface for viewing system metrics and process information.
<p align="center"> <p align="center">
<img alt="Java 21" src="https://img.shields.io/badge/Java-21-orange?logo=openjdk&logoColor=white"> <img alt="Java 21" src="https://img.shields.io/badge/Java-21-orange?logo=openjdk&logoColor=white">
<img alt="Spring Boot" src="https://img.shields.io/badge/Spring%20Boot-WebFlux-6DB33F?logo=springboot&logoColor=white"> <img alt="Spring Boot" src="https://img.shields.io/badge/Spring%20Boot-WebFlux-6DB33F?logo=springboot&logoColor=white">
+5 -3
View File
@@ -35,7 +35,11 @@ def frontendDir = file('../frontend')
def frontendDistDir = file('../frontend/dist/frontend/browser') def frontendDistDir = file('../frontend/dist/frontend/browser')
def springStaticDir = file('src/main/resources/static') def springStaticDir = file('src/main/resources/static')
// Skip frontend build tasks when building inside Docker (frontend already built in Stage 1)
def skipFrontend = project.hasProperty('skipFrontend') || System.getenv('SKIP_FRONTEND') != null
tasks.register('installFrontendDependencies', Exec) { tasks.register('installFrontendDependencies', Exec) {
onlyIf { !skipFrontend }
workingDir frontendDir workingDir frontendDir
inputs.file(file('../frontend/package.json')) inputs.file(file('../frontend/package.json'))
@@ -50,6 +54,7 @@ tasks.register('installFrontendDependencies', Exec) {
} }
tasks.register('buildFrontend', Exec) { tasks.register('buildFrontend', Exec) {
onlyIf { !skipFrontend }
dependsOn 'installFrontendDependencies' dependsOn 'installFrontendDependencies'
workingDir frontendDir workingDir frontendDir
@@ -66,9 +71,6 @@ tasks.register('buildFrontend', Exec) {
} }
} }
// Skip frontend build tasks when building inside Docker (frontend already built in Stage 1)
def skipFrontend = project.hasProperty('skipFrontend') || System.getenv('SKIP_FRONTEND') != null
tasks.register('copyFrontend', Copy) { tasks.register('copyFrontend', Copy) {
onlyIf { !skipFrontend } onlyIf { !skipFrontend }
dependsOn 'buildFrontend' dependsOn 'buildFrontend'
+111 -21
View File
@@ -93,56 +93,146 @@ docker run -d \
## Release process ## Release process
### Workflow overview
The project uses a **Git-flow** workflow with automatic releases:
1. All development happens in the **`develop`** branch.
2. When code is ready for release, create a **Pull Request** from `develop` → `main`.
3. **Merge the PR** into `main` — this triggers an automatic release.
4. **Drone** builds the Docker image and pushes it to the Gitea Container Registry.
**No manual Git tags are needed** — merging into `main` is the release.
```
develop → PR → merge into main → Drone builds → Docker image pushed
```
### Prerequisites ### Prerequisites
- Gitea Actions runner must be configured and running. - Drone CI/CD runner must be configured and running at `drone.jambotron.com`.
- Repository secrets `REGISTRY_USERNAME` and `REGISTRY_PASSWORD` must be set in **Settings → Secrets** of the Gitea repository. These credentials are used to authenticate with the Gitea Container Registry. - Gitea Container Registry must be enabled on the server.
- Repository secrets `REGISTRY_USERNAME` and `REGISTRY_PASSWORD` must be set in Drone.
### Enabling Container Registry on Gitea server
Container Registry is a built-in feature of Gitea 1.17+. It is **not** configured through the web admin panel — it is enabled via the `app.ini` configuration file on the server.
**1. Find `app.ini` on your server.** The location depends on your installation method:
| Installation | Path to `app.ini` |
|--------------|-------------------|
| Docker (official image) | `/data/gitea/conf/app.ini` inside the container |
| System package (APT/YUM) | `/etc/gitea/app.ini` |
| Manual binary install | `<working-dir>/custom/conf/app.ini` |
You can also find the path from Gitea web interface: **Site Administration → Configuration Summary** — look for `CustomConf` value.
**2. Edit `app.ini`** and add the `[packages]` section:
```ini
[packages]
ENABLED = true
```
If the `[packages]` section already exists, make sure `ENABLED = true`.
**3. Restart Gitea** to apply the changes:
```bash
# Docker
docker compose restart gitea
# System service
sudo systemctl restart gitea
```
**4. Verify** that the registry is working by visiting `https://gitea.jambotron.com/user/packages` — you should see a "Packages" tab.
### Configuring Drone CI/CD
The repository uses **Drone** for CI/CD. The configuration file `.drone.yml` is already included in the repository. Drone is hosted at a separate domain: `drone.jambotron.com`.
**1. Log in to Drone.**
Open `https://drone.jambotron.com` and sign in with your Gitea account.
**2. Activate the repository in Drone.**
After logging in, find `Liosha84/htop-web` in the repository list and click **Activate**.
**3. Configure Drone secrets.**
In Drone, open the repository and go to **Settings → Secrets**. Add two secrets:
**First secret:**
- **Name:** `REGISTRY_USERNAME`
- **Value:** `Liosha84` (your Gitea username)
**Second secret:**
- **Name:** `REGISTRY_PASSWORD`
- **Value:** paste the Access Token with `write:package` and `read:package` scopes.
### Creating an Access Token for CI/CD
The CI/CD workflow cannot use your account password. You need a Personal Access Token with package permissions:
1. Log in to Gitea as `Liosha84`.
2. Go to **Settings** (your avatar → Settings).
3. In the left menu: **Applications → Manage Access Tokens**.
4. You'll see the section: *"These tokens grant access to your account using the Gitea API."*
5. Click **Generate token**.
6. Fill in:
- **Token name:** `ci-docker-push`
- **Expiration:** select **No expiration** (or set a date, but you'll need to update the secret later).
- **Scopes:** check **`write:package`** and **`read:package`**.
7. Click **Generate**.
8. **Copy the token** — it will be shown only once! Save it securely.
### Creating a release ### Creating a release
1. **Update `CHANGELOG.md`** with changes for the new version. 1. **Update `CHANGELOG.md`** with changes for the new version in the `develop` branch.
2. **Commit and push** your changes: 2. **Commit and push** your changes to `develop`:
```bash ```bash
git checkout develop
git add -A git add -A
git commit -m "Prepare release v0.2.0" git commit -m "Feature: new functionality"
git push origin master git push origin develop
``` ```
3. **Create and push a Git tag** with Semantic Versioning: 3. **Create a Pull Request** from `develop` → `main`:
```bash Open `https://gitea.jambotron.com/jambotron_gang/htop-web/compare/develop...main` and click **Create Pull Request**.
git tag -a v0.2.0 -m "Release v0.2.0: new features and fixes"
git push origin v0.2.0
```
4. **Gitea Actions** will automatically: 4. **Merge the PR** into `main`.
5. **Drone** will automatically:
- Build the Docker image using the multi-stage Dockerfile - Build the Docker image using the multi-stage Dockerfile
- Tag it with the version (`0.2.0`), minor version (`0.2`), and `latest` - Tag it with the short commit SHA (e.g., `abc1234`) and `main-latest`
- Push all three tags to the Gitea Container Registry - Push both tags to the Gitea Container Registry
### Docker image tags ### Docker image tags
Each release produces three Docker image tags: Each merge into `main` produces two Docker image tags:
| Tag | Example | Description | | Tag | Example | Description |
|-----|---------|-------------| |-----|---------|-------------|
| Full version | `gitea.jambotron.com/liosha84/htop-web:0.2.0` | Exact version, use in production | | Commit SHA | `gitea.jambotron.com/liosha84/htop-web:abc1234` | Exact commit, use for reproducibility |
| Minor version | `gitea.jambotron.com/liosha84/htop-web:0.2` | Latest patch of 0.2.x | | Main latest | `gitea.jambotron.com/liosha84/htop-web:main-latest` | Most recent merge into main |
| Latest | `gitea.jambotron.com/liosha84/htop-web:latest` | Most recent stable release |
### Using a specific version in production ### Using a specific version in production
In `docker-compose.yml`, always pin to a specific version: In `docker-compose.yml`, pin to a specific commit SHA:
```yaml ```yaml
services: services:
htop-web: htop-web:
image: gitea.jambotron.com/liosha84/htop-web:0.2.0 image: gitea.jambotron.com/liosha84/htop-web:abc1234
``` ```
Avoid using `:latest` in production — it makes rollbacks impossible and breaks reproducibility. Use `main-latest` for development/testing environments. For production, always use the commit SHA tag so you can roll back to a specific version.
## Contribution guidelines ## Contribution guidelines