mirror of
https://github.com/rancher/rke.git
synced 2025-09-07 01:40:11 +00:00
Move from drone to GHA for rke 1.4 (#3616)
This commit is contained in:
192
.drone.yml
192
.drone.yml
@@ -1,192 +0,0 @@
|
|||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
name: default
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: linux
|
|
||||||
arch: amd64
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: ci
|
|
||||||
pull: default
|
|
||||||
image: rancher/dapper:1.11.2
|
|
||||||
commands:
|
|
||||||
- dapper ci
|
|
||||||
- ls -lR build/bin
|
|
||||||
environment:
|
|
||||||
CROSS: 1
|
|
||||||
privileged: true
|
|
||||||
volumes:
|
|
||||||
- name: socket
|
|
||||||
path: /var/run/docker.sock
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- pull_request
|
|
||||||
- tag
|
|
||||||
|
|
||||||
- name: stage-binaries
|
|
||||||
pull: default
|
|
||||||
image: rancher/dapper:1.11.2
|
|
||||||
commands:
|
|
||||||
- "cp -r ./bin/* ./package/"
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- tag
|
|
||||||
ref:
|
|
||||||
include:
|
|
||||||
- "refs/tags/*"
|
|
||||||
|
|
||||||
- name: github_binary_prerelease
|
|
||||||
pull: default
|
|
||||||
image: plugins/github-release
|
|
||||||
settings:
|
|
||||||
api_key:
|
|
||||||
from_secret: github_token
|
|
||||||
checksum:
|
|
||||||
- sha256
|
|
||||||
files:
|
|
||||||
- "build/bin/rke*"
|
|
||||||
prerelease: true
|
|
||||||
title: "Pre-release ${DRONE_TAG}"
|
|
||||||
note: ./build/bin/rke-k8sversions.txt
|
|
||||||
overwrite: true
|
|
||||||
when:
|
|
||||||
instance:
|
|
||||||
include:
|
|
||||||
- drone-publish.rancher.io
|
|
||||||
event:
|
|
||||||
- tag
|
|
||||||
ref:
|
|
||||||
include:
|
|
||||||
- "refs/tags/*rc*"
|
|
||||||
- "refs/tags/*alpha*"
|
|
||||||
|
|
||||||
- name: github_binary_release
|
|
||||||
pull: default
|
|
||||||
image: plugins/github-release
|
|
||||||
settings:
|
|
||||||
checksum:
|
|
||||||
- sha256
|
|
||||||
files:
|
|
||||||
- "build/bin/rke*"
|
|
||||||
api_key:
|
|
||||||
from_secret: github_token
|
|
||||||
title: "Release ${DRONE_TAG}"
|
|
||||||
when:
|
|
||||||
instance:
|
|
||||||
include:
|
|
||||||
- drone-publish.rancher.io
|
|
||||||
event:
|
|
||||||
- tag
|
|
||||||
ref:
|
|
||||||
exclude:
|
|
||||||
- "refs/tags/*rc*"
|
|
||||||
- "refs/tags/*alpha*"
|
|
||||||
|
|
||||||
- name: dispatch
|
|
||||||
image: curlimages/curl:7.81.0
|
|
||||||
user: root
|
|
||||||
environment:
|
|
||||||
PAT_USERNAME:
|
|
||||||
from_secret: pat_username
|
|
||||||
PAT_TOKEN:
|
|
||||||
from_secret: github_token
|
|
||||||
commands:
|
|
||||||
- apk -U --no-cache add bash
|
|
||||||
- scripts/dispatch
|
|
||||||
when:
|
|
||||||
instance:
|
|
||||||
include:
|
|
||||||
- drone-publish.rancher.io
|
|
||||||
event:
|
|
||||||
- tag
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
- name: socket
|
|
||||||
host:
|
|
||||||
path: /var/run/docker.sock
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
name: test-cni
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: linux
|
|
||||||
arch: amd64
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: build
|
|
||||||
pull: default
|
|
||||||
image: rancher/dapper:1.11.2
|
|
||||||
commands:
|
|
||||||
- dapper build
|
|
||||||
privileged: true
|
|
||||||
volumes:
|
|
||||||
- name: socket
|
|
||||||
path: /var/run/docker.sock
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- pull_request
|
|
||||||
- tag
|
|
||||||
|
|
||||||
- name: integration-flannel
|
|
||||||
pull: default
|
|
||||||
image: rancher/dapper:1.11.2
|
|
||||||
commands:
|
|
||||||
- dapper integration flannel
|
|
||||||
privileged: true
|
|
||||||
volumes:
|
|
||||||
- name: socket
|
|
||||||
path: /var/run/docker.sock
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- pull_request
|
|
||||||
- tag
|
|
||||||
|
|
||||||
- name: integration-calico
|
|
||||||
pull: default
|
|
||||||
image: rancher/dapper:1.11.2
|
|
||||||
commands:
|
|
||||||
- dapper integration calico
|
|
||||||
privileged: true
|
|
||||||
volumes:
|
|
||||||
- name: socket
|
|
||||||
path: /var/run/docker.sock
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- pull_request
|
|
||||||
- tag
|
|
||||||
|
|
||||||
- name: integration-weave
|
|
||||||
pull: default
|
|
||||||
image: rancher/dapper:1.11.2
|
|
||||||
commands:
|
|
||||||
- dapper integration weave
|
|
||||||
privileged: true
|
|
||||||
volumes:
|
|
||||||
- name: socket
|
|
||||||
path: /var/run/docker.sock
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- pull_request
|
|
||||||
- tag
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
- name: socket
|
|
||||||
host:
|
|
||||||
path: /var/run/docker.sock
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
name: fossa
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: fossa
|
|
||||||
image: rancher/drone-fossa:latest
|
|
||||||
failure: ignore
|
|
||||||
settings:
|
|
||||||
api_key:
|
|
||||||
from_secret: FOSSA_API_KEY
|
|
||||||
when:
|
|
||||||
instance:
|
|
||||||
- drone-publish.rancher.io
|
|
29
.github/workflows/fossa.yaml
vendored
Normal file
29
.github/workflows/fossa.yaml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
name: Fossa scan
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
fossa:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
timeout-minutes: 20
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Read FOSSA token
|
||||||
|
uses: rancher-eio/read-vault-secrets@main
|
||||||
|
with:
|
||||||
|
secrets: |
|
||||||
|
secret/data/github/org/rancher/fossa/push token | FOSSA_API_KEY_PUSH_ONLY
|
||||||
|
- name: FOSSA scan
|
||||||
|
uses: fossas/fossa-action@main
|
||||||
|
with:
|
||||||
|
api-key: ${{ env.FOSSA_API_KEY_PUSH_ONLY }}
|
||||||
|
run-tests: false
|
27
.github/workflows/test-cni.yaml
vendored
Normal file
27
.github/workflows/test-cni.yaml
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
name: Test CNI
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
integration-cni-tests:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
runs-on: runs-on,runner=4cpu-linux-x64,run-id=${{ github.run_id }}
|
||||||
|
timeout-minutes: 60
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
cni: [flannel, calico, weave]
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version-file: 'go.mod'
|
||||||
|
- name: Run ${{ matrix.cni }} check
|
||||||
|
run: |
|
||||||
|
./scripts/build
|
||||||
|
./scripts/integration ${{ matrix.cni }}
|
149
.github/workflows/workflow.yaml
vendored
Normal file
149
.github/workflows/workflow.yaml
vendored
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
name: CI workflow
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'release/v*'
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
- 'CODEOWNERS'
|
||||||
|
- 'LICENSE'
|
||||||
|
- 'docs/**'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- 'release/v*'
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
- 'CODEOWNERS'
|
||||||
|
- 'LICENSE'
|
||||||
|
- 'docs/**'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ci:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 30
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version-file: 'go.mod'
|
||||||
|
- name: Run golangci-lint
|
||||||
|
uses: golangci/golangci-lint-action@v6
|
||||||
|
with:
|
||||||
|
version: v1.58
|
||||||
|
- name: Run CI
|
||||||
|
run: |
|
||||||
|
./scripts/ci
|
||||||
|
ls -lR build/bin
|
||||||
|
env:
|
||||||
|
CROSS: 1
|
||||||
|
- name: Upload rke bin artifacts
|
||||||
|
if: github.event_name == 'push' && github.ref_type == 'tag'
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: rke-binaries-${{ github.run_number }}-${{ github.run_attempt }}
|
||||||
|
path: build/bin/rke*
|
||||||
|
if-no-files-found: error
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
integration-ci:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
runs-on: runs-on,runner=4cpu-linux-x64,run-id=${{ github.run_id }}
|
||||||
|
timeout-minutes: 30
|
||||||
|
if: github.event_name == 'pull_request'
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version-file: 'go.mod'
|
||||||
|
- name: Run CI
|
||||||
|
run: |
|
||||||
|
./scripts/integration-ci
|
||||||
|
|
||||||
|
github-pre-release:
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 10
|
||||||
|
needs: ci
|
||||||
|
if: github.event_name == 'push' && github.ref_type == 'tag' && (contains(github.ref_name, 'rc') || contains(github.ref_name, 'alpha'))
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Download rke bin artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: rke-binaries-${{ github.run_number }}-${{ github.run_attempt }}
|
||||||
|
path: build/bin
|
||||||
|
- name: Create pre-release
|
||||||
|
run: |
|
||||||
|
gh release create ${{ github.ref_name }} -p --verify-tag --title "Pre-release ${{ github.ref_name }}" --notes-file build/bin/rke-k8sversions.txt build/bin/rke*
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
|
||||||
|
github-release:
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 10
|
||||||
|
needs: ci
|
||||||
|
if: github.event_name == 'push' && github.ref_type == 'tag' && !(contains(github.ref_name, 'rc') || contains(github.ref_name, 'alpha'))
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Download rke bin artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: rke-binaries-${{ github.run_number }}-${{ github.run_attempt }}
|
||||||
|
path: build/bin
|
||||||
|
- name: Create release
|
||||||
|
run: |
|
||||||
|
gh release create ${{ github.ref_name }} --verify-tag --title "Release ${{ github.ref_name }}" --notes-file build/bin/rke-k8sversions.txt build/bin/rke*
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
|
||||||
|
dispatch:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 10
|
||||||
|
needs: ci
|
||||||
|
if: github.event_name == 'push' && github.ref_type == 'tag'
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Retrieve token from vault
|
||||||
|
uses: rancher-eio/read-vault-secrets@main
|
||||||
|
with:
|
||||||
|
secrets: |
|
||||||
|
secret/data/github/repo/${{ github.repository }}/github-token/credentials token | PAT_TOKEN ;
|
||||||
|
- name: Run dispatch
|
||||||
|
run: |
|
||||||
|
case ${{ github.ref_name }} in
|
||||||
|
"v1.4"*)
|
||||||
|
ACTION_TARGET_BRANCH="release/v2.7"
|
||||||
|
;;
|
||||||
|
"v1.5"*)
|
||||||
|
ACTION_TARGET_BRANCH="release/v2.8"
|
||||||
|
;;
|
||||||
|
"v1.6"*)
|
||||||
|
ACTION_TARGET_BRANCH="release/v2.9"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Not a valid tag, not dispatching event"
|
||||||
|
exit 0
|
||||||
|
esac
|
||||||
|
echo "Running on $ACTION_TARGET_BRANCH"
|
||||||
|
gh workflow run "Go get" --repo rancher/rancher --ref $ACTION_TARGET_BRANCH -F goget_module=github.com/rancher/rke -F goget_version=${{ github.ref_name }} -F source_author=${{ github.actor }}
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ env.PAT_TOKEN }}
|
14
dind/dind.go
14
dind/dind.go
@@ -3,6 +3,7 @@ package dind
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/docker/docker/api/types"
|
"github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/api/types/container"
|
"github.com/docker/docker/api/types/container"
|
||||||
@@ -13,7 +14,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
DINDImage = "docker:19.03.12-dind"
|
DINDImage = "docker:24.0.9-dind"
|
||||||
DINDContainerPrefix = "rke-dind"
|
DINDContainerPrefix = "rke-dind"
|
||||||
DINDPlane = "dind"
|
DINDPlane = "dind"
|
||||||
DINDNetwork = "dind-network"
|
DINDNetwork = "dind-network"
|
||||||
@@ -66,7 +67,7 @@ func StartUpDindContainer(ctx context.Context, dindAddress, dindNetwork, dindSto
|
|||||||
"mount --make-shared / && " +
|
"mount --make-shared / && " +
|
||||||
"mount --make-shared /sys && " +
|
"mount --make-shared /sys && " +
|
||||||
"mount --make-shared /var/lib/docker && " +
|
"mount --make-shared /var/lib/docker && " +
|
||||||
"dockerd-entrypoint.sh --storage-driver=" + storageDriver,
|
"dockerd-entrypoint.sh --tls=false --storage-driver=" + storageDriver,
|
||||||
},
|
},
|
||||||
Hostname: dindAddress,
|
Hostname: dindAddress,
|
||||||
Env: []string{"DOCKER_TLS_CERTDIR="},
|
Env: []string{"DOCKER_TLS_CERTDIR="},
|
||||||
@@ -120,6 +121,15 @@ func RmoveDindContainer(ctx context.Context, dindAddress string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
timeout := 2 * time.Minute
|
||||||
|
if err := cli.ContainerStop(ctx, containerName, &timeout); err != nil {
|
||||||
|
return fmt.Errorf("Failed to stop dind container [%s] on host [%s]: %v", containerName, cli.DaemonHost(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
logrus.Infof("waiting 1 minute before removing container [%s] on host [%s]", containerName, cli.DaemonHost())
|
||||||
|
time.Sleep(1 * time.Minute)
|
||||||
|
|
||||||
if err := cli.ContainerRemove(ctx, containerName, types.ContainerRemoveOptions{
|
if err := cli.ContainerRemove(ctx, containerName, types.ContainerRemoveOptions{
|
||||||
Force: true,
|
Force: true,
|
||||||
RemoveVolumes: true}); err != nil {
|
RemoveVolumes: true}); err != nil {
|
||||||
|
@@ -6,5 +6,4 @@ cd $(dirname $0)
|
|||||||
./validate
|
./validate
|
||||||
./build
|
./build
|
||||||
./test
|
./test
|
||||||
./integration
|
|
||||||
./package
|
./package
|
||||||
|
@@ -1,25 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
set -x
|
|
||||||
|
|
||||||
REPO="https://api.github.com/repos/rancher/rancher/actions/workflows/go-get.yml/dispatches"
|
|
||||||
|
|
||||||
case $DRONE_TAG in
|
|
||||||
"v1.4"*)
|
|
||||||
ACTION_TARGET_BRANCH="release/v2.7"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Not a valid tag, not dispatching event"
|
|
||||||
exit 0
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "DRONE_TAG: $DRONE_TAG"
|
|
||||||
echo "DRONE_COMMIT_AUTHOR: $DRONE_COMMIT_AUTHOR"
|
|
||||||
|
|
||||||
echo "Dispatching to branch ${ACTION_TARGET_BRANCH}"
|
|
||||||
|
|
||||||
# send dispatch event to workflow
|
|
||||||
curl -XPOST -u "${PAT_USERNAME}:${PAT_TOKEN}" \
|
|
||||||
-H "Accept: application/vnd.github.v3+json" \
|
|
||||||
-H "Content-Type: application/json" $REPO \
|
|
||||||
--data '{"ref": "'"$ACTION_TARGET_BRANCH"'","inputs":{"goget_module":"github.com/rancher/rke","goget_version":"'"$DRONE_TAG"'","source_author":"'"$DRONE_COMMIT_AUTHOR"'"}}'
|
|
@@ -18,7 +18,7 @@ function cleanup {
|
|||||||
echo ""
|
echo ""
|
||||||
echo_with_time "---- Clean Up RKE ----"
|
echo_with_time "---- Clean Up RKE ----"
|
||||||
for i in ./bin/cluster-*.yml; do
|
for i in ./bin/cluster-*.yml; do
|
||||||
./bin/rke remove --dind --force --config $i 2>&1 >/dev/null
|
./bin/rke remove --dind --force --config $i
|
||||||
done
|
done
|
||||||
rm -f ./bin/*.rkestate ./bin/*.yml
|
rm -f ./bin/*.rkestate ./bin/*.yml
|
||||||
}
|
}
|
||||||
|
7
scripts/integration-ci
Executable file
7
scripts/integration-ci
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cd $(dirname $0)
|
||||||
|
|
||||||
|
./build
|
||||||
|
./integration
|
@@ -10,23 +10,3 @@ SUFFIX=""
|
|||||||
[ "${ARCH}" != "amd64" ] && SUFFIX="_${ARCH}"
|
[ "${ARCH}" != "amd64" ] && SUFFIX="_${ARCH}"
|
||||||
|
|
||||||
./scripts/create-releasenote.sh
|
./scripts/create-releasenote.sh
|
||||||
|
|
||||||
cd package
|
|
||||||
|
|
||||||
TAG=${TAG:-${VERSION}${SUFFIX}}
|
|
||||||
REPO=${REPO:-rke}
|
|
||||||
|
|
||||||
if echo $TAG | grep -q dirty; then
|
|
||||||
TAG=dev
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$DRONE_TAG" ]; then
|
|
||||||
TAG=$DRONE_TAG
|
|
||||||
fi
|
|
||||||
|
|
||||||
cp ../bin/rke .
|
|
||||||
|
|
||||||
IMAGE=${REPO}/rke:${TAG}
|
|
||||||
docker build -t ${IMAGE} .
|
|
||||||
echo ${IMAGE} > ../dist/images
|
|
||||||
echo Built ${IMAGE}
|
|
||||||
|
11
util/util.go
11
util/util.go
@@ -134,13 +134,14 @@ func GetTagMajorVersion(tag string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func IsFileExists(filePath string) (bool, error) {
|
func IsFileExists(filePath string) (bool, error) {
|
||||||
if _, err := os.Stat(filePath); err == nil {
|
var err error
|
||||||
|
if _, err = os.Stat(filePath); err == nil {
|
||||||
return true, nil
|
return true, nil
|
||||||
} else if os.IsNotExist(err) {
|
|
||||||
return false, nil
|
|
||||||
} else {
|
|
||||||
return false, err
|
|
||||||
}
|
}
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetDefaultRKETools(image string) (string, error) {
|
func GetDefaultRKETools(image string) (string, error) {
|
||||||
|
Reference in New Issue
Block a user