mirror of
https://github.com/nianzhibai/91.git
synced 2026-06-15 00:44:30 +08:00
fix: detect Docker image version for update checks
This commit is contained in:
@@ -26,6 +26,8 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v3
|
uses: docker/setup-qemu-action@v3
|
||||||
@@ -52,7 +54,18 @@ jobs:
|
|||||||
type=semver,pattern={{version}}
|
type=semver,pattern={{version}}
|
||||||
type=semver,pattern={{major}}.{{minor}}
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
type=sha,prefix=sha-
|
type=sha,prefix=sha-
|
||||||
type=raw,value=latest,enable={{is_default_branch}}
|
type=raw,value=latest,enable=${{ github.event_name != 'pull_request' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) }}
|
||||||
|
|
||||||
|
- name: Determine image version
|
||||||
|
id: version
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [[ "$GITHUB_REF" == refs/tags/v* ]]; then
|
||||||
|
version="$GITHUB_REF_NAME"
|
||||||
|
else
|
||||||
|
version="$(git describe --tags --abbrev=0 2>/dev/null || git rev-parse --short=12 HEAD)"
|
||||||
|
fi
|
||||||
|
echo "version=$version" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: Build and push Docker image
|
- name: Build and push Docker image
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
@@ -63,6 +76,6 @@ jobs:
|
|||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
build-args: |
|
build-args: |
|
||||||
VERSION=${{ startsWith(github.ref, 'refs/tags/v') && github.ref_name || '' }}
|
VERSION=${{ steps.version.outputs.version }}
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
cache-to: type=gha,mode=max
|
cache-to: type=gha,mode=max
|
||||||
|
|||||||
+1
-1
@@ -48,7 +48,7 @@ COPY backend/config.example.yaml ./config.example.yaml
|
|||||||
COPY 91VideoSpider/ ./91VideoSpider/
|
COPY 91VideoSpider/ ./91VideoSpider/
|
||||||
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
|
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
|
||||||
|
|
||||||
ARG VERSION=
|
ARG VERSION=dev
|
||||||
|
|
||||||
ENV VIDEO_CONFIG=/opt/video-site-91/data/config.yaml \
|
ENV VIDEO_CONFIG=/opt/video-site-91/data/config.yaml \
|
||||||
VIDEO_FRONTEND_DIR=/opt/video-site-91/dist \
|
VIDEO_FRONTEND_DIR=/opt/video-site-91/dist \
|
||||||
|
|||||||
@@ -125,6 +125,7 @@ func main() {
|
|||||||
Catalog: cat,
|
Catalog: cat,
|
||||||
Auth: authr,
|
Auth: authr,
|
||||||
VersionFilePath: versionFilePath,
|
VersionFilePath: versionFilePath,
|
||||||
|
ImageVersion: strings.TrimSpace(os.Getenv("VIDEO_IMAGE_VERSION")),
|
||||||
GitHubRepo: githubRepo,
|
GitHubRepo: githubRepo,
|
||||||
SetupRequired: func() bool {
|
SetupRequired: func() bool {
|
||||||
setupMu.Lock()
|
setupMu.Lock()
|
||||||
|
|||||||
@@ -23,6 +23,10 @@ type AdminServer struct {
|
|||||||
Auth *auth.Authenticator
|
Auth *auth.Authenticator
|
||||||
// VersionFilePath points to the installer-written .version file.
|
// VersionFilePath points to the installer-written .version file.
|
||||||
VersionFilePath string
|
VersionFilePath string
|
||||||
|
// ImageVersion is the Docker image version injected at build/runtime.
|
||||||
|
// It takes precedence over VersionFilePath because Docker data volumes can
|
||||||
|
// keep an older .version file across image upgrades.
|
||||||
|
ImageVersion string
|
||||||
// GitHubRepo is the owner/name repo used for update checks.
|
// GitHubRepo is the owner/name repo used for update checks.
|
||||||
GitHubRepo string
|
GitHubRepo string
|
||||||
// ReleaseAPIURL and HTTPClient are injectable for tests. Production code leaves them empty.
|
// ReleaseAPIURL and HTTPClient are injectable for tests. Production code leaves them empty.
|
||||||
@@ -279,6 +283,9 @@ func (a *AdminServer) checkUpdate(ctx context.Context) (updateCheckDTO, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *AdminServer) installedVersion() string {
|
func (a *AdminServer) installedVersion() string {
|
||||||
|
if version := strings.TrimSpace(a.ImageVersion); version != "" {
|
||||||
|
return version
|
||||||
|
}
|
||||||
path := strings.TrimSpace(a.VersionFilePath)
|
path := strings.TrimSpace(a.VersionFilePath)
|
||||||
if path == "" {
|
if path == "" {
|
||||||
path = ".version"
|
path = ".version"
|
||||||
|
|||||||
@@ -194,6 +194,54 @@ func TestHandleCheckUpdateReportsUpToDate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHandleCheckUpdateUsesDockerImageVersion(t *testing.T) {
|
||||||
|
releaseServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
writeJSON(w, http.StatusOK, map[string]any{
|
||||||
|
"tag_name": "v0.2.0",
|
||||||
|
"html_url": "https://github.com/nianzhibai/91/releases/tag/v0.2.0",
|
||||||
|
})
|
||||||
|
}))
|
||||||
|
t.Cleanup(releaseServer.Close)
|
||||||
|
|
||||||
|
req := httptest.NewRequest(http.MethodGet, "/admin/api/update/check", nil)
|
||||||
|
rr := httptest.NewRecorder()
|
||||||
|
(&AdminServer{
|
||||||
|
ImageVersion: "v0.1.0",
|
||||||
|
ReleaseAPIURL: releaseServer.URL,
|
||||||
|
}).handleCheckUpdate(rr, req)
|
||||||
|
|
||||||
|
if rr.Code != http.StatusOK {
|
||||||
|
t.Fatalf("status = %d, body = %s", rr.Code, rr.Body.String())
|
||||||
|
}
|
||||||
|
var got updateCheckDTO
|
||||||
|
if err := json.NewDecoder(rr.Body).Decode(&got); err != nil {
|
||||||
|
t.Fatalf("decode: %v", err)
|
||||||
|
}
|
||||||
|
if got.CurrentVersion != "v0.1.0" {
|
||||||
|
t.Fatalf("currentVersion = %q, want v0.1.0", got.CurrentVersion)
|
||||||
|
}
|
||||||
|
if !got.HasUpdate {
|
||||||
|
t.Fatalf("hasUpdate = false, want true")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInstalledVersionPrefersDockerImageVersionOverVersionFile(t *testing.T) {
|
||||||
|
dir := t.TempDir()
|
||||||
|
versionFile := filepath.Join(dir, ".version")
|
||||||
|
if err := os.WriteFile(versionFile, []byte("v0.1.0\n"), 0o644); err != nil {
|
||||||
|
t.Fatalf("write version file: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
got := (&AdminServer{
|
||||||
|
VersionFilePath: versionFile,
|
||||||
|
ImageVersion: "v0.2.0",
|
||||||
|
}).installedVersion()
|
||||||
|
|
||||||
|
if got != "v0.2.0" {
|
||||||
|
t.Fatalf("installedVersion = %q, want v0.2.0", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestHandleUpsertDrivePreservesExistingCredentialsWhenRequestCredentialsEmpty(t *testing.T) {
|
func TestHandleUpsertDrivePreservesExistingCredentialsWhenRequestCredentialsEmpty(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
cat, err := catalog.Open(t.TempDir() + "/catalog.db")
|
cat, err := catalog.Open(t.TempDir() + "/catalog.db")
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ else
|
|||||||
echo "[entrypoint] using existing $CONFIG"
|
echo "[entrypoint] using existing $CONFIG"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "${VIDEO_VERSION_FILE:-}" ] && [ -n "${VIDEO_IMAGE_VERSION:-}" ] && [ ! -f "$VIDEO_VERSION_FILE" ]; then
|
if [ -n "${VIDEO_VERSION_FILE:-}" ] && [ -n "${VIDEO_IMAGE_VERSION:-}" ]; then
|
||||||
mkdir -p "$(dirname "$VIDEO_VERSION_FILE")"
|
mkdir -p "$(dirname "$VIDEO_VERSION_FILE")"
|
||||||
printf '%s\n' "$VIDEO_IMAGE_VERSION" > "$VIDEO_VERSION_FILE"
|
printf '%s\n' "$VIDEO_IMAGE_VERSION" > "$VIDEO_VERSION_FILE"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user