16 Commits
Author SHA1 Message Date
Liosha84 ffc1026ce1 Merge pull request 'fix(drone): use 'master' branch instead of 'main' for build-and-push trigger' (#6) from develop into master
continuous-integration/drone/push Build is passing
Reviewed-on: #6
2026-10-29 01:14:03 +01:00
Liosha84andJunie 0680557886 fix(drone): use 'master' branch instead of 'main' for build-and-push trigger
continuous-integration/drone/pr Build is failing
Co-authored-by: Junie <junie@jetbrains.com>
2026-10-29 01:13:10 +01:00
Liosha84 ea453bd409 Merge pull request 'fix(docker): use correct Debian adduser syntax for non-interactive user creation' (#5) from develop into master
Reviewed-on: #5
2026-10-29 01:06:38 +01:00
Liosha84 3c85936c73 fix(docker): use correct Debian adduser syntax for non-interactive user creation
continuous-integration/drone/pr Build is failing
2026-10-29 00:59:44 +01:00
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
7 changed files with 80 additions and 33 deletions
+19 -2
View File
@@ -1,10 +1,27 @@
kind: pipeline kind: pipeline
type: docker 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 name: build-and-push
trigger: trigger:
event: event:
- tag - push
branch:
- master
steps: steps:
- name: build-and-push - name: build-and-push
@@ -14,7 +31,7 @@ steps:
context: . context: .
registry: gitea.jambotron.com registry: gitea.jambotron.com
repo: gitea.jambotron.com/liosha84/htop-web repo: gitea.jambotron.com/liosha84/htop-web
auto_tag: true tags: ${DRONE_COMMIT_SHA},main-latest
username: username:
from_secret: REGISTRY_USERNAME from_secret: REGISTRY_USERNAME
password: password:
+7
View File
@@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel>
<module name="backend" target="21" />
<module name="backend.main" target="21" />
<module name="backend.test" target="21" />
</bytecodeTargetLevel>
</component>
<component name="JavacSettings"> <component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE"> <option name="ADDITIONAL_OPTIONS_OVERRIDE">
<module name="backend" options="-parameters" /> <module name="backend" options="-parameters" />
+3
View File
@@ -6,6 +6,9 @@ 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 ## 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. - **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.
+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 --disabled-password --gecos "" appuser && \
chown appuser:appuser /app chown appuser:appuser /app
USER appuser USER appuser
+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'
+44 -26
View File
@@ -93,11 +93,26 @@ 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
- Drone CI/CD runner must be configured and running. - Drone CI/CD runner must be configured and running at `drone.jambotron.com`.
- Gitea Container Registry must be enabled on the server. - Gitea Container Registry must be enabled on the server.
- Repository secrets `REGISTRY_USERNAME` and `REGISTRY_PASSWORD` must be set in the Gitea repository. - Repository secrets `REGISTRY_USERNAME` and `REGISTRY_PASSWORD` must be set in Drone.
### Enabling Container Registry on Gitea server ### Enabling Container Registry on Gitea server
@@ -136,15 +151,19 @@ sudo systemctl restart gitea
### Configuring Drone CI/CD ### Configuring Drone CI/CD
The repository uses **Drone** for CI/CD. The configuration file `.drone.yml` is already included in the repository. 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. Enable Drone for the repository.** **1. Log in to Drone.**
In Gitea, open the repository and go to **Settings → Drone**. Enable Drone CI/CD for the repository. Open `https://drone.jambotron.com` and sign in with your Gitea account.
**2. Configure Drone secrets.** **2. Activate the repository in Drone.**
In Gitea, open the repository and go to **Settings → Secrets** (or **Variables and Secrets → Secrets**). Add two secrets: 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:** **First secret:**
- **Name:** `REGISTRY_USERNAME` - **Name:** `REGISTRY_USERNAME`
@@ -172,49 +191,48 @@ The CI/CD workflow cannot use your account password. You need a Personal Access
### 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. **Drone** 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
- Auto-tag it using Semantic Versioning: `v0.2.0` produces tags `0.2`, `0.2.0` - Tag it with the short commit SHA (e.g., `abc1234`) and `main-latest`
- Push all 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