feat: enhance versioning in workflows and application

- Updated build-release and canary-release workflows to include version arguments.
- Modified Dockerfile to set QS_VERSION environment variable.
- Added method to retrieve current QuickStack version in the service.
- Passed current version to QuickStackVersionInfo component in maintenance page.
- Improved README and CONTRIBUTING documentation for clarity.
This commit is contained in:
biersoeckli
2025-01-16 17:26:37 +00:00
parent 0caae031d7
commit 7f3c4e13a2
9 changed files with 117 additions and 8 deletions

View File

@@ -57,4 +57,4 @@ jobs:
VERSION_ARG=${{ github.ref_name }}
tags: |
quickstack/quickstack:latest
# quickstack/quickstack:${{ github.ref_name }}
quickstack/quickstack:${{ github.ref_name }}

View File

@@ -54,6 +54,6 @@ jobs:
push: true
platforms: linux/amd64
build-args: |
VERSION_ARG=canary
VERSION_ARG=canary-${{ github.run_number }}
tags: |
quickstack/quickstack:canary

90
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,90 @@
# Contributing to QuickStack
Thank you for your interest in contributing to QuickStack! We welcome contributions from the community and are excited to see what you will bring to the project.
## How to Contribute
### Reporting Bugs
If you find a bug, please create an issue in our [GitHub Issues](https://github.com/biersoeckli/QuickStack/issues) with the following information:
- A clear and descriptive title.
- A detailed description of the problem.
- Steps to reproduce the issue.
- Any relevant logs or screenshots.
### Suggesting Enhancements
If you have an idea for a new feature or an enhancement to an existing feature, please create an issue in our [GitHub Issues](https://github.com/biersoeckli/QuickStack/issues) with the following information:
- A clear and descriptive title.
- A detailed description of the proposed enhancement.
- Any relevant examples or mockups.
### Commit Convention
We use parts of the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification for our commit messages.
The commit message should be structured as follows:
```
<type>: <description>
[optional body]
[optional footer]
```
The `type` should be one of the following:
- `feat`: A new feature.
- `fix`: A bug fix.
- `style`: Changes that do not affect the meaning of the code (e.g. whitespace, formatting, etc.).
- `refactor`: Code changes that neither fix a bug nor add a feature.
- `test`: Adding or updating tests.
- `chore`: Changes to the build process or auxiliary tools.
The `description` should be a short, descriptive summary of the changes.
The `body` is optional and should provide more detailed information about the changes.
The `footer` is optional and should contain any breaking changes, issues closed, or other relevant information.
Here is an example of a commit message:
```
feat: add new feature
This is a more detailed description of the new feature.
BREAKING CHANGE: this is a breaking change
```
### Submitting Pull Requests
If you would like to contribute code to QuickStack, please follow these steps:
1. Fork the repository and create your branch from `canary`.
2. If you have added code that should be tested, add tests.
3. Ensure the test suite passes.
4. Make sure your code lints.
5. Submit a pull request to the `canary` branch.
### Running Tests
To run the tests locally, use the following command:
```sh
yarn test
```
### Environment Setup
To setup a developement environment, use the provided devcontainer configuration. This will setup a development environment with all necessary dependencies and the correct node version.
Additionally to the devcontainer, you need a running k3s cluster.
To connect to your own k3s test cluster, provide the kuberentes cretendials in the file `k3s-config.yaml` in the root of the project with the following content.
#### Install Dependencies
```sh
yarn install
```
#### Start Development Server
```sh
yarn dev
```
### License
By contributing to QuickStack, you agree that your contributions will be licensed under the GPL-3.0 license.

View File

@@ -1,5 +1,7 @@
FROM node:18-alpine AS base
ARG VERSION_ARG
RUN apk add --no-cache openssl
# Install dependencies only when needed
@@ -60,6 +62,7 @@ COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules
USER nextjs
ENV PORT=3000
ENV QS_VERSION=$VERSION_ARG
# server.js is created by next build from the standalone output
# https://nextjs.org/docs/pages/api-reference/next-config-js/output

View File

@@ -1,19 +1,25 @@
# QuickStack
<img src="/public/quick-stack-logo-light.png" alt="QuickStack Logo" width="300" style="
display: 'block',
margin: 'auto',
marginBottom: '20px'" />
QuickStack is a open source self-hosted Platform-as-a-Service (PaaS) solution designed to simplify the management of containerized applications on Virtual Private Server (VPS) infrastructures.
Developed as part of a student project at the [Eastern Switzerland University of Applied Sciences](https://ost.ch/), QuickStack provides a scalable and cost-effective alternative to commercial cloud PaaS offerings like Vercel, Digital Ocean App Platform or Azure App Service.
## Key Features
* **Simple Installation:** Deploy QuickStack on a VPS with a single command.
* **One-Command Installation:** Deploy QuickStack on a VPS with a single command.
* **Git Integration:** Deploy applications directly from public or private Git repositories.
* **Docker Container Deployment:** Deploy Docker containers from a Docker Hub, a public or a private registry.
* **Live Logging:** Debug running containers with live log streams.
* **Web Terminal:** Access a web-based terminal directly within the container for debugging.
* **SSL Certificate Management:** Automatic SSL certificate generation via Let's Encrypt.
* **Resource Management:** Set resource limits (CPU, RAM, storage) for each application.
* **Monitoring Dashboard:** Track resource consumption and application performance.
* **Persistent Storage:** Cluster-wide persistent storage volumes for applications using Longhorn.
* **Cluster Support:** Scale applications across multiple VPS nodes using Kubernetes.
* **Cluster Support:** Scale applications across multiple VPS nodes.
* **Persistent Storage:** Cluster-wide persistent storage volumes for applications.
## Getting Started
### Prerequisites
@@ -27,8 +33,10 @@ Before getting started, ensure that you have:
curl -sfL https://get.quickstack.dev/setup.sh | sh -
```
Visit our [docs](https://quickstack.dev/docs/intro) for more detailed installation instructions:
## Contributing
Contributions are welcome! If you have ideas for new features or find bugs, please submit an issue or pull request.
Contributions are welcome! Further information on how to contribute can be found in the [CONTRIBUTING.md](CONTRIBUTING.md) file.
## License
This project is licensed under the GPL-3.0 license.

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

@@ -9,6 +9,7 @@ import s3TargetService from "@/server/services/s3-target.service";
import QuickStackVersionInfo from "./qs-version-info";
import QuickStackMaintenanceSettings from "./qs-maintenance-settings";
import BreadcrumbSetter from "@/components/breadcrumbs-setter";
import quickStackService from "@/server/services/qs.service";
export default async function MaintenancePage() {
@@ -16,6 +17,7 @@ export default async function MaintenancePage() {
const useCanaryChannel = await paramService.getBoolean(ParamService.USE_CANARY_CHANNEL, false);
const qsPodInfos = await podService.getPodsForApp(Constants.QS_NAMESPACE, Constants.QS_APP_NAME);
const qsPodInfo = qsPodInfos.find(p => !!p);
const currentVersion = await quickStackService.getVersionOfCurrentQuickstackInstance();
return (
<div className="flex-1 space-y-4 pt-6">
@@ -32,7 +34,7 @@ export default async function MaintenancePage() {
},
]} />
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div><QuickStackVersionInfo useCanaryChannel={useCanaryChannel!} /></div>
<div><QuickStackVersionInfo currentVersion={currentVersion} useCanaryChannel={useCanaryChannel!} /></div>
<div><QuickStackMaintenanceSettings qsPodName={qsPodInfo?.podName} /></div>
</div>
</div>

View File

@@ -14,8 +14,10 @@ import React from "react";
export default function QuickStackVersionInfo({
useCanaryChannel,
currentVersion
}: {
useCanaryChannel: boolean
useCanaryChannel: boolean;
currentVersion: string;
}) {
const useConfirm = useConfirmDialog();

View File

@@ -15,6 +15,10 @@ class QuickStackService {
private readonly QUICKSTACK_SERVICEACCOUNT_NAME = 'qs-service-account';
private readonly CLUSTER_ISSUER_NAME = 'letsencrypt-production';
async getVersionOfCurrentQuickstackInstance() {
return process.env.QS_VERSION || undefined;
}
async updateQuickStack(useCanaryChannel = false) {
const existingDeployment = await this.getExistingDeployment();
await this.createOrUpdateDeployment(existingDeployment.nextAuthSecret, useCanaryChannel ? 'canary' : 'latest');