feat(version): show git commit and env [EE-6021] (#10748)

pull/11017/head
Chaim Lev-Ari 10 months ago committed by GitHub
parent 52db4cba0e
commit 4a10c2bb07
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -110,6 +110,8 @@ jobs:
export YARN_VERSION=$(yarn --version)
export WEBPACK_VERSION=$(yarn list webpack --depth=0 | grep webpack | awk -F@ '{print $2}')
export BUILDNUMBER=${GITHUB_RUN_NUMBER}
GIT_COMMIT_HASH_LONG=${{ github.sha }}
export GIT_COMMIT_HASH_SHORT={GIT_COMMIT_HASH_LONG:0:7}
make build-all PLATFORM=${{ matrix.config.platform }} ARCH=${{ matrix.config.arch }} ENV=${NODE_ENV}
env:
CONTAINER_IMAGE_TAG: ${{ env.CONTAINER_IMAGE_TAG }}

@ -1,9 +1,12 @@
package build
import "runtime"
// Variables to be set during the build time
var BuildNumber string
var ImageTag string
var NodejsVersion string
var YarnVersion string
var WebpackVersion string
var GoVersion string
var GoVersion string = runtime.Version()
var GitCommit string

@ -47,7 +47,7 @@ func NewHandler(bouncer security.BouncerService,
authenticatedRouter := router.PathPrefix("/").Subrouter()
authenticatedRouter.Use(bouncer.AuthenticatedAccess)
authenticatedRouter.Handle("/version", http.HandlerFunc(h.version)).Methods(http.MethodGet)
authenticatedRouter.Handle("/version", httperror.LoggerHandler(h.version)).Methods(http.MethodGet)
authenticatedRouter.Handle("/nodes", httperror.LoggerHandler(h.systemNodesCount)).Methods(http.MethodGet)
authenticatedRouter.Handle("/info", httperror.LoggerHandler(h.systemInfo)).Methods(http.MethodGet)

@ -2,10 +2,13 @@ package system
import (
"net/http"
"os"
portainer "github.com/portainer/portainer/api"
"github.com/portainer/portainer/api/build"
"github.com/portainer/portainer/api/http/client"
"github.com/portainer/portainer/api/http/security"
httperror "github.com/portainer/portainer/pkg/libhttp/error"
"github.com/portainer/portainer/pkg/libhttp/response"
"github.com/coreos/go-semver/semver"
@ -32,6 +35,8 @@ type BuildInfo struct {
YarnVersion string
WebpackVersion string
GoVersion string
GitCommit string
Env []string `json:",omitempty"`
}
// @id systemVersion
@ -44,7 +49,11 @@ type BuildInfo struct {
// @produce json
// @success 200 {object} versionResponse "Success"
// @router /system/version [get]
func (handler *Handler) version(w http.ResponseWriter, r *http.Request) {
func (handler *Handler) version(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
isAdmin, err := security.IsAdmin(r)
if err != nil {
return httperror.Forbidden("Permission denied to access Portainer", err)
}
result := &versionResponse{
ServerVersion: portainer.APIVersion,
@ -57,16 +66,21 @@ func (handler *Handler) version(w http.ResponseWriter, r *http.Request) {
YarnVersion: build.YarnVersion,
WebpackVersion: build.WebpackVersion,
GoVersion: build.GoVersion,
GitCommit: build.GitCommit,
},
}
if isAdmin {
result.Build.Env = os.Environ()
}
latestVersion := GetLatestVersion()
if HasNewerVersion(portainer.APIVersion, latestVersion) {
result.UpdateAvailable = true
result.LatestVersion = latestVersion
}
response.JSON(w, &result)
return response.JSON(w, &result)
}
func GetLatestVersion() string {

@ -21,6 +21,8 @@ export interface VersionResponse {
YarnVersion: string;
WebpackVersion: string;
GoVersion: string;
GitCommit: string;
Env?: string[];
};
}

@ -1,8 +1,18 @@
import { useState } from 'react';
import { Database, Hash, Server, Tag, Wrench } from 'lucide-react';
import {
Database,
GitCommit,
Hash,
Server,
Tag,
Variable,
Wrench,
} from 'lucide-react';
import clsx from 'clsx';
import { useSystemStatus } from '@/react/portainer/system/useSystemStatus';
import { useSystemVersion } from '@/react/portainer/system/useSystemVersion';
import { useCurrentUser } from '@/react/hooks/useUser';
import { Modal } from '@@/modals';
import { Button } from '@@/buttons';
@ -37,6 +47,7 @@ export function BuildInfoModalButton() {
}
function BuildInfoModal({ closeModal }: { closeModal: () => void }) {
const { isAdmin } = useCurrentUser();
const versionQuery = useSystemVersion();
const statusQuery = useSystemStatus();
@ -82,6 +93,13 @@ function BuildInfoModal({ closeModal }: { closeModal: () => void }) {
</span>
</td>
</tr>
<tr>
<td>
<GitCommit size="13" className="space-right" />
Git Commit: {Build.GitCommit}
</td>
<td />
</tr>
</tbody>
</table>
</div>
@ -102,6 +120,25 @@ function BuildInfoModal({ closeModal }: { closeModal: () => void }) {
<span className="text-muted small">Go v{Build.GoVersion}</span>
</div>
</div>
{isAdmin && Build.Env && (
<div className={clsx(styles.toolsList, 'mt-3')}>
<span className="inline-flex items-center ">
<Variable size="13" className="space-right" />
Environment Variables
</span>
<div
className={clsx(styles.tools, 'max-h-32 overflow-auto space-y-2')}
>
{Build.Env.map((envVar) => (
<div key={envVar}>
<code>{envVar}</code>
</div>
))}
</div>
</div>
)}
</Modal.Body>
<Modal.Footer>
<Button className="w-full" onClick={closeModal}>

@ -4,12 +4,14 @@ set -euo pipefail
mkdir -p dist
# populate tool versions
BUILDNUMBER=${BUILDNUMBER:-"N/A"}
CONTAINER_IMAGE_TAG=${CONTAINER_IMAGE_TAG:-"N/A"}
NODE_VERSION=${NODE_VERSION:-"N/A"}
YARN_VERSION=${YARN_VERSION:-"N/A"}
WEBPACK_VERSION=${WEBPACK_VERSION:-"N/A"}
GO_VERSION=${GO_VERSION:-"N/A"}
NODE_VERSION=${NODE_VERSION:-$(node -v)}
YARN_VERSION=${YARN_VERSION:-$(yarn --version))}
WEBPACK_VERSION=${WEBPACK_VERSION:-$(yarn list webpack --depth=0 | grep webpack | awk -F@ '{print $2}')}
GO_VERSION=${GO_VERSION:-$(go version | awk '{print $3}')}
GIT_COMMIT_HASH=${GIT_COMMIT_HASH:-$(git rev-parse --short HEAD)}
# copy templates
cp -r "./mustache-templates" "./dist"
@ -26,6 +28,7 @@ ldflags="-s -X 'github.com/portainer/liblicense.LicenseServerBaseURL=https://api
-X 'github.com/portainer/portainer/api/build.NodejsVersion=${NODE_VERSION}' \
-X 'github.com/portainer/portainer/api/build.YarnVersion=${YARN_VERSION}' \
-X 'github.com/portainer/portainer/api/build.WebpackVersion=${WEBPACK_VERSION}' \
-X 'github.com/portainer/portainer/api/build.GitCommit=${GIT_COMMIT_HASH}' \
-X 'github.com/portainer/portainer/api/build.GoVersion=${GO_VERSION}'"
BINARY_VERSION_FILE="../binary-version.json"

@ -100,7 +100,7 @@
"js-yaml": "^3.14.0",
"jsdom": "^24.0.0",
"lodash": "^4.17.21",
"lucide-react": "^0.101.0",
"lucide-react": "^0.258.0",
"moment": "^2.29.1",
"moment-timezone": "^0.5.40",
"mustache": "^4.2.0",

@ -12478,10 +12478,10 @@ lru-cache@^6.0.0:
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484"
integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==
lucide-react@^0.101.0:
version "0.101.0"
resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.101.0.tgz#0d5c00748c9c7f2a0e7e8b85acff9e5492c8fdcb"
integrity sha512-jziosG8Cvqk19et2srzNidxvewTsPiNM8fWc5WSzdeZX1GC8w9PZWG+oXwVU5yy/LWMBCjgVicrmtmp6wWxCDw==
lucide-react@^0.258.0:
version "0.258.0"
resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.258.0.tgz#dbdabafad2835a0a452e8f677531a877cdd93ae8"
integrity sha512-3evnpKadBrjLr2HHJ66eDZ1y0vPS6pm8NiNDaLqhddUUyJGnA+lfDPZfbVkuAFq7Xaa1TEy7Sg17sM7mHpMKrA==
lz-string@^1.4.4:
version "1.4.4"

Loading…
Cancel
Save