diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 5efa7b0..9fbbcfa 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -16,6 +16,4 @@ jobs: - name: Commitsar check uses: aevea/commitsar@v0.20.2 - name: Build to test - env: - SKIP_COMPRESS: "true" run: make ci diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml index ec3b5f4..97a5a46 100644 --- a/.github/workflows/push.yaml +++ b/.github/workflows/push.yaml @@ -5,7 +5,7 @@ on: branches: - main 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 jobs: build-and-deploy: @@ -15,6 +15,14 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + - name: CI + env: + CROSS: push + 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 uses: docker/login-action@v3 with: @@ -22,60 +30,59 @@ jobs: username: ${{ secrets.ACR_USERNAME }} password: ${{ secrets.ACR_TOKEN }} if: ${{ vars.ALIYUN == 'true' }} + - name: Aliyun image docker meta + if: ${{ vars.ALIYUN == 'true' }} + id: aliyun-meta + uses: docker/metadata-action@v5 + with: + images: ${{ vars.REPO || 'cnrancher' }}/${{ vars.IMAGE || 'kube-explorer' }} + tags: | + type=ref,event=tag + type=ref,event=branch,suffix=-head + - name: Build to Aliyun + uses: docker/build-push-action@v6 + with: + labels: ${{ steps.aliyun-meta.outputs.labels }} + tags: "${{ steps.aliyun-meta.outputs.tags }}" + context: package + push: true + if: ${{ vars.ALIYUN == 'true' }} + + # docker hub multi-arch image - name: Login to Dockerhub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: CI - if: startsWith(github.ref, 'refs/heads/') - env: - CROSS: push - run: make github_ci - - - name: CI - if: startsWith(github.ref, 'refs/tags/') - 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 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ vars.REPO || 'cnrancher' }}/${{ vars.IMAGE || 'kube-explorer' }} + tags: | + type=ref,event=tag + type=ref,event=branch,suffix=-head + - name: Set up QEMU uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build to Dockerhub uses: docker/build-push-action@v6 with: platforms: linux/amd64,linux/arm64/v8 - tags: "${{ steps.image-name.outputs.image_name }}" - context: package - push: true - - name: Build to Aliyun - uses: docker/build-push-action@v6 - with: - tags: registry.cn-shenzhen.aliyuncs.com/${{ steps.image-name.outputs.image_name }} + labels: ${{ steps.meta.outputs.labels }} + tags: "${{ steps.meta.outputs.tags }}" context: package push: true - if: ${{ vars.ALIYUN == 'true' }} + + - name: Make release note + if: startsWith(github.ref, 'refs/tags/') + run: | + make release-note - name: Release uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') with: files: dist/kube-explorer-* body_path: dist/release-note - draft: true \ No newline at end of file + draft: true diff --git a/.gitignore b/.gitignore index 7a29af8..1e90236 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,7 @@ /.vscode /vendor /internal/ui/ui/ +**/Dockerfile.dapper* +!**/Dockerfile.dapper + +dist/ diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..9a18dcc --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,74 @@ +# 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" + 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:" diff --git a/Dockerfile.dapper b/Dockerfile.dapper index b25fa91..ef92685 100644 --- a/Dockerfile.dapper +++ b/Dockerfile.dapper @@ -1,3 +1,4 @@ +FROM goreleaser/goreleaser:v2.3.2 as goreleaser FROM aevea/release-notary:0.9.2 as tools FROM registry.suse.com/bci/golang:1.22 @@ -8,8 +9,7 @@ ENV HOST_ARCH=${DAPPER_HOST_ARCH} ARCH=${DAPPER_HOST_ARCH} ENV https_proxy=${PROXY} \ http_proxy=${PROXY} -RUN zypper -n install ca-certificates git-core wget curl unzip tar vim less file xz -RUN zypper install -y -f docker +RUN zypper -n install ca-certificates git-core wget curl unzip tar vim less file xz cosign docker 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 && \ @@ -18,11 +18,12 @@ RUN curl -sL https://github.com/upx/upx/releases/download/v${UPX_VERSION}/upx-${ RUN if [ "${ARCH}" == "amd64" ]; then \ curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.54.2; \ fi +COPY --from=goreleaser /usr/bin/goreleaser /usr/bin/goreleaser COPY --from=tools /app/release-notary /usr/local/bin/ ENV CATTLE_DASHBOARD_UI_VERSION="v2.8.5-kube-explorer-ui-rc1" ENV CATTLE_API_UI_VERSION="1.1.11" -ENV DAPPER_ENV REPO TAG DRONE_TAG CROSS GOPROXY SKIP_COMPRESS GITHUB_REPOSITORY GITHUB_TOKEN +ENV DAPPER_ENV REPO TAG DRONE_TAG CROSS GOPROXY GITHUB_TOKEN GITHUB_REF GITHUB_REF_NAME BUILD_TARGET SKIP_PACKAGE ENV DAPPER_SOURCE /go/src/github.com/cnrancher/kube-explorer ENV DAPPER_OUTPUT ./bin ./dist ENV DAPPER_DOCKER_SOCKET true diff --git a/scripts/build b/scripts/build index 4999195..fd6d710 100755 --- a/scripts/build +++ b/scripts/build @@ -6,77 +6,19 @@ cd "$(dirname $0)/.." rm -rf ./bin/* ./dist/* -OS_ARCH_ARG_LINUX="amd64 arm arm64" -OS_ARCH_ARG_DARWIN="amd64 arm64" -OS_ARCH_ARG_WINDOWS="amd64" +BUILD_TARGET="${BUILD_TARGET:-dev}" -LD_INJECT_VALUES="-X github.com/cnrancher/kube-explorer/internal/version.Version=$VERSION - -X github.com/cnrancher/kube-explorer/internal/version.GitCommit=$COMMIT - -X github.com/cnrancher/kube-explorer/internal/config.APIUIVersion=$CATTLE_API_UI_VERSION" +if [ -n "$CROSS" ]; then + BUILD_TARGET="prod" +fi -[ "$(uname)" != "Darwin" ] && LINKFLAGS="-extldflags -static -s" +BUILD_ARG="${BUILD_ARG:-} --skip validate --id ${BUILD_TARGET}" -case "$CROSS" in - "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 +mkdir -p "./bin" - 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 - ;; - *) - # 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 +# upx is handled by goreleaser +VERSION=${VERSION} COMMIT=${COMMIT} goreleaser build $BUILD_ARG -mkdir -p "./bin" mkdir -p "./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 +cp -r bin/kube-explorer-* dist/ diff --git a/scripts/ci b/scripts/ci index e1ea1b5..a8005f5 100755 --- a/scripts/ci +++ b/scripts/ci @@ -6,4 +6,6 @@ cd $(dirname $0) ./download ./validate ./build -./package +if [ -z "${SKIP_PACKAGE}" ]; then + ./package +fi \ No newline at end of file diff --git a/scripts/github_ci b/scripts/github_ci deleted file mode 100755 index ab93aa5..0000000 --- a/scripts/github_ci +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -set -e - -cd $(dirname $0) - -./download -./validate -./build - diff --git a/scripts/version b/scripts/version index 9e7a5b8..970c09d 100755 --- a/scripts/version +++ b/scripts/version @@ -1,11 +1,15 @@ #!/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 DIRTY="-dirty" fi COMMIT=$(git rev-parse --short HEAD) -GIT_TAG=${DRONE_TAG:-$(git tag -l --contains HEAD | head -n 1)} +GIT_TAG=${GIT_TAG:-$(git tag -l --contains HEAD | head -n 1)} if [[ -z "$DIRTY" && -n "$GIT_TAG" ]]; then VERSION=$GIT_TAG