feat(release): add semantic version to application builds

This commit is contained in:
eezd committed 2026-10-27 14:15:57 +08:00
1 parent 10fd6d8efb
commit 12d13327a6
6 files changed
+22 -3

No files matched your search

+7 -1
View File
@@ -7,12 +7,14 @@ RUN corepack enable && corepack prepare [email protected] --activate
COPY web/package.json web/pnpm-lock.yaml web/pnpm-workspace.yaml web/.npmrc ./ COPY web/package.json web/pnpm-lock.yaml web/pnpm-workspace.yaml web/.npmrc ./
RUN pnpm install --frozen-lockfile RUN pnpm install --frozen-lockfile
COPY web/ ./ COPY web/ ./
COPY VERSION /src/VERSION
RUN pnpm build RUN pnpm build
# ---- Backend (frontend assets embedded in the binary) ---- # ---- Backend (frontend assets embedded in the binary) ----
FROM golang:1-alpine AS server FROM golang:1-alpine AS server
WORKDIR /src WORKDIR /src
COPY go.mod go.sum ./ COPY go.mod go.sum ./
COPY VERSION ./
RUN go mod download RUN go mod download
COPY cmd ./cmd COPY cmd ./cmd
COPY internal ./internal COPY internal ./internal
@@ -20,10 +22,14 @@ COPY deploy/embed.go ./deploy/
COPY deploy/data/vault ./deploy/data/vault COPY deploy/data/vault ./deploy/data/vault
COPY web/embed.go web/font_storage.go ./web/ COPY web/embed.go web/font_storage.go ./web/
COPY --from=web /src/web/dist ./web/dist COPY --from=web /src/web/dist ./web/dist
RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /out/rawmark ./cmd/rawmark && mkdir -p /out/data RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w -X main.releaseVersion=$(cat VERSION)" -o /out/rawmark ./cmd/rawmark && mkdir -p /out/data
# ---- Runtime ---- # ---- Runtime ----
FROM gcr.io/distroless/static:nonroot FROM gcr.io/distroless/static:nonroot
COPY LICENSE /LICENSE
COPY web/LICENSE /licenses/vue3-starter-MIT.txt
COPY web/src/common/appearance/fonts/*-OFL.txt /licenses/
COPY web/src/common/appearance/fonts/maple/LICENSE.txt /licenses/Maple-Mono-OFL.txt
COPY --from=server /out/rawmark /rawmark COPY --from=server /out/rawmark /rawmark
COPY --from=server --chown=nonroot:nonroot /out/data /data COPY --from=server --chown=nonroot:nonroot /out/data /data
ENV RAWMARK_DATA=/data ENV RAWMARK_DATA=/data
+1
View File
@@ -0,0 +1 @@
0.1.0
+7
View File
@@ -32,6 +32,9 @@ import (
"rawmark/web" "rawmark/web"
) )
// releaseVersion is set from VERSION by release and Docker builds.
var releaseVersion = "dev"
func env(key, def string) string { func env(key, def string) string {
if v := os.Getenv(key); v != "" { if v := os.Getenv(key); v != "" {
return v return v
@@ -40,6 +43,10 @@ func env(key, def string) string {
} }
func main() { func main() {
if len(os.Args) > 1 && os.Args[1] == "--version" {
fmt.Println("RawMark " + releaseVersion)
return
}
addr := env("RAWMARK_ADDR", ":8080") addr := env("RAWMARK_ADDR", ":8080")
if len(os.Args) > 1 && os.Args[1] == "healthcheck" { if len(os.Args) > 1 && os.Args[1] == "healthcheck" {
os.Exit(healthcheck(addr)) os.Exit(healthcheck(addr))
+3 -2
View File
@@ -21,6 +21,7 @@ import { searchSettings, SETTINGS_SECTIONS } from './settings-catalog'
const props = defineProps<{ prepareMaintenance: () => Promise<void>, restoreNote: (id: string) => Promise<void> }>() const props = defineProps<{ prepareMaintenance: () => Promise<void>, restoreNote: (id: string) => Promise<void> }>()
const emit = defineEmits<{ importNotes: [] }>() const emit = defineEmits<{ importNotes: [] }>()
const { settingsSave } = useSettingsStore() const { settingsSave } = useSettingsStore()
const releaseVersion = __RAWMARK_RELEASE__
const buildVersion = import.meta.env.DEV ? translate('settings.development_0d1c11') : document.querySelector<HTMLMetaElement>('meta[name="rawmark-version"]')?.content const buildVersion = import.meta.env.DEV ? translate('settings.development_0d1c11') : document.querySelector<HTMLMetaElement>('meta[name="rawmark-version"]')?.content
if (!buildVersion) throw new Error(translate('settings.application_build_information_is_missing_6b04f9')) if (!buildVersion) throw new Error(translate('settings.application_build_information_is_missing_6b04f9'))
const model = defineModel<SettingsSection | 'index' | null>({ required: true }) const model = defineModel<SettingsSection | 'index' | null>({ required: true })
@@ -80,7 +81,7 @@ function close() {
</button> </button>
</div> </div>
<div class="rm-settings-nav-foot"> <div class="rm-settings-nav-foot">
<span>RawMark</span><small>{{ buildVersion }}</small> <span>RawMark</span><small>{{ releaseVersion }}</small>
</div> </div>
</nav> </nav>
<section class="rm-settings-body"> <section class="rm-settings-body">
@@ -120,7 +121,7 @@ function close() {
{{ translate('settings.rawmark_a_markdown_note_editor_66b52a') }} {{ translate('settings.rawmark_a_markdown_note_editor_66b52a') }}
</p> </p>
<SettingRow id="version"> <SettingRow id="version">
<code>{{ buildVersion }}</code> <code>{{ releaseVersion }} · {{ buildVersion }}</code>
</SettingRow> </SettingRow>
<SettingRow id="install"> <SettingRow id="install">
<el-button v-if="installPrompt" class="rm-btn" @click="installApp"> <el-button v-if="installPrompt" class="rm-btn" @click="installApp">
+1
View File
@@ -0,0 +1 @@
declare const __RAWMARK_RELEASE__: string
+3
View File
@@ -8,7 +8,10 @@ import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import Components from 'unplugin-vue-components/vite' import Components from 'unplugin-vue-components/vite'
import { defineConfig } from 'vitest/config' import { defineConfig } from 'vitest/config'
const releaseVersion = readFileSync(new URL('../VERSION', import.meta.url), 'utf8').trim()
export default defineConfig({ export default defineConfig({
define: { __RAWMARK_RELEASE__: JSON.stringify(releaseVersion) },
resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), '@@': fileURLToPath(new URL('./src/common', import.meta.url)) } }, resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), '@@': fileURLToPath(new URL('./src/common', import.meta.url)) } },
plugins: [ plugins: [
vue(), vue(),