mirror of
https://github.com/cnrancher/kube-explorer.git
synced 2025-08-18 06:27:08 +00:00
Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
24a7324f92 | ||
|
71ad854ab1 |
2
.github/workflows/pr.yaml
vendored
2
.github/workflows/pr.yaml
vendored
@ -16,4 +16,6 @@ jobs:
|
|||||||
- name: Commitsar check
|
- name: Commitsar check
|
||||||
uses: aevea/commitsar@v0.20.2
|
uses: aevea/commitsar@v0.20.2
|
||||||
- name: Build to test
|
- name: Build to test
|
||||||
|
env:
|
||||||
|
SKIP_COMPRESS: "true"
|
||||||
run: make ci
|
run: make ci
|
||||||
|
91
.github/workflows/push.yaml
vendored
91
.github/workflows/push.yaml
vendored
@ -3,14 +3,9 @@ name: Push to Master
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- release/v*
|
|
||||||
- main
|
- main
|
||||||
- "release/v*"
|
|
||||||
tags:
|
tags:
|
||||||
- "v*.*.*" # Matches any tag that starts with 'v' and follows semantic versioning
|
- 'v*.*.*' # Matches any tag that starts with 'v' and follows semantic versioning
|
||||||
|
|
||||||
env:
|
|
||||||
ALIYUN_REGISTRY: ${{ vars.ALIYUN_REGISTRY || '' }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-and-deploy:
|
build-and-deploy:
|
||||||
@ -20,69 +15,63 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: CI
|
|
||||||
env:
|
|
||||||
SKIP_PACKAGE: "true"
|
|
||||||
run: make ci
|
|
||||||
- name: Prepare for packaging image
|
|
||||||
run: cp dist/* package/
|
|
||||||
# aliyun image to test the docker build is ok
|
|
||||||
- name: Login to Aliyun ACR
|
- name: Login to Aliyun ACR
|
||||||
if: ${{ vars.ALIYUN_REGISTRY != '' }}
|
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ${{ env.ALIYUN_REGISTRY }}
|
registry: registry.cn-shenzhen.aliyuncs.com
|
||||||
username: ${{ secrets.ACR_USERNAME }}
|
username: ${{ secrets.ACR_USERNAME }}
|
||||||
password: ${{ secrets.ACR_TOKEN }}
|
password: ${{ secrets.ACR_TOKEN }}
|
||||||
- name: Aliyun image docker meta
|
if: ${{ vars.ALIYUN == 'true' }}
|
||||||
if: ${{ vars.ALIYUN_REGISTRY != '' }}
|
|
||||||
id: aliyun-meta
|
|
||||||
uses: docker/metadata-action@v5
|
|
||||||
with:
|
|
||||||
images: ${{ env.ALIYUN_REGISTRY }}/${{ vars.REPO || 'cnrancher' }}/${{ vars.IMAGE || 'kube-explorer' }}
|
|
||||||
tags: |
|
|
||||||
type=ref,event=tag
|
|
||||||
type=ref,event=branch,suffix=-head
|
|
||||||
- name: Build to Aliyun
|
|
||||||
if: ${{ vars.ALIYUN_REGISTRY != '' }}
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
labels: ${{ steps.aliyun-meta.outputs.labels }}
|
|
||||||
tags: "${{ steps.aliyun-meta.outputs.tags }}"
|
|
||||||
context: package
|
|
||||||
push: true
|
|
||||||
|
|
||||||
# docker hub multi-arch image
|
|
||||||
- name: Login to Dockerhub
|
- name: Login to Dockerhub
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
- name: Docker meta
|
- name: CI
|
||||||
id: meta
|
if: startsWith(github.ref, 'refs/heads/')
|
||||||
uses: docker/metadata-action@v5
|
env:
|
||||||
with:
|
CROSS: push
|
||||||
images: ${{ vars.REPO || 'cnrancher' }}/${{ vars.IMAGE || 'kube-explorer' }}
|
run: make github_ci
|
||||||
tags: |
|
|
||||||
type=ref,event=tag
|
- name: CI
|
||||||
type=ref,event=branch,suffix=-head
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
- name: Set up QEMU
|
env:
|
||||||
|
CROSS: tag
|
||||||
|
run: |
|
||||||
|
make github_ci
|
||||||
|
make release-note
|
||||||
|
|
||||||
|
- name: Prepare for packaging image
|
||||||
|
run: cp dist/* package/
|
||||||
|
- name: Set docker iamge name
|
||||||
|
id: image-name
|
||||||
|
env:
|
||||||
|
REPO_OVERRIDE: ${{ vars.REPO || 'cnrancher' }}
|
||||||
|
IMAGE_OVERRIDE: ${{ vars.IMAGE || 'kube-explorer' }}
|
||||||
|
run: |
|
||||||
|
tag_name=latest;
|
||||||
|
if [[ ${GITHUB_REF} == refs/tags/* ]]; then tag_name=${GITHUB_REF#refs/tags/}; fi;
|
||||||
|
echo "image_name=${REPO_OVERRIDE}/${IMAGE_OVERRIDE}:${tag_name}" >> $GITHUB_OUTPUT;
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v3
|
uses: docker/setup-qemu-action@v3
|
||||||
- name: Set up Docker Buildx
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
- name: Build to Dockerhub
|
- name: Build to Dockerhub
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
platforms: linux/amd64,linux/arm64/v8
|
platforms: linux/amd64,linux/arm64/v8
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
tags: "${{ steps.image-name.outputs.image_name }}"
|
||||||
tags: "${{ steps.meta.outputs.tags }}"
|
|
||||||
context: package
|
context: package
|
||||||
push: true
|
push: true
|
||||||
|
- name: Build to Aliyun
|
||||||
- name: Make release note
|
uses: docker/build-push-action@v6
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
with:
|
||||||
run: |
|
tags: registry.cn-shenzhen.aliyuncs.com/${{ steps.image-name.outputs.image_name }}
|
||||||
make release-note
|
context: package
|
||||||
|
push: true
|
||||||
|
if: ${{ vars.ALIYUN == 'true' }}
|
||||||
- name: Release
|
- name: Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -23,7 +23,3 @@
|
|||||||
/.vscode
|
/.vscode
|
||||||
/vendor
|
/vendor
|
||||||
/internal/ui/ui/
|
/internal/ui/ui/
|
||||||
**/Dockerfile.dapper*
|
|
||||||
!**/Dockerfile.dapper
|
|
||||||
|
|
||||||
dist/
|
|
||||||
|
@ -1,75 +0,0 @@
|
|||||||
# This is an example .goreleaser.yml file with some sensible defaults.
|
|
||||||
# Make sure to check the documentation at https://goreleaser.com
|
|
||||||
|
|
||||||
# The lines below are called `modelines`. See `:help modeline`
|
|
||||||
# Feel free to remove those if you don't want/need to use them.
|
|
||||||
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
|
|
||||||
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
|
|
||||||
|
|
||||||
version: 2
|
|
||||||
|
|
||||||
dist: bin
|
|
||||||
|
|
||||||
before:
|
|
||||||
hooks:
|
|
||||||
# You may remove this if you don't use go modules.
|
|
||||||
- go mod tidy
|
|
||||||
|
|
||||||
builds:
|
|
||||||
- id: prod
|
|
||||||
env:
|
|
||||||
- CGO_ENABLED=0
|
|
||||||
targets:
|
|
||||||
- "darwin_amd64"
|
|
||||||
- "darwin_arm64"
|
|
||||||
- "linux_amd64"
|
|
||||||
- "linux_arm64"
|
|
||||||
- "linux_arm"
|
|
||||||
- "windows_amd64"
|
|
||||||
flags:
|
|
||||||
- -tags=embed
|
|
||||||
binary: '{{ .ProjectName }}-{{ .Os }}-{{ .Arch }}'
|
|
||||||
ldflags: |
|
|
||||||
{{ if ne .Os "darwin" }}
|
|
||||||
-extldflags -static -s
|
|
||||||
{{ else }}
|
|
||||||
-s -w
|
|
||||||
{{ end }}
|
|
||||||
-X github.com/cnrancher/kube-explorer/internal/version.Version={{ .Env.VERSION }}
|
|
||||||
-X github.com/cnrancher/kube-explorer/internal/version.GitCommit={{ .Env.COMMIT }}
|
|
||||||
-X github.com/cnrancher/kube-explorer/internal/config.APIUIVersion={{ .Env.CATTLE_API_UI_VERSION }}
|
|
||||||
no_unique_dist_dir: true
|
|
||||||
- id: dev
|
|
||||||
env:
|
|
||||||
- CGO_ENABLED=0
|
|
||||||
targets:
|
|
||||||
- "linux_amd64"
|
|
||||||
- "linux_arm64"
|
|
||||||
flags:
|
|
||||||
- -tags=embed
|
|
||||||
binary: '{{ .ProjectName }}-{{ .Os }}-{{ .Arch }}'
|
|
||||||
ldflags: |
|
|
||||||
{{ if ne .Os "darwin" }}
|
|
||||||
-extldflags -static -s
|
|
||||||
{{ else }}
|
|
||||||
-s -w
|
|
||||||
{{ end }}
|
|
||||||
-X github.com/cnrancher/kube-explorer/internal/version.Version={{ .Env.VERSION }}
|
|
||||||
-X github.com/cnrancher/kube-explorer/internal/version.GitCommit={{ .Env.COMMIT }}
|
|
||||||
-X github.com/cnrancher/kube-explorer/internal/config.APIUIVersion={{ .Env.CATTLE_API_UI_VERSION }}
|
|
||||||
no_unique_dist_dir: true
|
|
||||||
upx:
|
|
||||||
- compress: "5"
|
|
||||||
ids:
|
|
||||||
- prod
|
|
||||||
enabled: true
|
|
||||||
goos:
|
|
||||||
- linux
|
|
||||||
- windows
|
|
||||||
|
|
||||||
changelog:
|
|
||||||
sort: asc
|
|
||||||
filters:
|
|
||||||
exclude:
|
|
||||||
- "^docs:"
|
|
||||||
- "^test:"
|
|
@ -1,7 +1,6 @@
|
|||||||
FROM goreleaser/goreleaser:v2.3.2 as goreleaser
|
|
||||||
FROM aevea/release-notary:0.9.2 as tools
|
FROM aevea/release-notary:0.9.2 as tools
|
||||||
|
|
||||||
FROM registry.suse.com/bci/golang:1.23
|
FROM registry.suse.com/bci/golang:1.22
|
||||||
ARG PROXY
|
ARG PROXY
|
||||||
ARG GOPROXY
|
ARG GOPROXY
|
||||||
ARG DAPPER_HOST_ARCH
|
ARG DAPPER_HOST_ARCH
|
||||||
@ -9,21 +8,21 @@ ENV HOST_ARCH=${DAPPER_HOST_ARCH} ARCH=${DAPPER_HOST_ARCH}
|
|||||||
ENV https_proxy=${PROXY} \
|
ENV https_proxy=${PROXY} \
|
||||||
http_proxy=${PROXY}
|
http_proxy=${PROXY}
|
||||||
|
|
||||||
RUN zypper -n install ca-certificates git-core wget curl unzip tar vim less file xz cosign docker
|
RUN zypper -n install ca-certificates git-core wget curl unzip tar vim less file xz
|
||||||
|
RUN zypper install -y -f docker
|
||||||
|
|
||||||
ENV UPX_VERSION 4.2.1
|
ENV UPX_VERSION 4.2.1
|
||||||
RUN curl -sL https://github.com/upx/upx/releases/download/v${UPX_VERSION}/upx-${UPX_VERSION}-${ARCH}_linux.tar.xz | tar xvJf - --strip-components=1 -C /tmp && \
|
RUN curl -sL https://github.com/upx/upx/releases/download/v${UPX_VERSION}/upx-${UPX_VERSION}-${ARCH}_linux.tar.xz | tar xvJf - --strip-components=1 -C /tmp && \
|
||||||
mv /tmp/upx /usr/bin/
|
mv /tmp/upx /usr/bin/
|
||||||
|
|
||||||
RUN if [ "${ARCH}" == "amd64" ]; then \
|
RUN if [ "${ARCH}" == "amd64" ]; then \
|
||||||
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.61.0; \
|
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.54.2; \
|
||||||
fi
|
fi
|
||||||
COPY --from=goreleaser /usr/bin/goreleaser /usr/bin/goreleaser
|
|
||||||
COPY --from=tools /app/release-notary /usr/local/bin/
|
COPY --from=tools /app/release-notary /usr/local/bin/
|
||||||
ENV CATTLE_DASHBOARD_UI_VERSION="v2.9.2-kube-explorer-ui-rc1"
|
ENV CATTLE_DASHBOARD_UI_VERSION="v2.8.5-kube-explorer-ui-rc1"
|
||||||
ENV CATTLE_API_UI_VERSION="1.1.11"
|
ENV CATTLE_API_UI_VERSION="1.1.11"
|
||||||
|
|
||||||
ENV DAPPER_ENV REPO TAG DRONE_TAG CROSS GOPROXY GITHUB_TOKEN GITHUB_REF GITHUB_REF_NAME BUILD_TARGET SKIP_PACKAGE
|
ENV DAPPER_ENV REPO TAG DRONE_TAG CROSS GOPROXY SKIP_COMPRESS GITHUB_REPOSITORY GITHUB_TOKEN
|
||||||
ENV DAPPER_SOURCE /go/src/github.com/cnrancher/kube-explorer
|
ENV DAPPER_SOURCE /go/src/github.com/cnrancher/kube-explorer
|
||||||
ENV DAPPER_OUTPUT ./bin ./dist
|
ENV DAPPER_OUTPUT ./bin ./dist
|
||||||
ENV DAPPER_DOCKER_SOCKET true
|
ENV DAPPER_DOCKER_SOCKET true
|
||||||
|
37
README.md
37
README.md
@ -10,7 +10,7 @@ Please download the binary from the [release page](https://github.com/cnrancher/
|
|||||||
|
|
||||||
To run an HTTP only server:
|
To run an HTTP only server:
|
||||||
|
|
||||||
```bash
|
```
|
||||||
./kube-explorer --kubeconfig=xxxx --http-listen-port=9898 --https-listen-port=0
|
./kube-explorer --kubeconfig=xxxx --http-listen-port=9898 --https-listen-port=0
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -22,47 +22,20 @@ Then, open the browser to visit http://x.x.x.x:9898 .
|
|||||||
|
|
||||||
To debug on an AMD64 Linux host:
|
To debug on an AMD64 Linux host:
|
||||||
|
|
||||||
```bash
|
```
|
||||||
make dev
|
make dev
|
||||||
|
|
||||||
# $basedir=/opt/ui/dist/
|
# $basedir=/opt/ui/dist/
|
||||||
# prepare the file trees like this
|
# prepare the file trees like this
|
||||||
# $basedir/dashboard/
|
# $basedir/dashboard/
|
||||||
# $basedir/api-ui/
|
|
||||||
# $basedir/index.html
|
# $basedir/index.html
|
||||||
|
|
||||||
# good to go!
|
# good to go!
|
||||||
./bin/kube-explorer --debug --ui-path /opt/ui/dist/ --http-listen-port=9898 --https-listen-port=0
|
./kube-explorer --debug --ui-path /opt/ui/dist/ --http-listen-port=9898 --https-listen-port=0
|
||||||
```
|
```
|
||||||
|
|
||||||
To build all cross-platform binaries:
|
To build all cross-platform binaries:
|
||||||
|
|
||||||
```bash
|
|
||||||
CROSS=tag make
|
|
||||||
```
|
```
|
||||||
|
CROSS=1 make
|
||||||
## Supported features
|
```
|
||||||
|
|
||||||
- Specified system default registry for shell image, e.g. `--system-default-registry`
|
|
||||||
- Specified shell image name, e.g. `--pod-image`
|
|
||||||
- Deployed behind proxy
|
|
||||||
- [Behind ingress with dns name](./deploy/kubectl/README.md)
|
|
||||||
- [Behind ingress with dns name and path prefix](./deploy/kubectl/path-prefix/Readme.md)
|
|
||||||
- Base auth via ingress such as [nginx](./deploy/kubectl/nginx-auth/README.md), [traefik-v1](./deploy/kubectl/traefik-v1-auth/README.md) and [traefik-v2](./deploy/kubectl/traefik-v2-auth/README.md)
|
|
||||||
|
|
||||||
## Support Matrix
|
|
||||||
|
|
||||||
Currently, there are several major versions under maintenance, each tailored to different Kubernetes version ranges due to the use of varying steve and client-go versions.
|
|
||||||
|
|
||||||
| Major | Target Rancher Branch | K8s version range |
|
|
||||||
| ----- | --------------------- | ----------------- |
|
|
||||||
| v0.4 | v2.8.x | >= 1.25 <= 1.28 |
|
|
||||||
| v0.5 | v2.9.x | >= 1.27 <= 1.30 |
|
|
||||||
|
|
||||||
Please use the proper kube-explorer version for your k8s setup.
|
|
||||||
|
|
||||||
## Related Projects
|
|
||||||
|
|
||||||
- kube-explorer ui([https://github.com/cnrancher/kube-explorer-ui](https://github.com/cnrancher/kube-explorer-ui))
|
|
||||||
- autok3s([https://github.com/cnrancher/autok3s](https://github.com/cnrancher/autok3s))
|
|
||||||
- api-ui([https://github.com/rancher/api-ui](https://github.com/rancher/api-ui))
|
|
||||||
|
32
go.mod
32
go.mod
@ -2,15 +2,21 @@ module github.com/cnrancher/kube-explorer
|
|||||||
|
|
||||||
go 1.22.0
|
go 1.22.0
|
||||||
|
|
||||||
replace k8s.io/client-go => k8s.io/client-go v0.30.1
|
replace (
|
||||||
|
github.com/rancher/steve => github.com/rancher/steve v0.0.0-20240529152548-9fb3e50aa806
|
||||||
|
k8s.io/api => k8s.io/api v0.28.6
|
||||||
|
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.28.6
|
||||||
|
k8s.io/apimachinery => k8s.io/apimachinery v0.28.6
|
||||||
|
k8s.io/apiserver => k8s.io/apiserver v0.28.6
|
||||||
|
k8s.io/client-go => github.com/rancher/client-go v1.28.6-rancher1
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Microsoft/go-winio v0.6.2
|
|
||||||
github.com/gorilla/mux v1.8.1
|
github.com/gorilla/mux v1.8.1
|
||||||
github.com/rancher/apiserver v0.0.0-20240708202538-39a6f2535146
|
github.com/rancher/apiserver v0.0.0-20240207153744-69b3c2b56f3f
|
||||||
github.com/rancher/dynamiclistener v0.6.0-rc2
|
github.com/rancher/steve v0.0.0-20240529152548-9fb3e50aa806
|
||||||
github.com/rancher/steve v0.0.0-20240911190153-79304d93b49b
|
github.com/rancher/wrangler/v2 v2.1.4
|
||||||
github.com/rancher/wrangler/v3 v3.0.0
|
|
||||||
github.com/sirupsen/logrus v1.9.3
|
github.com/sirupsen/logrus v1.9.3
|
||||||
github.com/urfave/cli v1.22.15
|
github.com/urfave/cli v1.22.15
|
||||||
golang.org/x/text v0.14.0
|
golang.org/x/text v0.14.0
|
||||||
@ -28,7 +34,6 @@ require (
|
|||||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
|
||||||
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
|
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
|
||||||
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
|
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
|
||||||
github.com/felixge/httpsnoop v1.0.3 // indirect
|
github.com/felixge/httpsnoop v1.0.3 // indirect
|
||||||
@ -43,32 +48,30 @@ require (
|
|||||||
github.com/google/gnostic-models v0.6.8 // indirect
|
github.com/google/gnostic-models v0.6.8 // indirect
|
||||||
github.com/google/go-cmp v0.6.0 // indirect
|
github.com/google/go-cmp v0.6.0 // indirect
|
||||||
github.com/google/gofuzz v1.2.0 // indirect
|
github.com/google/gofuzz v1.2.0 // indirect
|
||||||
|
github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd // indirect
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/gorilla/websocket v1.5.1 // indirect
|
github.com/gorilla/websocket v1.5.1 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
|
||||||
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
|
||||||
github.com/imdario/mergo v0.3.12 // indirect
|
github.com/imdario/mergo v0.3.12 // indirect
|
||||||
github.com/josharian/intern v1.0.0 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
|
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
|
||||||
github.com/ncruces/go-strftime v0.1.9 // indirect
|
|
||||||
github.com/pborman/uuid v1.2.1 // indirect
|
github.com/pborman/uuid v1.2.1 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/prometheus/client_golang v1.16.0 // indirect
|
github.com/prometheus/client_golang v1.16.0 // indirect
|
||||||
github.com/prometheus/client_model v0.4.0 // indirect
|
github.com/prometheus/client_model v0.4.0 // indirect
|
||||||
github.com/prometheus/common v0.44.0 // indirect
|
github.com/prometheus/common v0.44.0 // indirect
|
||||||
github.com/prometheus/procfs v0.10.1 // indirect
|
github.com/prometheus/procfs v0.10.1 // indirect
|
||||||
|
github.com/rancher/dynamiclistener v0.4.0-rc2 // indirect
|
||||||
github.com/rancher/kubernetes-provider-detector v0.1.5 // indirect
|
github.com/rancher/kubernetes-provider-detector v0.1.5 // indirect
|
||||||
github.com/rancher/lasso v0.0.0-20240705194423-b2a060d103c1 // indirect
|
github.com/rancher/lasso v0.0.0-20240705194423-b2a060d103c1 // indirect
|
||||||
github.com/rancher/norman v0.0.0-20240708202514-a0127673d1b9 // indirect
|
github.com/rancher/norman v0.0.0-20240708202514-a0127673d1b9 // indirect
|
||||||
github.com/rancher/remotedialer v0.3.2 // indirect
|
github.com/rancher/remotedialer v0.3.2 // indirect
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
github.com/urfave/cli/v2 v2.27.1 // indirect
|
github.com/urfave/cli/v2 v2.27.1 // indirect
|
||||||
@ -103,13 +106,6 @@ require (
|
|||||||
k8s.io/kube-aggregator v0.30.1 // indirect
|
k8s.io/kube-aggregator v0.30.1 // indirect
|
||||||
k8s.io/kube-openapi v0.0.0-20240411171206-dc4e619f62f3 // indirect
|
k8s.io/kube-openapi v0.0.0-20240411171206-dc4e619f62f3 // indirect
|
||||||
k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
|
k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
|
||||||
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect
|
|
||||||
modernc.org/libc v1.49.3 // indirect
|
|
||||||
modernc.org/mathutil v1.6.0 // indirect
|
|
||||||
modernc.org/memory v1.8.0 // indirect
|
|
||||||
modernc.org/sqlite v1.29.10 // indirect
|
|
||||||
modernc.org/strutil v1.2.0 // indirect
|
|
||||||
modernc.org/token v1.1.0 // indirect
|
|
||||||
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 // indirect
|
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.29.0 // indirect
|
||||||
sigs.k8s.io/cli-utils v0.35.0 // indirect
|
sigs.k8s.io/cli-utils v0.35.0 // indirect
|
||||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
||||||
|
@ -8,7 +8,6 @@ var InsecureSkipTLSVerify bool
|
|||||||
var SystemDefaultRegistry string
|
var SystemDefaultRegistry string
|
||||||
var APIUIVersion = "1.1.11"
|
var APIUIVersion = "1.1.11"
|
||||||
var ShellPodImage string
|
var ShellPodImage string
|
||||||
var BindAddress string
|
|
||||||
|
|
||||||
func Flags() []cli.Flag {
|
func Flags() []cli.Flag {
|
||||||
return []cli.Flag{
|
return []cli.Flag{
|
||||||
@ -31,10 +30,5 @@ func Flags() []cli.Flag {
|
|||||||
Destination: &APIUIVersion,
|
Destination: &APIUIVersion,
|
||||||
Value: APIUIVersion,
|
Value: APIUIVersion,
|
||||||
},
|
},
|
||||||
cli.StringFlag{
|
|
||||||
Name: "bind-address",
|
|
||||||
Destination: &BindAddress,
|
|
||||||
Usage: `Bind address with url format. The supported schemes are unix, tcp and namedpipe, e.g. unix:///path/to/kube-explorer.sock or namedpipe:/\.\pipe\kube-explorer`,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ import (
|
|||||||
"github.com/cnrancher/kube-explorer/internal/config"
|
"github.com/cnrancher/kube-explorer/internal/config"
|
||||||
"github.com/rancher/steve/pkg/podimpersonation"
|
"github.com/rancher/steve/pkg/podimpersonation"
|
||||||
"github.com/rancher/steve/pkg/stores/proxy"
|
"github.com/rancher/steve/pkg/stores/proxy"
|
||||||
"github.com/rancher/wrangler/v3/pkg/schemas/validation"
|
"github.com/rancher/wrangler/v2/pkg/schemas/validation"
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apiserver/pkg/authentication/user"
|
"k8s.io/apiserver/pkg/authentication/user"
|
||||||
|
@ -12,8 +12,8 @@ import (
|
|||||||
"github.com/rancher/steve/pkg/server"
|
"github.com/rancher/steve/pkg/server"
|
||||||
"github.com/rancher/steve/pkg/server/cli"
|
"github.com/rancher/steve/pkg/server/cli"
|
||||||
"github.com/rancher/steve/pkg/server/router"
|
"github.com/rancher/steve/pkg/server/router"
|
||||||
"github.com/rancher/wrangler/v3/pkg/kubeconfig"
|
"github.com/rancher/wrangler/v2/pkg/kubeconfig"
|
||||||
"github.com/rancher/wrangler/v3/pkg/ratelimit"
|
"github.com/rancher/wrangler/v2/pkg/ratelimit"
|
||||||
|
|
||||||
"github.com/cnrancher/kube-explorer/internal/config"
|
"github.com/cnrancher/kube-explorer/internal/config"
|
||||||
"github.com/cnrancher/kube-explorer/internal/resources/cluster"
|
"github.com/cnrancher/kube-explorer/internal/resources/cluster"
|
||||||
@ -21,7 +21,7 @@ import (
|
|||||||
"github.com/cnrancher/kube-explorer/internal/version"
|
"github.com/cnrancher/kube-explorer/internal/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ToServer(ctx context.Context, c *cli.Config, sqlCache bool) (*server.Server, error) {
|
func ToServer(ctx context.Context, c *cli.Config) (*server.Server, error) {
|
||||||
var (
|
var (
|
||||||
auth steveauth.Middleware
|
auth steveauth.Middleware
|
||||||
)
|
)
|
||||||
@ -59,7 +59,6 @@ func ToServer(ctx context.Context, c *cli.Config, sqlCache bool) (*server.Server
|
|||||||
AuthMiddleware: auth,
|
AuthMiddleware: auth,
|
||||||
Controllers: controllers,
|
Controllers: controllers,
|
||||||
Next: ui,
|
Next: ui,
|
||||||
SQLCache: sqlCache,
|
|
||||||
// router needs to hack here
|
// router needs to hack here
|
||||||
Router: func(h router.Handlers) http.Handler {
|
Router: func(h router.Handlers) http.Handler {
|
||||||
return handleProxyHeader(
|
return handleProxyHeader(
|
||||||
|
@ -1,52 +0,0 @@
|
|||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"log"
|
|
||||||
"net"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/cnrancher/kube-explorer/internal/config"
|
|
||||||
dynamicserver "github.com/rancher/dynamiclistener/server"
|
|
||||||
"github.com/rancher/steve/pkg/server"
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Serve(ctx context.Context, server *server.Server) error {
|
|
||||||
listener, ipOrPath, err := ensureListener(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if listener != nil {
|
|
||||||
defer listener.Close()
|
|
||||||
return serveSocket(ctx, ipOrPath, listener, server)
|
|
||||||
}
|
|
||||||
return server.ListenAndServe(ctx, config.Steve.HTTPSListenPort, config.Steve.HTTPListenPort, &dynamicserver.ListenOpts{
|
|
||||||
BindHost: ipOrPath,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func serveSocket(ctx context.Context, socketPath string, listener net.Listener, handler http.Handler) error {
|
|
||||||
logger := logrus.StandardLogger()
|
|
||||||
errorLog := log.New(logger.WriterLevel(logrus.DebugLevel), "", log.LstdFlags)
|
|
||||||
socketServer := &http.Server{
|
|
||||||
Handler: handler,
|
|
||||||
ErrorLog: errorLog,
|
|
||||||
BaseContext: func(_ net.Listener) context.Context {
|
|
||||||
return ctx
|
|
||||||
},
|
|
||||||
}
|
|
||||||
go func() {
|
|
||||||
logrus.Infof("Listening on %s", socketPath)
|
|
||||||
err := socketServer.Serve(listener)
|
|
||||||
if err != http.ErrServerClosed && err != nil {
|
|
||||||
logrus.Fatalf("https server failed: %v", err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
go func() {
|
|
||||||
<-ctx.Done()
|
|
||||||
_ = socketServer.Shutdown(context.Background())
|
|
||||||
}()
|
|
||||||
<-ctx.Done()
|
|
||||||
return ctx.Err()
|
|
||||||
}
|
|
@ -1,99 +0,0 @@
|
|||||||
//go:build unix
|
|
||||||
// +build unix
|
|
||||||
|
|
||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"net"
|
|
||||||
"net/url"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
|
||||||
"syscall"
|
|
||||||
|
|
||||||
"github.com/cnrancher/kube-explorer/internal/config"
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
|
||||||
|
|
||||||
var _ net.Listener = &closerListener{}
|
|
||||||
|
|
||||||
type closerListener struct {
|
|
||||||
listener net.Listener
|
|
||||||
lockFile *os.File
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *closerListener) Accept() (net.Conn, error) {
|
|
||||||
return l.listener.Accept()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *closerListener) Close() error {
|
|
||||||
return errors.Join(
|
|
||||||
l.listener.Close(),
|
|
||||||
l.lockFile.Close(),
|
|
||||||
os.RemoveAll(l.lockFile.Name()),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *closerListener) Addr() net.Addr {
|
|
||||||
return l.listener.Addr()
|
|
||||||
}
|
|
||||||
|
|
||||||
func ensureListener(ctx context.Context) (net.Listener, string, error) {
|
|
||||||
if config.BindAddress == "" {
|
|
||||||
return nil, "", nil
|
|
||||||
}
|
|
||||||
u, err := url.Parse(config.BindAddress)
|
|
||||||
if err != nil {
|
|
||||||
return nil, "", err
|
|
||||||
}
|
|
||||||
switch u.Scheme {
|
|
||||||
case "":
|
|
||||||
return nil, config.BindAddress, nil
|
|
||||||
case "tcp":
|
|
||||||
return nil, u.Host, nil
|
|
||||||
case "unix":
|
|
||||||
listener, err := createCloserListener(ctx, u.Path)
|
|
||||||
if err != nil {
|
|
||||||
return nil, "", err
|
|
||||||
}
|
|
||||||
return listener, u.Path, err
|
|
||||||
default:
|
|
||||||
return nil, "", fmt.Errorf("Unsupported scheme %s, only tcp and unix are supported in UNIX OS", u.Scheme)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func createCloserListener(ctx context.Context, socketPath string) (net.Listener, error) {
|
|
||||||
lockFilePath := getLockFileName(socketPath)
|
|
||||||
lockFile, err := os.OpenFile(lockFilePath, os.O_RDONLY|os.O_CREATE, 0600)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
lockErr := syscall.Flock(int(lockFile.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
|
|
||||||
if lockErr != nil {
|
|
||||||
return nil, fmt.Errorf("Socket file %s is in use, exiting", socketPath)
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := os.Stat(socketPath); err == nil {
|
|
||||||
logrus.Infof("Removing stale socket file %s", socketPath)
|
|
||||||
_ = os.Remove(socketPath)
|
|
||||||
}
|
|
||||||
|
|
||||||
var lc net.ListenConfig
|
|
||||||
listener, err := lc.Listen(ctx, "unix", socketPath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &closerListener{
|
|
||||||
listener: listener,
|
|
||||||
lockFile: lockFile,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func getLockFileName(socketPath string) string {
|
|
||||||
return strings.TrimSuffix(socketPath, filepath.Ext(socketPath)) + ".lock"
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
//go:build windows
|
|
||||||
// +build windows
|
|
||||||
|
|
||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"net"
|
|
||||||
"net/url"
|
|
||||||
|
|
||||||
"github.com/Microsoft/go-winio"
|
|
||||||
"github.com/cnrancher/kube-explorer/internal/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
func ensureListener(_ context.Context) (net.Listener, string, error) {
|
|
||||||
if config.BindAddress == "" {
|
|
||||||
return nil, "", nil
|
|
||||||
}
|
|
||||||
u, err := url.Parse(config.BindAddress)
|
|
||||||
if err != nil {
|
|
||||||
return nil, "", err
|
|
||||||
}
|
|
||||||
switch u.Scheme {
|
|
||||||
case "":
|
|
||||||
return nil, config.BindAddress, nil
|
|
||||||
case "tcp":
|
|
||||||
return nil, u.Host, nil
|
|
||||||
case "namedpipe":
|
|
||||||
listener, err := winio.ListenPipe(u.Path, nil)
|
|
||||||
return listener, u.Path, err
|
|
||||||
default:
|
|
||||||
return nil, "", fmt.Errorf("Unsupported scheme %s, only tcp and namedpipe are supported in windows", u.Scheme)
|
|
||||||
}
|
|
||||||
}
|
|
8
main.go
8
main.go
@ -3,10 +3,10 @@ package main
|
|||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/cnrancher/kube-explorer/internal/version"
|
|
||||||
"github.com/rancher/steve/pkg/debug"
|
"github.com/rancher/steve/pkg/debug"
|
||||||
stevecli "github.com/rancher/steve/pkg/server/cli"
|
stevecli "github.com/rancher/steve/pkg/server/cli"
|
||||||
"github.com/rancher/wrangler/v3/pkg/signals"
|
"github.com/rancher/steve/pkg/version"
|
||||||
|
"github.com/rancher/wrangler/v2/pkg/signals"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
|
|
||||||
@ -34,11 +34,11 @@ func main() {
|
|||||||
func run(_ *cli.Context) error {
|
func run(_ *cli.Context) error {
|
||||||
ctx := signals.SetupSignalContext()
|
ctx := signals.SetupSignalContext()
|
||||||
keconfig.Debug.MustSetupDebug()
|
keconfig.Debug.MustSetupDebug()
|
||||||
s, err := server.ToServer(ctx, &keconfig.Steve, false)
|
s, err := server.ToServer(ctx, &keconfig.Steve)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return server.Serve(ctx, s)
|
return s.ListenAndServe(ctx, keconfig.Steve.HTTPSListenPort, keconfig.Steve.HTTPListenPort, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func joinFlags(flags ...[]cli.Flag) []cli.Flag {
|
func joinFlags(flags ...[]cli.Flag) []cli.Flag {
|
||||||
|
@ -4,4 +4,5 @@ ARG TARGETOS
|
|||||||
ENV ARCH=${TARGETARCH:-"amd64"} OS=${TARGETOS:-"linux"}
|
ENV ARCH=${TARGETARCH:-"amd64"} OS=${TARGETOS:-"linux"}
|
||||||
RUN zypper install -y catatonit
|
RUN zypper install -y catatonit
|
||||||
COPY kube-explorer-${OS}-${ARCH} /usr/bin/kube-explorer
|
COPY kube-explorer-${OS}-${ARCH} /usr/bin/kube-explorer
|
||||||
ENTRYPOINT [ "/usr/bin/catatonit", "--", "kube-explorer" ]
|
ENTRYPOINT [ "/usr/bin/catatonit", "--" ]
|
||||||
|
CMD [ "kube-explorer" ]
|
||||||
|
@ -6,33 +6,77 @@ cd "$(dirname $0)/.."
|
|||||||
|
|
||||||
rm -rf ./bin/* ./dist/*
|
rm -rf ./bin/* ./dist/*
|
||||||
|
|
||||||
BUILD_TARGET="${BUILD_TARGET:-dev}"
|
OS_ARCH_ARG_LINUX="amd64 arm arm64"
|
||||||
CROSS=${CROSS:-}
|
OS_ARCH_ARG_DARWIN="amd64 arm64"
|
||||||
|
OS_ARCH_ARG_WINDOWS="amd64"
|
||||||
|
|
||||||
if [[ ${GITHUB_REF} == refs/tags/* ]]; then
|
LD_INJECT_VALUES="-X github.com/cnrancher/kube-explorer/internal/version.Version=$VERSION
|
||||||
CROSS=tag
|
-X github.com/cnrancher/kube-explorer/internal/version.GitCommit=$COMMIT
|
||||||
elif [ -n "${GITHUB_REF}" ]; then
|
-X github.com/cnrancher/kube-explorer/internal/config.APIUIVersion=$CATTLE_API_UI_VERSION"
|
||||||
CROSS=push
|
|
||||||
fi
|
[ "$(uname)" != "Darwin" ] && LINKFLAGS="-extldflags -static -s"
|
||||||
|
|
||||||
case "$CROSS" in
|
case "$CROSS" in
|
||||||
"tag")
|
|
||||||
BUILD_TARGET="prod"
|
|
||||||
;;
|
|
||||||
"push")
|
"push")
|
||||||
;;
|
for ARCH in ${OS_ARCH_ARG_LINUX}; do
|
||||||
|
OUTPUT_BIN="bin/kube-explorer-linux-$ARCH"
|
||||||
|
echo "Building binary for linux/$ARCH..."
|
||||||
|
GOARCH=$ARCH GOOS=linux CGO_ENABLED=0 go build -tags embed \
|
||||||
|
-ldflags \
|
||||||
|
"$LD_INJECT_VALUES $LINKFLAGS" \
|
||||||
|
-o ${OUTPUT_BIN}
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
"tag")
|
||||||
|
for ARCH in ${OS_ARCH_ARG_LINUX}; do
|
||||||
|
OUTPUT_BIN="bin/kube-explorer-linux-$ARCH"
|
||||||
|
echo "Building binary for linux/$ARCH..."
|
||||||
|
GOARCH=$ARCH GOOS=linux CGO_ENABLED=0 go build -tags embed \
|
||||||
|
-ldflags \
|
||||||
|
"$LD_INJECT_VALUES $LINKFLAGS" \
|
||||||
|
-o ${OUTPUT_BIN}
|
||||||
|
done
|
||||||
|
|
||||||
|
for ARCH in ${OS_ARCH_ARG_DARWIN}; do
|
||||||
|
OUTPUT_BIN="bin/kube-explorer-darwin-$ARCH"
|
||||||
|
echo "Building binary for darwin/$ARCH..."
|
||||||
|
GOARCH=$ARCH GOOS=darwin CGO_ENABLED=0 go build -tags embed \
|
||||||
|
-ldflags \
|
||||||
|
"$LD_INJECT_VALUES" \
|
||||||
|
-o ${OUTPUT_BIN}
|
||||||
|
done
|
||||||
|
|
||||||
|
for ARCH in ${OS_ARCH_ARG_WINDOWS}; do
|
||||||
|
OUTPUT_BIN="bin/kube-explorer-windows-$ARCH.exe"
|
||||||
|
echo "Building binary for windows/$ARCH..."
|
||||||
|
GOARCH=$ARCH GOOS=windows CGO_ENABLED=0 go build -tags embed \
|
||||||
|
-ldflags \
|
||||||
|
"$LD_INJECT_VALUES" \
|
||||||
|
-o ${OUTPUT_BIN}
|
||||||
|
done
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
BUILD_ARG="${BUILD_ARG} --single-target"
|
# only build one for current platform
|
||||||
;;
|
CGO_ENABLED=0 go build -tags embed \
|
||||||
|
-ldflags \
|
||||||
|
"$LD_INJECT_VALUES $LINKFLAGS" \
|
||||||
|
-o "bin/kube-explorer-$(uname | tr '[:upper:]' '[:lower:]')-${ARCH}"
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
BUILD_ARG="${BUILD_ARG:-} --skip validate --id ${BUILD_TARGET}"
|
|
||||||
|
|
||||||
mkdir -p "./bin"
|
mkdir -p "./bin"
|
||||||
|
|
||||||
# upx is handled by goreleaser
|
|
||||||
VERSION=${VERSION} COMMIT=${COMMIT} goreleaser build $BUILD_ARG
|
|
||||||
|
|
||||||
mkdir -p "./dist"
|
mkdir -p "./dist"
|
||||||
|
|
||||||
cp -r bin/kube-explorer-* dist/
|
for f in ./bin/*; do
|
||||||
|
filename=$(basename "$f")
|
||||||
|
if [[ $filename != *darwin* && -z "$SKIP_COMPRESS" ]]; then
|
||||||
|
if upx -o "./dist/$filename" "$f"; then
|
||||||
|
echo "UPX done for $filename!"
|
||||||
|
else
|
||||||
|
echo "UPX failed for $filename, copying original file."
|
||||||
|
cp "$f" "./dist/$filename"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
cp "$f" "./dist/$filename"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
@ -6,6 +6,4 @@ cd $(dirname $0)
|
|||||||
./download
|
./download
|
||||||
./validate
|
./validate
|
||||||
./build
|
./build
|
||||||
if [ -z "${SKIP_PACKAGE}" ]; then
|
./package
|
||||||
./package
|
|
||||||
fi
|
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
cd "$(dirname $0)/.."
|
cd $(dirname $0)
|
||||||
./scripts/download
|
./download
|
||||||
|
|
||||||
source $(dirname $0)/version
|
|
||||||
|
|
||||||
[ "$(uname)" != "Darwin" ] && LINKFLAGS="-extldflags -static -s"
|
[ "$(uname)" != "Darwin" ] && LINKFLAGS="-extldflags -static -s"
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ rm -rf internal/ui/ui/*
|
|||||||
|
|
||||||
mkdir -p internal/ui/ui/dashboard
|
mkdir -p internal/ui/ui/dashboard
|
||||||
cd internal/ui/ui/dashboard || exit 1;
|
cd internal/ui/ui/dashboard || exit 1;
|
||||||
curl -sL https://pandaria-dashboard-ui.s3.ap-southeast-2.amazonaws.com/release-2.9-cn/kube-explorer-ui/${CATTLE_DASHBOARD_UI_VERSION}.tar.gz | $TAR_CMD xvzf - --strip-components=2
|
curl -sL https://pandaria-dashboard-ui.s3.ap-southeast-2.amazonaws.com/release-2.8-cn/kube-explorer-ui/${CATTLE_DASHBOARD_UI_VERSION}.tar.gz | $TAR_CMD xvzf - --strip-components=2
|
||||||
cp index.html ../index.html
|
cp index.html ../index.html
|
||||||
|
|
||||||
mkdir ../api-ui
|
mkdir ../api-ui
|
||||||
|
9
scripts/github_ci
Executable file
9
scripts/github_ci
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cd $(dirname $0)
|
||||||
|
|
||||||
|
./download
|
||||||
|
./validate
|
||||||
|
./build
|
||||||
|
|
@ -1,15 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
if [[ ${GITHUB_REF} == refs/tags/* ]]; then
|
|
||||||
GIT_TAG=${GIT_TAG:-${GITHUB_REF_NAME}}
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$(git status --porcelain --untracked-files=no)" ]; then
|
if [ -n "$(git status --porcelain --untracked-files=no)" ]; then
|
||||||
DIRTY="-dirty"
|
DIRTY="-dirty"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
COMMIT=$(git rev-parse --short HEAD)
|
COMMIT=$(git rev-parse --short HEAD)
|
||||||
GIT_TAG=${GIT_TAG:-$(git tag -l --contains HEAD | head -n 1)}
|
GIT_TAG=${DRONE_TAG:-$(git tag -l --contains HEAD | head -n 1)}
|
||||||
|
|
||||||
if [[ -z "$DIRTY" && -n "$GIT_TAG" ]]; then
|
if [[ -z "$DIRTY" && -n "$GIT_TAG" ]]; then
|
||||||
VERSION=$GIT_TAG
|
VERSION=$GIT_TAG
|
||||||
|
Loading…
Reference in New Issue
Block a user