未验证 提交 db37ccee 编写于 作者: LinuxSuRen's avatar LinuxSuRen 提交者: GitHub

Add shutdown Jenkins support (#346)

* Add shutdown Jenkins support

* Fix the packge missing issue

* Using sonarqube to analzy the code lines

* Rename the sonarqube actions

* Remove travis

* Fix the duplicates

* Add unit test cases for shutdown client api

* Add e2e tests for shutdown command

* Log the duration of command executing

* Exclusions setting for bindata.go

* Fix the code lines duplicates

* Add test cases for shutdown cmd

* Adjust the test cases
上级 741a743d
on:
push:
branches:
- master
pull_request:
types: [opened, synchronize, reopened]
name: Sonarqube
jobs:
sonarcloud:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Test
run: |
export PATH=$PATH:${PWD}/bin:$GOPATH/bin:/home/runner/go/bin
make test
- name: SonarCloud Scan
uses: sonarsource/sonarcloud-github-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: 3caad1285eb0edf2b4f65ee07b3cd8edde6c5176
language: go
dist: trusty
go:
- 1.12.x
env:
global:
- GO111MODULE=on
addons:
sonarcloud:
organization: "jenkins-zh"
token:
secure: 3caad1285eb0edf2b4f65ee07b3cd8edde6c5176 # encrypted value of your token
script:
# Execute some tests
- export PATH=${PWD}/bin:$PATH
- make clean gen-data-linux tools init build-all test
# And finally run the SonarQube analysis - read the "sonar-project.properties"
# file to see the specific configuration
- curl -LsS https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip > sonar-scanner-cli-4.0.0.1744-linux.zip
- unzip sonar-scanner-cli-4.0.0.1744-linux.zip
- export branch=$(if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then echo $TRAVIS_BRANCH; else echo pr-$TRAVIS_PULL_REQUEST; fi)
- branch=$(echo $branch | sed 's/\//-/g')
- sonar-scanner-4.0.0.1744-linux/bin/sonar-scanner -Dsonar.branch.name=$branch -Dsonar.projectKey=jenkins-zh_jenkins-cli -Dsonar.organization=jenkins-zh -Dsonar.sources=. -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=674e187e300edc0ad56a05705bd0b21cbe18bd52
# it's bad, but no better solution for now
# - sleep 30
# - if [ 'OK' != $(curl -s "https://sonarcloud.io/api/qualitygates/project_status?branch=$branch&projectKey=jenkins-zh_jenkins-cli" | python -c "import sys, json; print(json.load(sys.stdin)['projectStatus']['status'])") ]; then exit -1; fi
......@@ -116,13 +116,15 @@ test-slow:
test:
mkdir -p bin
go test ./util -v -count=1
go test ./client -v -count=1 -coverprofile coverage.out
go test ./app -v -count=1
go test ./app/health -v -count=1
go test ./app/helper -v -count=1
go test ./app/i18n -v -count=1
go test ./util ./client ./app/ ./app/health ./app/helper ./app/i18n ./app/cmd/common -v -count=1 -coverprofile coverage.out
go test ./app/cmd -v -count=1
# go test ./util -v -count=1
# go test ./client -v -count=1 -coverprofile coverage.out
# go test ./app -v -count=1
# go test ./app/health -v -count=1
# go test ./app/helper -v -count=1
# go test ./app/i18n -v -count=1
# go test ./app/cmd -v -count=1
dep:
go get github.com/AlecAivazis/survey/v2
......@@ -141,12 +143,3 @@ gen-data:
image:
docker build . -t jenkinszh/jcli
image-win:
docker build . -t jenkinszh/jcli:win -f Dockerfile-win
image-darwin:
docker build . -t jenkinszh/jcli:darwin -f Dockerfile-darwin
image-dev:
docker build . -t jenkinszh/jcli:dev -f Docker-dev
......@@ -33,6 +33,6 @@ var cascCmd = &cobra.Command{
Short: i18n.T("Configuration as Code"),
Long: i18n.T("Configuration as Code"),
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -36,6 +36,6 @@ var cascApplyCmd = &cobra.Command{
return jClient.Apply()
},
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -42,7 +42,7 @@ var _ = Describe("casc apply command", func() {
Context("basic cases", func() {
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -41,6 +41,6 @@ var cascExportCmd = &cobra.Command{
return
},
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -42,7 +42,7 @@ var _ = Describe("casc apply command", func() {
Context("basic cases", func() {
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -47,6 +47,6 @@ var cascOpenCmd = &cobra.Command{
return
},
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -16,7 +16,7 @@ var _ = Describe("casc open test", func() {
BeforeEach(func() {
cascOpenOption.ExecContext = util.FakeExecCommandSuccess
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
tempFile, err = ioutil.TempFile(".", "test.yaml")
......
......@@ -36,6 +36,6 @@ var cascReloadCmd = &cobra.Command{
return jClient.Reload()
},
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -42,7 +42,7 @@ var _ = Describe("casc reload command", func() {
Context("basic cases", func() {
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -41,6 +41,6 @@ var cascSchemaCmd = &cobra.Command{
return
},
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -42,7 +42,7 @@ var _ = Describe("casc apply command", func() {
Context("basic cases", func() {
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -49,7 +49,7 @@ var _ = Describe("center download command", func() {
Context("basic cases", func() {
BeforeEach(func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -40,7 +40,7 @@ var _ = Describe("center identity command", func() {
Context("basic cases", func() {
It("should not error", func() {
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -42,7 +42,7 @@ var _ = Describe("center mirror command", func() {
Context("basic cases", func() {
It("enable mirror site", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -57,7 +57,7 @@ var _ = Describe("center mirror command", func() {
})
It("disable mirror site", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -17,7 +17,7 @@ var _ = Describe("center start command", func() {
Expect(err).NotTo(HaveOccurred())
configFile = file.Name()
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(configFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -39,7 +39,7 @@ var _ = Describe("center command", func() {
Context("basic cases", func() {
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -38,7 +38,7 @@ var _ = Describe("center upgrade command", func() {
Context("basic cases", func() {
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -41,7 +41,7 @@ var _ = Describe("center watch command", func() {
Context("basic cases", func() {
It("should success, center watch command", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
package cmd_test
package common
import (
"bytes"
"github.com/jenkins-zh/jenkins-cli/app/cmd/common"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"reflect"
......@@ -10,12 +9,12 @@ import (
var _ = Describe("test OutputOption", func() {
var (
outputOption common.OutputOption
outputOption OutputOption
fakeFoos []FakeFoo
)
BeforeEach(func() {
outputOption = common.OutputOption{}
outputOption = OutputOption{}
fakeFoos = []FakeFoo{{
Name: "fake",
......@@ -39,7 +38,7 @@ var _ = Describe("test OutputOption", func() {
Context("with filter", func() {
BeforeEach(func() {
outputOption = common.OutputOption{
outputOption = OutputOption{
Filter: []string{"Name=fake"},
}
})
......@@ -95,7 +94,7 @@ foo-1
Context("with json format", func() {
BeforeEach(func() {
outputOption.Format = common.JSONOutputFormat
outputOption.Format = JSONOutputFormat
})
It("should get a json text", func() {
......@@ -112,7 +111,7 @@ foo-1
Context("with yaml format", func() {
BeforeEach(func() {
outputOption.Format = common.YAMLOutputFormat
outputOption.Format = YAMLOutputFormat
})
It("should get a yaml text", func() {
......@@ -150,7 +149,7 @@ foo-1
Context("ignore invalid filter", func() {
BeforeEach(func() {
outputOption = common.OutputOption{
outputOption = OutputOption{
Filter: []string{"Name"},
}
})
......
package common
import (
"testing"
"github.com/onsi/ginkgo/reporters"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
func TestCmd(t *testing.T) {
RegisterFailHandler(Fail)
junitReporter := reporters.NewJUnitReporter("test-app-cmd-common.xml")
RunSpecsWithDefaultAndCustomReporters(t, "app/cmd/common", []Reporter{junitReporter})
}
package common
const (
// VersionSince0028 represents v0.0.28
VersionSince0028 = "v0.0.28"
// VersionSince0024 represents v0.0.24
VersionSince0024 = "v0.0.24"
)
......@@ -25,7 +25,7 @@ var _ = Describe("completion command", func() {
rootOptions.ConfigFile = "test.yaml"
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -31,6 +31,6 @@ It can only create a JNLP agent.`),
return jClient.Create(args[0])
},
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -48,7 +48,7 @@ var _ = Describe("create list command", func() {
BeforeEach(func() {
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -30,6 +30,6 @@ var computerDeleteCmd = &cobra.Command{
return jClient.Delete(args[0])
},
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -48,7 +48,7 @@ var _ = Describe("create delete command", func() {
BeforeEach(func() {
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -39,7 +39,7 @@ var _ = Describe("computer launch command", func() {
name = "fake"
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -47,7 +47,7 @@ var _ = Describe("computer list command", func() {
BeforeEach(func() {
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -47,7 +47,7 @@ var _ = Describe("computer log command", func() {
BeforeEach(func() {
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -30,7 +30,7 @@ var _ = Describe("config add command", func() {
configPath = path.Join(os.TempDir(), "fake.yaml")
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(configPath, data, 0664)
Expect(err).To(BeNil())
......
......@@ -12,7 +12,7 @@ package cmd
// },
// Test: func(stdio terminal.Stdio) (err error) {
// rootOptions.ConfigFile = "test.yaml"
// data, err := generateSampleConfig()
// data, err := GenerateSampleConfig()
// err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
//
// rootCmd.SetArgs([]string{"config", "edit"})
......
......@@ -43,7 +43,7 @@ var configGenerateCmd = &cobra.Command{
Long: i18n.T("Generate a sample config file for you"),
RunE: func(cmd *cobra.Command, _ []string) (err error) {
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
if err == nil {
if configGenerateOption.Interactive {
err = configGenerateOption.InteractiveWithConfig(cmd, data)
......@@ -124,7 +124,8 @@ func getSampleConfig() (sampleConfig Config) {
return
}
func generateSampleConfig() ([]byte, error) {
// GenerateSampleConfig returns a sample config
func GenerateSampleConfig() ([]byte, error) {
sampleConfig := getSampleConfig()
return yaml.Marshal(&sampleConfig)
}
......
......@@ -25,7 +25,7 @@ var _ = Describe("config list command", func() {
rootOptions.ConfigFile = "test.yaml"
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -46,7 +46,7 @@ var configPluginCmd = &cobra.Command{
If you want to submit a plugin for jcli, please see also the following project.
https://github.com/jenkins-zh/jcli-plugins`),
Annotations: map[string]string{
common.Since: "v0.0.28",
common.Since: common.VersionSince0028,
},
}
......@@ -66,7 +66,7 @@ func NewConfigPluginListCmd() (cmd *cobra.Command) {
Long: "list all installed plugins",
RunE: configPluginListCmd.RunE,
Annotations: map[string]string{
common.Since: "v0.0.28",
common.Since: common.VersionSince0028,
},
}
......@@ -93,7 +93,7 @@ The official metadata git repository is https://github.com/jenkins-zh/jcli-plugi
but you can change it by giving a command parameter.`,
RunE: pluginFetchCmd.Run,
Annotations: map[string]string{
common.Since: "v0.0.28",
common.Since: common.VersionSince0028,
},
}
......@@ -125,7 +125,7 @@ func NewConfigPluginInstallCmd() (cmd *cobra.Command) {
Args: cobra.MinimumNArgs(1),
RunE: pluginInstallCmd.Run,
Annotations: map[string]string{
common.Since: "v0.0.28",
common.Since: common.VersionSince0028,
},
}
......
......@@ -39,7 +39,7 @@ func NewConfigPluginCmd(opt *common.CommonOption) (cmd *cobra.Command) {
If you want to submit a plugin for jcli, please see also the following project.
https://github.com/jenkins-zh/jcli-plugins`),
Annotations: map[string]string{
common.Since: "v0.0.28",
common.Since: common.VersionSince0028,
},
}
......@@ -62,7 +62,7 @@ func NewConfigPluginListCmd(opt *common.CommonOption) (cmd *cobra.Command) {
Long: "list all installed plugins",
RunE: configPluginListCmd.RunE,
Annotations: map[string]string{
common.Since: "v0.0.28",
common.Since: common.VersionSince0028,
},
}
......@@ -91,7 +91,7 @@ The official metadata git repository is https://github.com/jenkins-zh/jcli-plugi
but you can change it by giving a command parameter.`,
RunE: pluginFetchCmd.Run,
Annotations: map[string]string{
common.Since: "v0.0.28",
common.Since: common.VersionSince0028,
},
}
......@@ -125,7 +125,7 @@ func NewConfigPluginInstallCmd(opt *common.CommonOption) (cmd *cobra.Command) {
Args: cobra.MinimumNArgs(1),
RunE: pluginInstallCmd.Run,
Annotations: map[string]string{
common.Since: "v0.0.28",
common.Since: common.VersionSince0028,
},
}
......
......@@ -23,7 +23,7 @@ func NewConfigPluginUninstallCmd(opt *common.CommonOption) (cmd *cobra.Command)
Args: cobra.MinimumNArgs(1),
RunE: jcliPluginUninstallCmd.RunE,
Annotations: map[string]string{
common.Since: "v0.0.28",
common.Since: common.VersionSince0028,
},
}
return
......
......@@ -74,7 +74,7 @@ var _ = Describe("config select command", func() {
// defer os.Remove(configFile)
//
// var data []byte
// data, err = generateSampleConfig()
// data, err = GenerateSampleConfig()
// err = ioutil.WriteFile(configFile, data, 0664)
//
// configSelectOptions.CommonOption.Stdio = stdio
......
......@@ -84,7 +84,7 @@ var _ = Describe("Table util test", func() {
rootOptions.Jenkins = ""
rootOptions.ConfigFile = "test.yaml"
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -16,6 +16,6 @@ var credentialCmd = &cobra.Command{
Short: i18n.T("Manage the credentials of your Jenkins"),
Long: i18n.T(`Manage the credentials of your Jenkins`),
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -98,6 +98,6 @@ var credentialCreateCmd = &cobra.Command{
return
},
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -51,7 +51,7 @@ var _ = Describe("credential create command", func() {
BeforeEach(func() {
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -67,6 +67,6 @@ var credentialDeleteCmd = &cobra.Command{
return
},
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -2,8 +2,8 @@ package cmd
import (
"bytes"
_ "github.com/Netflix/go-expect"
_ "github.com/jenkins-zh/jenkins-cli/app/cmd/common"
//"github.com/Netflix/go-expect"
//"github.com/jenkins-zh/jenkins-cli/app/cmd/common"
"io/ioutil"
"os"
......@@ -54,7 +54,7 @@ var _ = Describe("credential delete command", func() {
BeforeEach(func() {
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -49,6 +49,6 @@ var credentialListCmd = &cobra.Command{
return
},
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -50,7 +50,7 @@ var _ = Describe("credential list command", func() {
BeforeEach(func() {
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -45,7 +45,7 @@ var _ = Describe("crumb command", func() {
Context("basic cases", func() {
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -22,7 +22,7 @@ var _ = Describe("doc command test", func() {
rootOptions.ConfigFile = "test.yaml"
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -44,7 +44,7 @@ var _ = Describe("job artifact download command", func() {
Context("basic cases", func() {
It("invalid build id", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -59,7 +59,7 @@ var _ = Describe("job artifact download command", func() {
})
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -96,7 +96,7 @@ var _ = Describe("job artifact download command", func() {
})
It("should success, fake artifact id", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -52,7 +52,7 @@ var _ = Describe("job artifact command", func() {
})
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -72,7 +72,7 @@ a.log a.log 0
})
It("should success, zero build id", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -93,7 +93,7 @@ a.log a.log 0
})
It("should success, invalid build id", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -47,7 +47,7 @@ var _ = Describe("job build command", func() {
Context("basic cases", func() {
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -90,7 +90,7 @@ var _ = Describe("job build command", func() {
})
It("with --param-entry", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -126,7 +126,7 @@ var _ = Describe("job build command", func() {
// Test: func(stdio terminal.Stdio) (err error) {
// var data []byte
// rootOptions.ConfigFile = "test.yaml"
// data, err = generateSampleConfig()
// data, err = GenerateSampleConfig()
// err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
//
// ctrl := gomock.NewController(t)
......
......@@ -54,7 +54,7 @@ var _ = Describe("job create command", func() {
}
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -51,7 +51,7 @@ var _ = Describe("job delete command", func() {
})
It("should success, with batch mode", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -134,7 +134,7 @@ type EditorTest struct {
//func RunPromptCommandTest(t *testing.T, test PromptCommandTest) {
// RunTest(t, func(stdio terminal.Stdio) (err error) {
// var data []byte
// data, err = generateSampleConfig()
// data, err = GenerateSampleConfig()
// err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
//
// test.BatchOption.Stdio = stdio
......
......@@ -26,7 +26,7 @@ var _ = Describe("job disable command", func() {
rootOptions.Jenkins = ""
rootOptions.ConfigFile = "test.yaml"
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -48,7 +48,7 @@ var _ = Describe("job edit command", func() {
Context("basic cases", func() {
It("edit with script param", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -67,7 +67,7 @@ var _ = Describe("job edit command", func() {
})
It("edit with file param", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -91,7 +91,7 @@ var _ = Describe("job edit command", func() {
})
It("edit with url param", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -26,7 +26,7 @@ var _ = Describe("job enable command", func() {
rootOptions.Jenkins = ""
rootOptions.ConfigFile = "test.yaml"
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -50,7 +50,7 @@ var _ = Describe("job history command", func() {
})
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -46,7 +46,7 @@ var _ = Describe("job input command", func() {
Context("basic cases", func() {
It("no params, will error", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -62,7 +62,7 @@ var _ = Describe("job input command", func() {
})
It("should success, abort without inputs", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -102,7 +102,7 @@ var _ = Describe("job input command", func() {
})
It("should success, process without inputs", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -44,7 +44,7 @@ var _ = Describe("job log command", func() {
Context("basic cases, need RoundTripper", func() {
It("output the last build log", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -44,7 +44,7 @@ var _ = Describe("job search command", func() {
Context("basic cases, need RoundTripper", func() {
It("without parameters", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -62,7 +62,7 @@ var _ = Describe("job search command", func() {
})
It("with one parameter", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -80,7 +80,7 @@ var _ = Describe("job search command", func() {
})
It("with one parameter, output with indent", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -41,7 +41,7 @@ var _ = Describe("job search command", func() {
})
It("should success, search with one result item", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -65,7 +65,7 @@ fake fake WorkflowJob job/fake/
})
It("should success, search without keyword", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -30,7 +30,7 @@ var _ = Describe("job stop command", func() {
rootOptions.ConfigFile = "test.yaml"
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -84,7 +84,7 @@ var _ = Describe("job stop command", func() {
})
It("stop the last build, with batch mode", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -40,7 +40,7 @@ var _ = Describe("job type command", func() {
Context("basic cases", func() {
It("GetCategories", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -79,7 +79,7 @@ var _ = Describe("job type command", func() {
})
It("should success, empty list", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -106,7 +106,7 @@ var _ = Describe("job type command", func() {
})
It("should success, empty list", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -133,7 +133,7 @@ var _ = Describe("job type command", func() {
})
It("should success, one item", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -22,7 +22,7 @@ var _ = Describe("test open", func() {
BeforeEach(func() {
configFile = path.Join(os.TempDir(), "fake.yaml")
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(configFile, data, 0664)
Expect(err).To(BeNil())
......@@ -93,7 +93,7 @@ var _ = Describe("test open", func() {
// defer os.Remove(configFile)
//
// var data []byte
// data, err = generateSampleConfig()
// data, err = GenerateSampleConfig()
// err = ioutil.WriteFile(configFile, data, 0664)
//
// openOption.ExecContext = util.FakeExecCommandSuccess
......
......@@ -39,7 +39,7 @@ var _ = Describe("plugin checkout command", func() {
It("should success", func() {
var err error
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -16,7 +16,7 @@ var _ = Describe("plugin create test", func() {
BeforeEach(func() {
pluginCreateOptions.SystemCallExec = util.FakeSystemCallExecSuccess
pluginCreateOptions.LookPathContext = util.FakeLookPath
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
rootOptions.ConfigFile = "test.yaml"
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
......
......@@ -39,7 +39,7 @@ var _ = Describe("plugin download command", func() {
It("should success", func() {
var err error
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -56,9 +56,8 @@ var _ = Describe("plugin download command", func() {
Expect(buf.String()).To(Equal(""))
_, err = os.Stat("fake.hpi")
Expect(err).To(BeNil())
defer os.Remove("fake.hpi")
Expect(err).To(BeNil())
})
})
})
......@@ -48,7 +48,7 @@ var _ = Describe("plugin install command", func() {
Context("basic cases", func() {
It("install one plugin", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -66,7 +66,7 @@ var _ = Describe("plugin install command", func() {
})
It("unknow suite", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -37,7 +37,7 @@ var _ = Describe("plugin list command", func() {
Context("basic cases", func() {
It("no plugin in the list", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -56,7 +56,7 @@ var _ = Describe("plugin list command", func() {
})
It("one plugin in the list", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -77,7 +77,7 @@ fake 1.0 true
})
It("one plugin in the list without headers", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -97,7 +97,7 @@ fake 1.0 true
})
It("one plugin output with json format", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -117,7 +117,7 @@ fake 1.0 true
})
It("one plugin output with yaml format", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -137,7 +137,7 @@ fake 1.0 true
})
It("one plugin output with not support format", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -17,7 +17,7 @@ var _ = Describe("plugin open test", func() {
BeforeEach(func() {
pluginOpenOption.ExecContext = util.FakeExecCommandSuccess
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
rootOptions.ConfigFile = "test.yaml"
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
......
......@@ -73,6 +73,6 @@ var pluginReleaseCmd = &cobra.Command{
return
},
Annotations: map[string]string{
common.Since: "v0.0.24",
common.Since: common.VersionSince0024,
},
}
......@@ -16,7 +16,7 @@ var _ = Describe("plugin release test", func() {
BeforeEach(func() {
pluginReleaseOptions.SystemCallExec = util.FakeSystemCallExecSuccess
pluginReleaseOptions.LookPathContext = util.FakeLookPath
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
rootOptions.ConfigFile = "test.yaml"
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
......
......@@ -37,7 +37,7 @@ var _ = Describe("plugin search command", func() {
Context("basic cases", func() {
It("should success, empty list", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -55,7 +55,7 @@ var _ = Describe("plugin search command", func() {
})
It("many plugins in the list", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -84,7 +84,7 @@ var _ = Describe("plugin search command", func() {
})
It("should success, empty updateCenter list", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -112,7 +112,7 @@ var _ = Describe("plugin search command", func() {
})
It("should success, null updateCenter and 500 installed list", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -39,7 +39,7 @@ var _ = Describe("plugin trend command", func() {
Context("basic cases", func() {
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -39,7 +39,7 @@ var _ = Describe("plugin uninstall command", func() {
Context("basic cases", func() {
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -59,7 +59,7 @@ var _ = Describe("plugin uninstall command", func() {
})
It("with error", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -39,7 +39,7 @@ var _ = Describe("plugin upgrade command", func() {
Context("basic cases", func() {
It("given plugin name, should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -57,7 +57,7 @@ var _ = Describe("plugin upgrade command", func() {
})
It("findUpgradeablePlugins", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -86,7 +86,7 @@ var _ = Describe("plugin upgrade command", func() {
})
It("upgrade all plugin, should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -37,7 +37,7 @@ var _ = Describe("plugin upload command", func() {
Context("basic cases", func() {
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -39,7 +39,7 @@ var _ = Describe("queue cancel command", func() {
})
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -57,7 +57,7 @@ var _ = Describe("queue cancel command", func() {
})
It("should have error with invalid number", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -40,7 +40,7 @@ var _ = Describe("queue list command", func() {
})
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -71,7 +71,7 @@ var _ = Describe("queue list command", func() {
})
It("output with table format", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -31,7 +31,7 @@ var _ = Describe("queue command", func() {
Context("without http requests", func() {
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -29,7 +29,7 @@ var _ = Describe("restart command", func() {
rootOptions.ConfigFile = path.Join(os.TempDir(), "fake.yaml")
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -2,12 +2,14 @@ package cmd
import (
"fmt"
"github.com/jenkins-zh/jenkins-cli/app/cmd/common"
"io"
"log"
"os"
"os/exec"
"regexp"
"strings"
"time"
. "github.com/jenkins-zh/jenkins-cli/app/config"
"github.com/jenkins-zh/jenkins-cli/app/health"
......@@ -38,7 +40,11 @@ type RootOptions struct {
ProxyAuth string
ProxyDisable bool
Doctor bool
Doctor bool
StartTime time.Time
EndTime time.Time
CommonOption *common.CommonOption
LoggerLevel string
}
......@@ -54,6 +60,7 @@ var rootCmd = &cobra.Command{
We'd love to hear your feedback at https://github.com/jenkins-zh/jenkins-cli/issues`,
PersistentPreRunE: func(cmd *cobra.Command, args []string) (err error) {
rootOptions.StartTime = time.Now()
if logger, err = util.InitLogger(rootOptions.LoggerLevel); err == nil {
(&configOptions).Logger = logger
client.SetLogger(logger)
......@@ -88,6 +95,15 @@ We'd love to hear your feedback at https://github.com/jenkins-zh/jenkins-cli/iss
}
return
},
PersistentPostRun: func(cmd *cobra.Command, args []string) {
cmdPath := getCmdPath(cmd)
// calculate the time
rootOptions.EndTime = time.Now()
logger.Debug("done with command", zap.String("command", cmdPath),
zap.Float64("duration", rootOptions.EndTime.Sub(rootOptions.StartTime).Seconds()))
},
BashCompletionFunction: jcliBashCompletionFunc,
}
......@@ -175,6 +191,19 @@ func init() {
rootCmd.SetOut(os.Stdout)
loadPlugins(rootCmd)
// add sub-commands
NewShutdownCmd(&rootOptions)
}
// GetRootOptions returns the root options
func GetRootOptions() *RootOptions {
return &rootOptions
}
// GetRootCommand returns the root cmd
func GetRootCommand() *cobra.Command {
return rootCmd
}
func getCurrentJenkinsFromOptions() (jenkinsServer *JenkinsServer) {
......
......@@ -270,7 +270,7 @@ var _ = Describe("Root cmd test", func() {
defer os.Remove(configFile.Name())
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(configFile.Name(), data, 0664)
Expect(err).To(BeNil())
......
......@@ -36,7 +36,7 @@ var _ = Describe("shell command", func() {
//Context("basic test", func() {
// It("should success", func() {
// data, err := generateSampleConfig()
// data, err := GenerateSampleConfig()
// Expect(err).To(BeNil())
// err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
// Expect(err).To(BeNil())
......
package cmd
import (
"fmt"
"github.com/jenkins-zh/jenkins-cli/app/cmd/common"
"github.com/jenkins-zh/jenkins-cli/app/i18n"
"github.com/jenkins-zh/jenkins-cli/client"
"github.com/spf13/cobra"
)
// ShutdownOption holds the options for shutdown cmd
type ShutdownOption struct {
common.BatchOption
common.CommonOption
RootOptions *RootOptions
Safe bool
Prepare bool
CancelPrepare bool
}
const (
// SafeShutdown the text about shutdown safely
SafeShutdown = "Puts Jenkins into the quiet mode, wait for existing builds to be completed, and then shut down Jenkins"
)
// NewShutdownCmd create the shutdown command
func NewShutdownCmd(rootOpt *RootOptions) (cmd *cobra.Command) {
shutdownOption := &ShutdownOption{
RootOptions: rootOpt,
}
cmd = &cobra.Command{
Use: "shutdown",
Short: i18n.T(SafeShutdown),
Long: i18n.T(SafeShutdown),
RunE: shutdownOption.runE,
}
shutdownOption.init(cmd)
return
}
func (o *ShutdownOption) runE(cmd *cobra.Command, _ []string) (err error) {
jenkins := getCurrentJenkinsFromOptions()
if !o.Confirm(fmt.Sprintf("Are you sure to shutdown Jenkins %s?", jenkins.URL)) {
return
}
jClient := &client.CoreClient{
JenkinsCore: client.JenkinsCore{
RoundTripper: o.RootOptions.CommonOption.RoundTripper,
Debug: o.RootOptions.Debug,
},
}
getCurrentJenkinsAndClient(&(jClient.JenkinsCore))
if o.CancelPrepare {
err = jClient.PrepareShutdown(true)
} else if o.Prepare {
err = jClient.PrepareShutdown(false)
} else {
err = jClient.Shutdown(o.Safe)
}
return
}
func (o *ShutdownOption) init(shutdownCmd *cobra.Command) {
rootCmd.AddCommand(shutdownCmd)
o.SetFlag(shutdownCmd)
shutdownCmd.Flags().BoolVarP(&o.Safe, "safe", "s", true,
i18n.T(SafeShutdown))
shutdownCmd.Flags().BoolVarP(&o.Prepare, "prepare", "", false,
i18n.T("Put Jenkins in a Quiet mode, in preparation for a restart. In that mode Jenkins don’t start any build"))
shutdownCmd.Flags().BoolVarP(&o.CancelPrepare, "prepare-cancel", "", false,
i18n.T(" Cancel the effect of the “quiet-down” command"))
o.BatchOption.Stdio = common.GetSystemStdio()
o.CommonOption.Stdio = common.GetSystemStdio()
}
package cmd
import (
"bytes"
"github.com/jenkins-zh/jenkins-cli/app/cmd/common"
"github.com/jenkins-zh/jenkins-cli/client"
"github.com/jenkins-zh/jenkins-cli/mock/mhttp"
"io/ioutil"
"os"
"path"
"github.com/golang/mock/gomock"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
var _ = Describe("shutdown command", func() {
var (
ctrl *gomock.Controller
roundTripper *mhttp.MockRoundTripper
configFile string
err error
)
BeforeEach(func() {
rootOptions := GetRootOptions()
ctrl = gomock.NewController(GinkgoT())
roundTripper = mhttp.NewMockRoundTripper(ctrl)
rootOptions.CommonOption = &common.CommonOption{
RoundTripper: roundTripper,
}
rootOptions.Jenkins = ""
configFile = path.Join(os.TempDir(), "fake.yaml")
rootOptions.ConfigFile = configFile
var data []byte
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
})
AfterEach(func() {
os.Remove(configFile)
GetRootOptions().ConfigFile = ""
ctrl.Finish()
})
Context("with batch mode", func() {
It("should success", func() {
client.PrepareForShutdown(roundTripper, "http://localhost:8080/jenkins", "admin", "111e3a2f0231198855dceaff96f20540a9", true)
GetRootCommand().SetArgs([]string{"shutdown", "-b"})
buf := new(bytes.Buffer)
GetRootCommand().SetOutput(buf)
_, err = GetRootCommand().ExecuteC()
Expect(err).To(BeNil())
})
})
})
......@@ -39,7 +39,7 @@ var _ = Describe("user create command", func() {
})
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -58,7 +58,7 @@ var _ = Describe("user create command", func() {
})
It("with status code 500", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -38,7 +38,7 @@ var _ = Describe("user delete command", func() {
})
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -57,7 +57,7 @@ var _ = Describe("user delete command", func() {
})
It("with status code 500", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -14,7 +14,7 @@ package cmd
// configFile := path.Join(os.TempDir(), "fake.yaml")
// defer os.Remove(configFile)
//
// data, err := generateSampleConfig()
// data, err := GenerateSampleConfig()
// err = ioutil.WriteFile(configFile, data, 0664)
//
// var (
......
......@@ -40,7 +40,7 @@ var _ = Describe("user command", func() {
})
It("should success", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......@@ -59,7 +59,7 @@ var _ = Describe("user command", func() {
})
It("with status code 500", func() {
data, err := generateSampleConfig()
data, err := GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -30,7 +30,7 @@ var _ = Describe("user token command", func() {
rootOptions.ConfigFile = "test.yaml"
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -33,7 +33,7 @@ var _ = Describe("version command", func() {
rootCmd.SetOutput(buf)
var data []byte
data, err = generateSampleConfig()
data, err = GenerateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
......
......@@ -38,6 +38,26 @@ func (q *CoreClient) RestartDirectly() (err error) {
return
}
// Shutdown puts Jenkins into the quiet mode, wait for existing builds to be completed, and then shut down Jenkins
func (q *CoreClient) Shutdown(safe bool) (err error) {
if safe {
_, err = q.RequestWithoutData("POST", "/safeExit", nil, nil, 200)
} else {
_, err = q.RequestWithoutData("POST", "/exit", nil, nil, 200)
}
return
}
// PrepareShutdown Put Jenkins in a Quiet mode, in preparation for a restart. In that mode Jenkins don’t start any build
func (q *CoreClient) PrepareShutdown(cancel bool) (err error) {
if cancel {
_, err = q.RequestWithoutData("POST", "/cancelQuietDown", nil, nil, 200)
} else {
_, err = q.RequestWithoutData("POST", "/quietDown", nil, nil, 200)
}
return
}
// JenkinsIdentity belongs to a Jenkins
type JenkinsIdentity struct {
Fingerprint string
......
......@@ -69,4 +69,64 @@ var _ = Describe("core test", func() {
}))
})
})
Context("shutdown", func() {
var (
err error
safe bool
)
JustBeforeEach(func() {
PrepareForShutdown(roundTripper, coreClient.URL, username, password, safe)
err = coreClient.Shutdown(safe)
})
Context("shutdown safely", func() {
BeforeEach(func() {
safe = true
})
It("should success", func() {
Expect(err).To(BeNil())
})
})
Context("shutdown not safely", func() {
BeforeEach(func() {
safe = false
})
It("should success", func() {
Expect(err).To(BeNil())
})
})
})
Context("prepare shutdown", func() {
var (
err error
cancel bool
)
JustBeforeEach(func() {
PrepareForCancelShutdown(roundTripper, coreClient.URL, username, password, cancel)
err = coreClient.PrepareShutdown(cancel)
})
Context("cancelQuietDown", func() {
BeforeEach(func() {
cancel = true
})
It("should success", func() {
Expect(err).To(BeNil())
})
})
Context("quietDown", func() {
BeforeEach(func() {
cancel = false
})
It("should success", func() {
Expect(err).To(BeNil())
})
})
})
})
......@@ -24,6 +24,30 @@ func PrepareRestartDirectly(roundTripper *mhttp.MockRoundTripper, rootURL, user,
return
}
// PrepareForShutdown only for test
func PrepareForShutdown(roundTripper *mhttp.MockRoundTripper, rootURL, user, password string, safe bool) {
var request *http.Request
if safe {
request, _ = http.NewRequest("POST", fmt.Sprintf("%s/safeExit", rootURL), nil)
} else {
request, _ = http.NewRequest("POST", fmt.Sprintf("%s/exit", rootURL), nil)
}
PrepareCommonPost(request, "", roundTripper, user, password, rootURL)
return
}
// PrepareForCancelShutdown only for test
func PrepareForCancelShutdown(roundTripper *mhttp.MockRoundTripper, rootURL, user, password string, cancel bool) {
var request *http.Request
if cancel {
request, _ = http.NewRequest("POST", fmt.Sprintf("%s/cancelQuietDown", rootURL), nil)
} else {
request, _ = http.NewRequest("POST", fmt.Sprintf("%s/quietDown", rootURL), nil)
}
PrepareCommonPost(request, "", roundTripper, user, password, rootURL)
return
}
// PrepareForGetIdentity only for test
func PrepareForGetIdentity(roundTripper *mhttp.MockRoundTripper, rootURL, user, password string) {
request, _ := http.NewRequest("GET", fmt.Sprintf("%s/instance", rootURL), nil)
......
......@@ -63,9 +63,8 @@ var _ = Describe("plugin api test", func() {
pluginAPI.DownloadPlugins(names)
_, err := os.Stat("fake.hpi")
Expect(err).To(BeNil())
defer os.Remove("fake.hpi")
Expect(err).To(BeNil())
})
It("use mirror", func() {
......@@ -78,9 +77,8 @@ var _ = Describe("plugin api test", func() {
pluginAPI.DownloadPlugins(names)
_, err := os.Stat("fake.hpi")
Expect(err).To(BeNil())
defer os.Remove("fake.hpi")
Expect(err).To(BeNil())
})
It("with dependency which is not optional", func() {
......
package e2e
import (
"fmt"
"github.com/stretchr/testify/assert"
"os/exec"
"testing"
)
func TestShutdown(t *testing.T) {
cmd := exec.Command("jcli", "shutdown", "--url", GetJenkinsURL())
data, err := cmd.CombinedOutput()
assert.Nil(t, err, fmt.Sprintf("failed in shutdown Jenkins, output is %s", string(data)))
}
sonar.organization=jenkins-zh
sonar.projectKey=jenkins-zh_jenkins-cli
# this is the name and version displayed in the SonarCloud UI.
sonar.projectName=jenkins-cli
......@@ -10,6 +11,8 @@ sonar.sources=.
# Encoding of the source code. Default is default system encoding
#sonar.sourceEncoding=UTF-8
sonar.go.exclusions=**/vendor/**,**/**/*_test.go,client/test_methods.go
sonar.go.exclusions=**/vendor/**,**/**/*_test.go,client/test_methods.go,app/i18n/bindata.go
sonar.exclusions=**/vendor/**,**/**/*_test.go,client/test_methods.go,app/i18n/bindata.go
sonar.coverage.exclusions=app/i18n/bindata.go
sonar.go.coverage.reportPaths=coverage.out
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册