diff --git a/.devbots/needs-triage.yml b/.devbots/needs-triage.yml new file mode 100644 index 00000000..d71c6782 --- /dev/null +++ b/.devbots/needs-triage.yml @@ -0,0 +1,4 @@ +# Configuration for devbots-needs-triage - https://devbots.xyz/documentation/needs-triage/ + +enabled: true +label: "needs triage" \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/documentation.md b/.github/ISSUE_TEMPLATE/documentation.md new file mode 100644 index 00000000..a0ed0b42 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation.md @@ -0,0 +1,14 @@ +--- +name: "📚 Documentation issue" +about: Suggest changes to project's documentation +title: '' +labels: 'documentation' +projects: '' +assignees: '' +--- + +**Relevant links* +Link(s) to the section(s) of documentation that are outdated or otherwise wrong + +**Description** +Description of the changes you would like to see \ No newline at end of file diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 00000000..ea6a07f2 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,47 @@ +# Configuration for probot-stale - https://github.com/probot/stale + +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 30 + +# Number of days of inactivity before a stale Issue or Pull Request is closed. +# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. +daysUntilClose: 60 + +# Issues with these labels will never be considered stale +exemptLabels: + - frozen + +# Set to true to ignore issues in a milestone (defaults to false) +exemptMilestones: true + +# Label to use when marking an issue as stale +staleLabel: stale + +issues: + # Comment to post when marking an issue as stale. Set to `false` to disable + markComment: > + This issue has been automatically marked as stale because it has not had recent activity. + It will be closed if no further activity occurs. + If this issue is still affecting you, just comment with any updates and we'll keep it open. + Thank you for your contributions. + + # Comment to post when closing a stale issue. Set to `false` to disable + closeComment: > + Closing this issue after a prolonged period of inactivity. + If this issue is still present in the latest release, please create a new issue with up-to-date information. Thank you! + +pulls: + # Comment to post when marking a pull request as stale. + markComment: > + This pull request has been automatically marked as stale because it has not had recent activity. + It will be closed if no further activity occurs. + If this pull request is still relevant, just comment with any updates and we'll keep it open. + Thank you for your contributions. + + # Comment to post when closing a stale pull request. Set to `false` to disable + closeComment: > + Closing this pull request after a prolonged period of inactivity. + If this issue is still present in the latest release, please ask for this pull request to be reopened. Thank you! + +# Limit the number of actions per hour, from 1-30. Default is 30 +limitPerRun: 30 diff --git a/.github/workflows/auto-gen-docs.yaml b/.github/workflows/auto-gen-docs.yaml index fbfd60f2..5d7462d8 100644 --- a/.github/workflows/auto-gen-docs.yaml +++ b/.github/workflows/auto-gen-docs.yaml @@ -23,18 +23,15 @@ jobs: submodules: recursive # Fetch the Docsy theme fetch-depth: 0 - # Checks out a copy of your repository on the ubuntu-latest machine + # Checks if the previous commit introduced any changes to website files - name: Check for changes run: | - if git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep -E "^website*"; then - git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep -E "^website*" - echo "IS_CHANGED=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep -E "^website*")" >> $GITHUB_ENV - else - echo "IS_CHANGED=empty" >> $GITHUB_ENV - fi + IS_CHANGED=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep -Ec "^website*" || :) + [[ $IS_CHANGED -gt 0 ]] && echo "IS_CHANGED=true" >> $GITHUB_ENV || echo "IS_CHANGED=false" >> $GITHUB_ENV + # Sets up the appropriate version of Hugo - name: Setup Hugo - if: env.IS_CHANGED != 'empty' + if: env.IS_CHANGED == 'true' uses: peaceiris/actions-hugo@v2 with: hugo-version: '0.62.2' @@ -42,14 +39,14 @@ jobs: # Sets up node - required by Hugo - name: Setup Node - if: env.IS_CHANGED != 'empty' + if: env.IS_CHANGED == 'true' uses: actions/setup-node@v1 with: node-version: '12.x' # Installs dependencies required by docsy theme - name: Install docsy dependencies - if: env.IS_CHANGED != 'empty' + if: env.IS_CHANGED == 'true' run: | cd website npm install @@ -57,17 +54,18 @@ jobs: sudo npm install -D --save autoprefixer sudo npm install -D --save postcss-cli cd ../ + # Runs makefile goal - checks changes to /website folder and generates docs - name: Run Makefile goal - if: env.IS_CHANGED != 'empty' + if: env.IS_CHANGED == 'true' env: DEFAULT_BRANCH: master GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: make generate-docs - # Create push request with generated docs + # Creates pull request with generated docs - name: Create Pull Request - if: env.IS_CHANGED != 'empty' + if: env.IS_CHANGED == 'true' uses: peter-evans/create-pull-request@v3 with: commit-message: Auto-updated docs diff --git a/Dockerfile b/Dockerfile index caaced1d..ff840ea4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,7 +19,6 @@ COPY internal/ internal/ COPY pkg/ pkg/ COPY version/ version/ COPY main.go main.go -RUN mkdir plugins/ # Build RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -ldflags "-w $CTIMEVAR" -o manager main.go @@ -30,4 +29,5 @@ FROM gcr.io/distroless/static:nonroot WORKDIR / COPY --from=builder /workspace/manager . USER 65532:65532 + ENTRYPOINT ["/manager"] diff --git a/README.md b/README.md index 5f9f3247..45d5b74f 100644 --- a/README.md +++ b/README.md @@ -64,12 +64,15 @@ Selected content: ## Community We have a dedicated channel called `#jenkins-operator` on [virtuslab-oss.slack.com](https://virtuslab-oss.slack.com) -Fill out ([Invite form](https://forms.gle/X3X8qA1XMirdBuEH7)) and come say hi ! +Fill out ([Invite form](https://forms.gle/X3X8qA1XMirdBuEH7)) and come say hi! ## Snapshots between releases We are trying our best to resolve issues quickly, but they have to wait to be released. If you can't wait for an official docker image release and acknowledge the risk, you can use our unofficial images, which are built nightly. + +You can find the project's Docker Hub repository [here](https://hub.docker.com/r/virtuslab/jenkins-operator). + Look for the images with tag "{git-hash}", where {git-hash} is the hash of the master commit that interests you. ## Contribution diff --git a/api/v1alpha2/jenkins_webhook.go b/api/v1alpha2/jenkins_webhook.go index 56750fc2..51a7e54a 100644 --- a/api/v1alpha2/jenkins_webhook.go +++ b/api/v1alpha2/jenkins_webhook.go @@ -36,9 +36,9 @@ import ( ) var ( - jenkinslog = logf.Log.WithName("jenkins-resource") // log is for logging in this package. - PluginsDataManager PluginDataManager = *NewPluginsDataManager() - _ webhook.Validator = &Jenkins{} + jenkinslog = logf.Log.WithName("jenkins-resource") // log is for logging in this package. + PluginsMgr PluginDataManager = *NewPluginsDataManager() + _ webhook.Validator = &Jenkins{} ) func (in *Jenkins) SetupWebhookWithManager(mgr ctrl.Manager) error { @@ -77,12 +77,13 @@ func (in *Jenkins) ValidateDelete() error { } type PluginDataManager struct { - pluginDataCache PluginsInfo - hosturl string - compressedFilePath string - pluginDataFile string - iscached bool - maxattempts int + PluginDataCache PluginsInfo + Hosturl string + CompressedFilePath string + PluginDataFile string + IsCached bool + Attempts int + SleepTime int } type PluginsInfo struct { @@ -114,27 +115,31 @@ type PluginData struct { // Validates security warnings for both updating and creating a Jenkins CR func Validate(r Jenkins) error { - pluginset := make(map[string]PluginData) - var faultybaseplugins string - var faultyuserplugins string + if !PluginsMgr.IsCached { + return errors.New("plugins data has not been fetched") + } + + pluginSet := make(map[string]PluginData) + var faultyBasePlugins string + var faultyUserPlugins string basePlugins := plugins.BasePlugins() for _, plugin := range basePlugins { // Only Update the map if the plugin is not present or a lower version is being used - if pluginData, ispresent := pluginset[plugin.Name]; !ispresent || semver.Compare(MakeSemanticVersion(plugin.Version), pluginData.Version) == 1 { - pluginset[plugin.Name] = PluginData{Version: plugin.Version, Kind: "base"} + if pluginData, ispresent := pluginSet[plugin.Name]; !ispresent || semver.Compare(makeSemanticVersion(plugin.Version), pluginData.Version) == 1 { + pluginSet[plugin.Name] = PluginData{Version: plugin.Version, Kind: "base"} } } for _, plugin := range r.Spec.Master.Plugins { - if pluginData, ispresent := pluginset[plugin.Name]; !ispresent || semver.Compare(MakeSemanticVersion(plugin.Version), pluginData.Version) == 1 { - pluginset[plugin.Name] = PluginData{Version: plugin.Version, Kind: "user-defined"} + if pluginData, ispresent := pluginSet[plugin.Name]; !ispresent || semver.Compare(makeSemanticVersion(plugin.Version), pluginData.Version) == 1 { + pluginSet[plugin.Name] = PluginData{Version: plugin.Version, Kind: "user-defined"} } } - for _, plugin := range PluginsDataManager.pluginDataCache.Plugins { - if pluginData, ispresent := pluginset[plugin.Name]; ispresent { - var hasvulnerabilities bool + for _, plugin := range PluginsMgr.PluginDataCache.Plugins { + if pluginData, ispresent := pluginSet[plugin.Name]; ispresent { + var hasVulnerabilities bool for _, warning := range plugin.SecurityWarnings { for _, version := range warning.Versions { firstVersion := version.FirstVersion @@ -146,29 +151,29 @@ func Validate(r Jenkins) error { lastVersion = pluginData.Version // setting default value in case of empty string } - if CompareVersions(firstVersion, lastVersion, pluginData.Version) { + if compareVersions(firstVersion, lastVersion, pluginData.Version) { jenkinslog.Info("Security Vulnerability detected in "+pluginData.Kind+" "+plugin.Name+":"+pluginData.Version, "Warning message", warning.Message, "For more details,check security advisory", warning.URL) - hasvulnerabilities = true + hasVulnerabilities = true } } } - if hasvulnerabilities { + if hasVulnerabilities { if pluginData.Kind == "base" { - faultybaseplugins += plugin.Name + ":" + pluginData.Version + "\n" + faultyBasePlugins += plugin.Name + ":" + pluginData.Version + "\n" } else { - faultyuserplugins += plugin.Name + ":" + pluginData.Version + "\n" + faultyUserPlugins += plugin.Name + ":" + pluginData.Version + "\n" } } } } - if len(faultybaseplugins) > 0 || len(faultyuserplugins) > 0 { + if len(faultyBasePlugins) > 0 || len(faultyUserPlugins) > 0 { var errormsg string - if len(faultybaseplugins) > 0 { - errormsg += "Security vulnerabilities detected in the following base plugins: \n" + faultybaseplugins + if len(faultyBasePlugins) > 0 { + errormsg += "Security vulnerabilities detected in the following base plugins: \n" + faultyBasePlugins } - if len(faultyuserplugins) > 0 { - errormsg += "Security vulnerabilities detected in the following user-defined plugins: \n" + faultyuserplugins + if len(faultyUserPlugins) > 0 { + errormsg += "Security vulnerabilities detected in the following user-defined plugins: \n" + faultyUserPlugins } return errors.New(errormsg) } @@ -178,33 +183,33 @@ func Validate(r Jenkins) error { func NewPluginsDataManager() *PluginDataManager { return &PluginDataManager{ - hosturl: "https://ci.jenkins.io/job/Infra/job/plugin-site-api/job/generate-data/lastSuccessfulBuild/artifact/plugins.json.gzip", - compressedFilePath: "/tmp/plugins.json.gzip", - pluginDataFile: "/tmp/plugins.json", - iscached: false, - maxattempts: 5, + Hosturl: "https://ci.jenkins.io/job/Infra/job/plugin-site-api/job/generate-data/lastSuccessfulBuild/artifact/plugins.json.gzip", + CompressedFilePath: "/tmp/plugins.json.gzip", + PluginDataFile: "/tmp/plugins.json", + IsCached: false, + Attempts: 0, } } -// Downloads extracts and caches the JSON data in every 12 hours -func (in *PluginDataManager) CachePluginData(ch chan bool) { +// Downloads extracts and reads the JSON data in every 12 hours +func (in *PluginDataManager) FetchPluginData(isInitialized chan bool) { for { jenkinslog.Info("Initializing/Updating the plugin data cache") - var isdownloaded, isextracted, iscached bool + var isDownloaded, isExtracted, isCached bool var err error - for i := 0; i < in.maxattempts; i++ { - err = in.Download() + for in.Attempts = 0; in.Attempts < 5; in.Attempts++ { + err = in.download() if err == nil { - isdownloaded = true + isDownloaded = true break } } - if isdownloaded { - for i := 0; i < in.maxattempts; i++ { - err = in.Extract() + if isDownloaded { + for in.Attempts = 0; in.Attempts < 5; in.Attempts++ { + err = in.extract() if err == nil { - isextracted = true + isExtracted = true break } } @@ -212,32 +217,39 @@ func (in *PluginDataManager) CachePluginData(ch chan bool) { jenkinslog.Info("Cache Plugin Data", "failed to download file", err) } - if isextracted { - for i := 0; i < in.maxattempts; i++ { - err = in.Cache() + if isExtracted { + for in.Attempts = 0; in.Attempts < 5; in.Attempts++ { + err = in.cache() if err == nil { - iscached = true + isCached = true break } } - if !iscached { + if !isCached { jenkinslog.Info("Cache Plugin Data", "failed to read plugin data file", err) } } else { jenkinslog.Info("Cache Plugin Data", "failed to extract file", err) } - if !in.iscached { - ch <- iscached + // Checks for the first time + if !in.IsCached { + isInitialized <- isCached + in.IsCached = isCached } - in.iscached = in.iscached || iscached - time.Sleep(12 * time.Hour) + + if isCached { + in.SleepTime = 12 + } else { + in.SleepTime = 1 + } + time.Sleep(time.Duration(in.SleepTime) * time.Hour) } } -func (in *PluginDataManager) Download() error { - out, err := os.Create(in.compressedFilePath) +func (in *PluginDataManager) download() error { + out, err := os.Create(in.CompressedFilePath) if err != nil { return err } @@ -247,7 +259,7 @@ func (in *PluginDataManager) Download() error { Timeout: 1000 * time.Second, } - resp, err := client.Get(in.hosturl) + resp, err := client.Get(in.Hosturl) if err != nil { return err } @@ -260,8 +272,8 @@ func (in *PluginDataManager) Download() error { return nil } -func (in *PluginDataManager) Extract() error { - reader, err := os.Open(in.compressedFilePath) +func (in *PluginDataManager) extract() error { + reader, err := os.Open(in.CompressedFilePath) if err != nil { return err @@ -273,7 +285,7 @@ func (in *PluginDataManager) Extract() error { } defer archive.Close() - writer, err := os.Create(in.pluginDataFile) + writer, err := os.Create(in.PluginDataFile) if err != nil { return err } @@ -284,8 +296,8 @@ func (in *PluginDataManager) Extract() error { } // Loads the JSON data into memory and stores it -func (in *PluginDataManager) Cache() error { - jsonFile, err := os.Open(in.pluginDataFile) +func (in *PluginDataManager) cache() error { + jsonFile, err := os.Open(in.PluginDataFile) if err != nil { return err } @@ -295,7 +307,7 @@ func (in *PluginDataManager) Cache() error { if err != nil { return err } - err = json.Unmarshal(byteValue, &in.pluginDataCache) + err = json.Unmarshal(byteValue, &in.PluginDataCache) if err != nil { return err } @@ -303,16 +315,16 @@ func (in *PluginDataManager) Cache() error { } // returns a semantic version that can be used for comparison -func MakeSemanticVersion(version string) string { +func makeSemanticVersion(version string) string { version = "v" + version return semver.Canonical(version) } // Compare if the current version lies between first version and last version -func CompareVersions(firstVersion string, lastVersion string, pluginVersion string) bool { - firstSemVer := MakeSemanticVersion(firstVersion) - lastSemVer := MakeSemanticVersion(lastVersion) - pluginSemVer := MakeSemanticVersion(pluginVersion) +func compareVersions(firstVersion string, lastVersion string, pluginVersion string) bool { + firstSemVer := makeSemanticVersion(firstVersion) + lastSemVer := makeSemanticVersion(lastVersion) + pluginSemVer := makeSemanticVersion(pluginVersion) if semver.Compare(pluginSemVer, firstSemVer) == -1 || semver.Compare(pluginSemVer, lastSemVer) == 1 { return false } diff --git a/chart/index.yaml b/chart/index.yaml index b7e1f554..0044cbeb 100644 --- a/chart/index.yaml +++ b/chart/index.yaml @@ -1,6 +1,16 @@ apiVersion: v1 entries: jenkins-operator: + - apiVersion: v2 + appVersion: 0.6.0 + created: "2021-06-11T13:50:32.677639006+02:00" + description: Kubernetes native operator which fully manages Jenkins on Kubernetes + digest: 48fbf15c3ffff7003623edcde0bec39dc37d0a62303f08066960d5fac799af90 + icon: https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/assets/jenkins-operator-icon.png + name: jenkins-operator + urls: + - https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/chart/jenkins-operator/jenkins-operator-0.5.2.tgz + version: 0.5.2 - apiVersion: v2 appVersion: 0.6.0 created: "2021-06-11T13:50:32.677639006+02:00" diff --git a/chart/jenkins-operator/Chart.yaml b/chart/jenkins-operator/Chart.yaml index 9d8c137d..d90d312a 100644 --- a/chart/jenkins-operator/Chart.yaml +++ b/chart/jenkins-operator/Chart.yaml @@ -2,5 +2,5 @@ apiVersion: v2 appVersion: "0.6.0" description: Kubernetes native operator which fully manages Jenkins on Kubernetes name: jenkins-operator -version: 0.5.1 +version: 0.5.2 icon: https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/assets/jenkins-operator-icon.png diff --git a/chart/jenkins-operator/jenkins-operator-0.5.2.tgz b/chart/jenkins-operator/jenkins-operator-0.5.2.tgz new file mode 100644 index 00000000..c2f1afe9 Binary files /dev/null and b/chart/jenkins-operator/jenkins-operator-0.5.2.tgz differ diff --git a/chart/jenkins-operator/templates/jenkins.yaml b/chart/jenkins-operator/templates/jenkins.yaml index 62451e5f..9ba138b0 100644 --- a/chart/jenkins-operator/templates/jenkins.yaml +++ b/chart/jenkins-operator/templates/jenkins.yaml @@ -100,8 +100,6 @@ spec: {{- end }} {{- if .Values.jenkins.priorityClassName }} priorityClassName: {{- .Values.jenkins.priorityClassName }} - {{- else }} - priorityClassName: "" {{- end }} disableCSRFProtection: {{ .Values.jenkins.disableCSRFProtection }} containers: diff --git a/chart/jenkins-operator/values.yaml b/chart/jenkins-operator/values.yaml index a9597377..3a86f717 100644 --- a/chart/jenkins-operator/values.yaml +++ b/chart/jenkins-operator/values.yaml @@ -124,6 +124,9 @@ jenkins: claimName: jenkins-backup # volumeMounts are mounts for Jenkins pod + # Note that attempting to overwrite default mount settings for restricted, + # non-configurable volumeMounts will result in Operator error + # See https://jenkinsci.github.io/kubernetes-operator/docs/installation/#note-on-restricted-jenkins-controller-pod-volumemounts for details volumeMounts: [] # defines authorization strategy of the operator for the Jenkins API diff --git a/docs/docs/developer-guide/index.html b/docs/docs/developer-guide/index.html index e0da64c1..36bfcc7d 100644 --- a/docs/docs/developer-guide/index.html +++ b/docs/docs/developer-guide/index.html @@ -26,7 +26,7 @@ " /> - + @@ -765,6 +765,7 @@
  • Build and run with a minikube
  • Build and run with a remote Kubernetes cluster
  • Testing @@ -996,6 +997,12 @@ jenkins-jenkins-example 1/1 Running 0 21m

    Debug Jenkins Operator

    make run OPERATOR_EXTRA_ARGS="--debug"
    +

    Stop or delete minikube cluster

    + +

    To stop Kubernetes cluster running locally on minikube:

    +
    minikube stop
    +

    To delete the cluster altogether:

    +
    minikube delete

    Build and run with a remote Kubernetes cluster

    You can also run the controller locally and make it listen to a remote Kubernetes server.

    @@ -1038,6 +1045,8 @@ kubectl get secret jenkins-operator-credentials-<cr_name> -o Operator Framework Training By OpenShift

  • + +
  • Operator SDK Tutorial for Go

  • @@ -1204,7 +1213,7 @@ kubectl get secret jenkins-operator-credentials-<cr_name> -o Last modified June 10, 2021 +
    Last modified July 30, 2021
    diff --git a/docs/docs/developer-guide/index.xml b/docs/docs/developer-guide/index.xml index b74e891c..e3f7f7e4 100644 --- a/docs/docs/developer-guide/index.xml +++ b/docs/docs/developer-guide/index.xml @@ -4,7 +4,7 @@ https://jenkinsci.github.io/kubernetes-operator/docs/developer-guide/ Recent Hugo news from gohugo.io Hugo -- gohugo.io - Thu, 10 Jun 2021 00:00:00 +0000 + Fri, 30 Jul 2021 00:00:00 +0000 https://jenkinsci.github.io/kubernetes-operator/img/hugo.png GoHugo.io diff --git a/docs/docs/getting-started/latest/configuration/index.html b/docs/docs/getting-started/latest/configuration/index.html index 76ca0185..7c32819e 100644 --- a/docs/docs/getting-started/latest/configuration/index.html +++ b/docs/docs/getting-started/latest/configuration/index.html @@ -969,7 +969,7 @@ spec: targets: "cicd/jobs/*.jenkins" description: "Jenkins Operator repository" repositoryBranch: master - repositoryUrl: ssh://git@github.com:jenkinsci/kubernetes-operator.git + repositoryUrl: git@github.com:jenkinsci/kubernetes-operator.git

    and create a Kubernetes Secret (name of secret should be the same from credentialID field):

    apiVersion: v1
     kind: Secret
    diff --git a/docs/docs/getting-started/latest/configure-backup-and-restore/index.html b/docs/docs/getting-started/latest/configure-backup-and-restore/index.html
    index 5896f09f..533f99dc 100644
    --- a/docs/docs/getting-started/latest/configure-backup-and-restore/index.html
    +++ b/docs/docs/getting-started/latest/configure-backup-and-restore/index.html
    @@ -32,7 +32,7 @@
     ">
     
     
    -
    +
     
     
     
    @@ -833,6 +833,12 @@
     	
    Prevent loss of job history
    +
    +

    Because of Jenkins Operator’s architecture, the configuration of Jenkins should be done using ConfigurationAsCode +or GroovyScripts and jobs should be defined as SeedJobs. It means that there is no point in backing up any job configuration +up. Therefore, the backup script makes a copy of jobs history only.

    +
    +

    Backup and restore is done by a container sidecar.

    PVC

    @@ -895,7 +901,7 @@ getLatestAction: exec: command: - - /home/user/bin/get-latest.sh # this command is invoked on "backup" container to get last backup number before pod deletion. If you don't omit it in CR, you can lose data + - /home/user/bin/get-latest.sh # this command is invoked on "backup" container to get last backup number before pod deletion; not having it in the CR may cause loss of data interval: 30 # how often make backup in seconds makeBackupBeforePodDeletion: true # make a backup before pod deletion restore: diff --git a/docs/docs/getting-started/latest/customization/index.html b/docs/docs/getting-started/latest/customization/index.html index fe753ac7..0c25e573 100644 --- a/docs/docs/getting-started/latest/customization/index.html +++ b/docs/docs/getting-started/latest/customization/index.html @@ -32,7 +32,7 @@ "> - + @@ -840,14 +840,17 @@ Plugin’s configuration is applied as groovy scripts or the configuration as code plugin. Any plugin working for Jenkins can be installed by the Jenkins Operator.

    -

    Pre-installed plugins: -* configuration-as-code v1.47 -* git v4.5.0 -* job-dsl v1.77 -* kubernetes-credentials-provider v0.15 -* kubernetes v1.29.0 -* workflow-aggregator v2.6 -* workflow-job v2.40

    +

    Pre-installed plugins:

    + +
      +
    • configuration-as-code v1.51
    • +
    • git v4.7.2
    • +
    • job-dsl v1.77
    • +
    • kubernetes-credentials-provider v0.18-1
    • +
    • kubernetes v1.30.0
    • +
    • workflow-aggregator v2.6
    • +
    • workflow-job v2.41
    • +

    Rest of the plugins can be found in plugins repository.

    @@ -872,19 +875,19 @@ Any plugin working for Jenkins can be installed by the Jenkins Operator.

    master: basePlugins: - name: kubernetes - version: "1.28.6" + version: "1.30.0" - name: workflow-job version: "2.40" - name: workflow-aggregator version: "2.6" - name: git - version: "4.5.0" + version: "4.7.2" - name: job-dsl version: "1.77" - name: configuration-as-code - version: "1.46" + version: "1.51" - name: kubernetes-credentials-provider - version: "0.15"
    + version: "0.18-1"

    You can change their versions.

    The Jenkins Operator will then automatically install plugins after the Jenkins master pod restart.

    diff --git a/docs/docs/getting-started/latest/index.html b/docs/docs/getting-started/latest/index.html index 1313be6d..f4c052fe 100644 --- a/docs/docs/getting-started/latest/index.html +++ b/docs/docs/getting-started/latest/index.html @@ -822,6 +822,8 @@
    + +
    Deploy Jenkins @@ -844,8 +846,6 @@ - -
    Configuration diff --git a/docs/docs/getting-started/latest/index.xml b/docs/docs/getting-started/latest/index.xml index df8de64a..0b4fccb1 100644 --- a/docs/docs/getting-started/latest/index.xml +++ b/docs/docs/getting-started/latest/index.xml @@ -240,7 +240,7 @@ spec: targets: "cicd/jobs/*.jenkins" description: "Jenkins Operator repository" repositoryBranch: master - repositoryUrl: ssh://git@github.com:jenkinsci/kubernetes-operator.git</code></pre> + repositoryUrl: git@github.com:jenkinsci/kubernetes-operator.git</code></pre> <p>and create a Kubernetes Secret (name of secret should be the same from <code>credentialID</code> field):</p> <pre><code>apiVersion: v1 kind: Secret @@ -403,14 +403,17 @@ stringData: Plugin&rsquo;s configuration is applied as groovy scripts or the <a href="https://github.com/jenkinsci/configuration-as-code-plugin">configuration as code plugin</a>. Any plugin working for Jenkins can be installed by the Jenkins Operator.</p> -<p>Pre-installed plugins: -* configuration-as-code v1.47 -* git v4.5.0 -* job-dsl v1.77 -* kubernetes-credentials-provider v0.15 -* kubernetes v1.29.0 -* workflow-aggregator v2.6 -* workflow-job v2.40</p> +<p>Pre-installed plugins:</p> + +<ul> +<li>configuration-as-code v1.51</li> +<li>git v4.7.2</li> +<li>job-dsl v1.77</li> +<li>kubernetes-credentials-provider v0.18-1</li> +<li>kubernetes v1.30.0</li> +<li>workflow-aggregator v2.6</li> +<li>workflow-job v2.41</li> +</ul> <p>Rest of the plugins can be found in <a href="https://plugins.jenkins.io/">plugins repository</a>.</p> @@ -435,19 +438,19 @@ Any plugin working for Jenkins can be installed by the Jenkins Operator.</p&g </span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>basePlugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes<span style="color:#f8f8f8;text-decoration:underline"> -</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.28.6&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.30.0&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-job<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.40&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-aggregator<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.6&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>git<span style="color:#f8f8f8;text-decoration:underline"> -</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;4.5.0&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;4.7.2&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>job-dsl<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.77&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code<span style="color:#f8f8f8;text-decoration:underline"> -</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.46&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.51&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes-credentials-provider<span style="color:#f8f8f8;text-decoration:underline"> -</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;0.15&#34;</span></code></pre></div> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;0.18-1&#34;</span></code></pre></div> <p>You can change their versions.</p> <p>The <strong>Jenkins Operator</strong> will then automatically install plugins after the Jenkins master pod restart.</p> @@ -576,6 +579,12 @@ The secrets are loaded to <code>secrets</code> map.</p> +<blockquote> +<p>Because of Jenkins Operator&rsquo;s architecture, the configuration of Jenkins should be done using ConfigurationAsCode +or GroovyScripts and jobs should be defined as SeedJobs. It means that there is no point in backing up any job configuration +up. Therefore, the backup script makes a copy of jobs history only.</p> +</blockquote> + <p>Backup and restore is done by a container sidecar.</p> <h3 id="pvc">PVC</h3> @@ -638,7 +647,7 @@ The secrets are loaded to <code>secrets</code> map.</p> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>getLatestAction<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>exec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> -</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/get-latest.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to get last backup number before pod deletion. If you don&#39;t omit it in CR, you can lose data</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/get-latest.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to get last backup number before pod deletion; not having it in the CR may cause loss of data</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>interval<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># how often make backup in seconds</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>makeBackupBeforePodDeletion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#204a87;font-weight:bold">true</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># make a backup before pod deletion</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>restore<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> @@ -1670,7 +1679,12 @@ Values defined by an Env with a duplicate key will take precedence.</p> </td> <td> <em>(Optional)</em> -<p>Pod volumes to mount into the container&rsquo;s filesystem.</p> +<p> +Pod volumes to mount into the container&rsquo;s filesystem. More info: +<a href="https://jenkinsci.github.io/kubernetes-operator/docs/installation/#note-on-restricted-jenkins-controller-pod-volumemounts"> +https://jenkinsci.github.io/kubernetes-operator/docs/installation/#note-on-restricted-jenkins-controller-pod-volumemounts +</a> +</p> </td> </tr> <tr> diff --git a/docs/docs/getting-started/latest/schema/index.html b/docs/docs/getting-started/latest/schema/index.html index 59ee07c2..f31e941d 100644 --- a/docs/docs/getting-started/latest/schema/index.html +++ b/docs/docs/getting-started/latest/schema/index.html @@ -32,7 +32,7 @@ "> - + @@ -1471,7 +1471,12 @@ Values defined by an Env with a duplicate key will take precedence.

    (Optional) -

    Pod volumes to mount into the container’s filesystem.

    +

    +Pod volumes to mount into the container’s filesystem. More info: + +https://jenkinsci.github.io/kubernetes-operator/docs/installation/#note-on-restricted-jenkins-controller-pod-volumemounts + +

    diff --git a/docs/docs/getting-started/v0.5.x/configure-backup-and-restore/index.html b/docs/docs/getting-started/v0.5.x/configure-backup-and-restore/index.html index 887b5332..e502cde5 100644 --- a/docs/docs/getting-started/v0.5.x/configure-backup-and-restore/index.html +++ b/docs/docs/getting-started/v0.5.x/configure-backup-and-restore/index.html @@ -903,7 +903,7 @@ getLatestAction: exec: command: - - /home/user/bin/get-latest.sh # this command is invoked on "backup" container to get last backup number before pod deletion. If you don't omit it in CR, you can lose data + - /home/user/bin/get-latest.sh # this command is invoked on "backup" container to get last backup number before pod deletion; not having it in the CR may cause loss of data #recoveryOnce: <backup_number> # if want to restore specific backup configure this field and then Jenkins will be restarted and desired backup will be restored
    diff --git a/docs/docs/getting-started/v0.5.x/index.html b/docs/docs/getting-started/v0.5.x/index.html index 1d17315c..bed9ab63 100644 --- a/docs/docs/getting-started/v0.5.x/index.html +++ b/docs/docs/getting-started/v0.5.x/index.html @@ -824,6 +824,8 @@ + +
    Deploy Jenkins @@ -846,8 +848,6 @@ - -
    Configuration diff --git a/docs/docs/getting-started/v0.5.x/index.xml b/docs/docs/getting-started/v0.5.x/index.xml index 1ede18bb..93894a88 100644 --- a/docs/docs/getting-started/v0.5.x/index.xml +++ b/docs/docs/getting-started/v0.5.x/index.xml @@ -634,7 +634,7 @@ The secrets are loaded to <code>secrets</code> map.</p> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>getLatestAction<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>exec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> -</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/get-latest.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to get last backup number before pod deletion. If you don&#39;t omit it in CR, you can lose data</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/get-latest.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to get last backup number before pod deletion; not having it in the CR may cause loss of data</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">#recoveryOnce: &lt;backup_number&gt; # if want to restore specific backup configure this field and then Jenkins will be restarted and desired backup will be restored</span></code></pre></div> diff --git a/docs/docs/index.html b/docs/docs/index.html index 001c8b57..c8d69c8e 100644 --- a/docs/docs/index.html +++ b/docs/docs/index.html @@ -789,10 +789,6 @@
    - - - -
    Installation @@ -832,6 +828,10 @@ + + + + diff --git a/docs/docs/index.xml b/docs/docs/index.xml index 6074c840..5f1c71cc 100644 --- a/docs/docs/index.xml +++ b/docs/docs/index.xml @@ -651,7 +651,7 @@ spec: targets: "cicd/jobs/*.jenkins" description: "Jenkins Operator repository" repositoryBranch: master - repositoryUrl: ssh://git@github.com:jenkinsci/kubernetes-operator.git</code></pre> + repositoryUrl: git@github.com:jenkinsci/kubernetes-operator.git</code></pre> <p>and create a Kubernetes Secret (name of secret should be the same from <code>credentialID</code> field):</p> <pre><code>apiVersion: v1 kind: Secret @@ -2167,14 +2167,17 @@ stringData: Plugin&rsquo;s configuration is applied as groovy scripts or the <a href="https://github.com/jenkinsci/configuration-as-code-plugin">configuration as code plugin</a>. Any plugin working for Jenkins can be installed by the Jenkins Operator.</p> -<p>Pre-installed plugins: -* configuration-as-code v1.47 -* git v4.5.0 -* job-dsl v1.77 -* kubernetes-credentials-provider v0.15 -* kubernetes v1.29.0 -* workflow-aggregator v2.6 -* workflow-job v2.40</p> +<p>Pre-installed plugins:</p> + +<ul> +<li>configuration-as-code v1.51</li> +<li>git v4.7.2</li> +<li>job-dsl v1.77</li> +<li>kubernetes-credentials-provider v0.18-1</li> +<li>kubernetes v1.30.0</li> +<li>workflow-aggregator v2.6</li> +<li>workflow-job v2.41</li> +</ul> <p>Rest of the plugins can be found in <a href="https://plugins.jenkins.io/">plugins repository</a>.</p> @@ -2199,19 +2202,19 @@ Any plugin working for Jenkins can be installed by the Jenkins Operator.</p&g </span><span style="color:#f8f8f8;text-decoration:underline"> </span>master<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>basePlugins<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes<span style="color:#f8f8f8;text-decoration:underline"> -</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.28.6&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.30.0&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-job<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.40&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>workflow-aggregator<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;2.6&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>git<span style="color:#f8f8f8;text-decoration:underline"> -</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;4.5.0&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;4.7.2&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>job-dsl<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.77&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>configuration-as-code<span style="color:#f8f8f8;text-decoration:underline"> -</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.46&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;1.51&#34;</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>name<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span>kubernetes-credentials-provider<span style="color:#f8f8f8;text-decoration:underline"> -</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;0.15&#34;</span></code></pre></div> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>version<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#4e9a06">&#34;0.18-1&#34;</span></code></pre></div> <p>You can change their versions.</p> <p>The <strong>Jenkins Operator</strong> will then automatically install plugins after the Jenkins master pod restart.</p> @@ -3123,6 +3126,12 @@ spec: +<blockquote> +<p>Because of Jenkins Operator&rsquo;s architecture, the configuration of Jenkins should be done using ConfigurationAsCode +or GroovyScripts and jobs should be defined as SeedJobs. It means that there is no point in backing up any job configuration +up. Therefore, the backup script makes a copy of jobs history only.</p> +</blockquote> + <p>Backup and restore is done by a container sidecar.</p> <h3 id="pvc">PVC</h3> @@ -3185,7 +3194,7 @@ spec: </span><span style="color:#f8f8f8;text-decoration:underline"> </span>getLatestAction<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>exec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> -</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/get-latest.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to get last backup number before pod deletion. If you don&#39;t omit it in CR, you can lose data</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/get-latest.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to get last backup number before pod deletion; not having it in the CR may cause loss of data</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>interval<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#0000cf;font-weight:bold">30</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># how often make backup in seconds</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>makeBackupBeforePodDeletion<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#204a87;font-weight:bold">true</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># make a backup before pod deletion</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>restore<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> @@ -3279,7 +3288,7 @@ spec: </span><span style="color:#f8f8f8;text-decoration:underline"> </span>getLatestAction<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>exec<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span>command<span style="color:#000;font-weight:bold">:</span><span style="color:#f8f8f8;text-decoration:underline"> -</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/get-latest.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to get last backup number before pod deletion. If you don&#39;t omit it in CR, you can lose data</span><span style="color:#f8f8f8;text-decoration:underline"> +</span><span style="color:#f8f8f8;text-decoration:underline"> </span>-<span style="color:#f8f8f8;text-decoration:underline"> </span>/home/user/bin/get-latest.sh<span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic"># this command is invoked on &#34;backup&#34; container to get last backup number before pod deletion; not having it in the CR may cause loss of data</span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#f8f8f8;text-decoration:underline"> </span><span style="color:#8f5902;font-style:italic">#recoveryOnce: &lt;backup_number&gt; # if want to restore specific backup configure this field and then Jenkins will be restarted and desired backup will be restored</span></code></pre></div> @@ -6185,7 +6194,12 @@ Values defined by an Env with a duplicate key will take precedence.</p> </td> <td> <em>(Optional)</em> -<p>Pod volumes to mount into the container&rsquo;s filesystem.</p> +<p> +Pod volumes to mount into the container&rsquo;s filesystem. More info: +<a href="https://jenkinsci.github.io/kubernetes-operator/docs/installation/#note-on-restricted-jenkins-controller-pod-volumemounts"> +https://jenkinsci.github.io/kubernetes-operator/docs/installation/#note-on-restricted-jenkins-controller-pod-volumemounts +</a> +</p> </td> </tr> <tr> diff --git a/docs/docs/installation/index.html b/docs/docs/installation/index.html index eb637236..728a3edb 100644 --- a/docs/docs/installation/index.html +++ b/docs/docs/installation/index.html @@ -26,7 +26,7 @@ " /> - + @@ -766,6 +766,8 @@ +
  • Note on Operator’s nightly built images
  • +
  • Note on restricted Jenkins controller pod volumeMounts
  • @@ -808,18 +810,21 @@

    This document describes installation procedure for Jenkins Operator. -All container images can be found at virtuslab/jenkins-operator

    +All container images can be found at virtuslab/jenkins-operator Docker Hub repository.

    Requirements

    -

    To run Jenkins Operator, you will need: -- access to a Kubernetes cluster version 1.17+ -- kubectl version 1.17+

    +

    To run Jenkins Operator, you will need:

    -

    Listed below are the two ways to deploy Jenkins Operator. For details on how to customize your Jenkins instance, refer to Getting Started

    +
      +
    • access to a Kubernetes cluster version 1.17+
    • +
    • kubectl version 1.17+
    • +
    + +

    Listed below are the two ways to deploy Jenkins Operator. For details on how to customize your Jenkins instance, refer to Getting Started.

    Deploy Jenkins Operator using YAML’s

    @@ -1649,6 +1654,32 @@ Example:

    +

    Note on Operator’s nightly built images

    + +

    If you wish to use the newest, not yet released version of the Operator, you can use one of nightly built snapshot images, however the maintainers of this project cannot guarantee their stability.

    + +

    You can find nightly built images by heading to virtuslab/jenkins-operator Docker Hub repository and looking for images with tag in the form of “{git-hash}”, {git-hash} being the hash of master branch commit that you want to use snapshot of.

    + +

    Note on restricted Jenkins controller pod volumeMounts

    + +

    Current design of the Operator puts an emphasis on creating a full GitOps flow of work for Jenkins users. +One of the key points of this design is maintaining an immutable state of Jenkins.

    + +

    One of the prerequisites of this is an ephemeral Jenkins home directory. To achieve that, Operator mounts emptyDir Volume +(jenkins-home) as Jenkins home directory. +It is not possible to overwrite volumeMount and specify any other Volume for Jenkins home directory, +as attempting to do so will result in Operator error.

    + +

    jenkins-home is not the only Jenkins controller pod volumeMount that is non-configurable and managed by Operator, +below is the full list of those volumeMounts:

    + +
      +
    • jenkins-home
    • +
    • scripts
    • +
    • init-configuration
    • +
    • operator-credentials
    • +
    +
    @@ -1805,7 +1836,7 @@ Example:
    -
    Last modified October 5, 2020 +
    Last modified July 30, 2021
    diff --git a/docs/docs/installation/index.xml b/docs/docs/installation/index.xml index 9bc06edf..37e38d05 100644 --- a/docs/docs/installation/index.xml +++ b/docs/docs/installation/index.xml @@ -4,7 +4,7 @@ https://jenkinsci.github.io/kubernetes-operator/docs/installation/ Recent Hugo news from gohugo.io Hugo -- gohugo.io - Mon, 05 Oct 2020 00:00:00 +0000 + Fri, 30 Jul 2021 00:00:00 +0000 https://jenkinsci.github.io/kubernetes-operator/img/hugo.png GoHugo.io diff --git a/docs/sitemap.xml b/docs/sitemap.xml index efa05ade..b751f91f 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -2,6 +2,11 @@ + + https://jenkinsci.github.io/kubernetes-operator/docs/installation/ + 2021-07-30T00:00:00+00:00 + + https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/latest/deploy-jenkins/ 2021-01-25T00:00:00+00:00 @@ -12,11 +17,6 @@ 2021-01-25T00:00:00+00:00 - - https://jenkinsci.github.io/kubernetes-operator/docs/installation/ - 2020-10-05T00:00:00+00:00 - - https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/v0.4.x/deploy-jenkins/ 2020-04-13T00:00:00+00:00 @@ -369,7 +369,7 @@ https://jenkinsci.github.io/kubernetes-operator/docs/developer-guide/ - 2021-06-10T00:00:00+00:00 + 2021-07-30T00:00:00+00:00 diff --git a/main.go b/main.go index 936862f1..543edad1 100644 --- a/main.go +++ b/main.go @@ -112,11 +112,11 @@ func main() { logger.Info(fmt.Sprintf("Watch namespace: %v", namespace)) if ValidateSecurityWarnings { - ispluginsdatainitialized := make(chan bool) - go v1alpha2.PluginsDataManager.CachePluginData(ispluginsdatainitialized) + isInitialized := make(chan bool) + go v1alpha2.PluginsMgr.FetchPluginData(isInitialized) - if !<-ispluginsdatainitialized { - fatal(errors.New("Unable to get the plugins data"), *debug) + if !<-isInitialized { + logger.Info("Unable to get the plugins data") } } diff --git a/pkg/configuration/user/seedjobs/seedjobs.go b/pkg/configuration/user/seedjobs/seedjobs.go index cb9b3725..96d1df75 100644 --- a/pkg/configuration/user/seedjobs/seedjobs.go +++ b/pkg/configuration/user/seedjobs/seedjobs.go @@ -80,6 +80,7 @@ import hudson.plugins.git.BranchSpec; import hudson.plugins.git.GitSCM; import hudson.plugins.git.SubmoduleConfig; import hudson.plugins.git.extensions.impl.CloneOption; +import hudson.plugins.git.extensions.impl.GitLFSPull; import javaposse.jobdsl.plugin.ExecuteDslScripts; import javaposse.jobdsl.plugin.LookupStrategy; import javaposse.jobdsl.plugin.RemovedJobAction; @@ -93,7 +94,10 @@ def jobDslSeedName = "{{ .ID }}-{{ .SeedJobSuffix }}"; def jobRef = jenkins.getItem(jobDslSeedName) def repoList = GitSCM.createRepoList("{{ .RepositoryURL }}", "{{ .CredentialID }}") -def gitExtensions = [new CloneOption(true, true, ";", 10)] +def gitExtensions = [ + new CloneOption(true, true, ";", 10), + new GitLFSPull() +] def scm = new GitSCM( repoList, newArrayList(new BranchSpec("{{ .RepositoryBranch }}")), @@ -438,7 +442,7 @@ func agentDeployment(jenkins *v1alpha2.Jenkins, namespace string, agentName stri Containers: []corev1.Container{ { Name: "jnlp", - Image: "jenkins/inbound-agent:alpine", + Image: "jenkins/inbound-agent:4.9-1", Env: []corev1.EnvVar{ { Name: "JENKINS_TUNNEL", diff --git a/website/content/en/docs/Developer Guide/_index.md b/website/content/en/docs/Developer Guide/_index.md index b5c82a7c..2753f3fb 100644 --- a/website/content/en/docs/Developer Guide/_index.md +++ b/website/content/en/docs/Developer Guide/_index.md @@ -2,7 +2,7 @@ title: "Developer Guide" linkTitle: "Developer Guide" weight: 60 -date: 2021-06-10 +date: 2021-07-30 description: > Jenkins Operator for developers --- @@ -211,6 +211,16 @@ seed-job-agent-jenkins-example-758cc7cc5c-82hbl 1/1 Running 0 make run OPERATOR_EXTRA_ARGS="--debug" ``` +### Stop or delete minikube cluster +To stop Kubernetes cluster running locally on minikube: +```bash +minikube stop +``` +To delete the cluster altogether: +```bash +minikube delete +``` + ## Build and run with a remote Kubernetes cluster You can also run the controller locally and make it listen to a remote Kubernetes server. @@ -282,6 +292,18 @@ kubectl get secret jenkins-operator-credentials- -o 'jsonpath={.data.us kubectl get secret jenkins-operator-credentials- -o 'jsonpath={.data.password}' | base64 -d ``` + + + +## Self-learning + +* [Tutorial: Deep Dive into the Operator Framework for... Melvin Hillsman, Michael Hrivnak, & Matt Dorn +](https://www.youtube.com/watch?v=8_DaCcRMp5I) + +* [Operator Framework Training By OpenShift](https://www.katacoda.com/openshift/courses/operatorframework) + +* [Operator SDK Tutorial for Go](https://sdk.operatorframework.io/docs/building-operators/golang/tutorial/) + [dep_tool]:https://golang.github.io/dep/docs/installation.html [git_tool]:https://git-scm.com/downloads [go_tool]:https://golang.org/dl/ @@ -293,9 +315,3 @@ kubectl get secret jenkins-operator-credentials- -o 'jsonpath={.data.pa [virtualbox]:https://www.virtualbox.org/wiki/Downloads [install_dev_tools]:https://jenkinsci.github.io/kubernetes-operator/docs/developer-guide/tools/ -## Self-learning - -* [Tutorial: Deep Dive into the Operator Framework for... Melvin Hillsman, Michael Hrivnak, & Matt Dorn -](https://www.youtube.com/watch?v=8_DaCcRMp5I) - -* [Operator Framework Training By OpenShift](https://www.katacoda.com/openshift/courses/operatorframework) diff --git a/website/content/en/docs/Getting Started/latest/configuration.md b/website/content/en/docs/Getting Started/latest/configuration.md index f3c4b8a7..e543e544 100644 --- a/website/content/en/docs/Getting Started/latest/configuration.md +++ b/website/content/en/docs/Getting Started/latest/configuration.md @@ -163,7 +163,7 @@ spec: targets: "cicd/jobs/*.jenkins" description: "Jenkins Operator repository" repositoryBranch: master - repositoryUrl: ssh://git@github.com:jenkinsci/kubernetes-operator.git + repositoryUrl: git@github.com:jenkinsci/kubernetes-operator.git ``` and create a Kubernetes Secret (name of secret should be the same from `credentialID` field): diff --git a/website/content/en/docs/Getting Started/latest/configure-backup-and-restore.md b/website/content/en/docs/Getting Started/latest/configure-backup-and-restore.md index d4df095c..fbc5bccc 100644 --- a/website/content/en/docs/Getting Started/latest/configure-backup-and-restore.md +++ b/website/content/en/docs/Getting Started/latest/configure-backup-and-restore.md @@ -7,6 +7,10 @@ description: > Prevent loss of job history --- +> Because of Jenkins Operator's architecture, the configuration of Jenkins should be done using ConfigurationAsCode +> or GroovyScripts and jobs should be defined as SeedJobs. It means that there is no point in backing up any job configuration +> up. Therefore, the backup script makes a copy of jobs history only. + Backup and restore is done by a container sidecar. ### PVC @@ -77,7 +81,7 @@ spec: getLatestAction: exec: command: - - /home/user/bin/get-latest.sh # this command is invoked on "backup" container to get last backup number before pod deletion. If you don't omit it in CR, you can lose data + - /home/user/bin/get-latest.sh # this command is invoked on "backup" container to get last backup number before pod deletion; not having it in the CR may cause loss of data interval: 30 # how often make backup in seconds makeBackupBeforePodDeletion: true # make a backup before pod deletion restore: diff --git a/website/content/en/docs/Getting Started/latest/customization.md b/website/content/en/docs/Getting Started/latest/customization.md index 76b12e10..167c556f 100644 --- a/website/content/en/docs/Getting Started/latest/customization.md +++ b/website/content/en/docs/Getting Started/latest/customization.md @@ -13,13 +13,14 @@ Plugin's configuration is applied as groovy scripts or the [configuration as cod Any plugin working for Jenkins can be installed by the Jenkins Operator. Pre-installed plugins: -* configuration-as-code v1.47 -* git v4.5.0 + +* configuration-as-code v1.51 +* git v4.7.2 * job-dsl v1.77 -* kubernetes-credentials-provider v0.15 -* kubernetes v1.29.0 +* kubernetes-credentials-provider v0.18-1 +* kubernetes v1.30.0 * workflow-aggregator v2.6 -* workflow-job v2.40 +* workflow-job v2.41 Rest of the plugins can be found in [plugins repository](https://plugins.jenkins.io/). @@ -51,19 +52,19 @@ spec: master: basePlugins: - name: kubernetes - version: "1.28.6" + version: "1.30.0" - name: workflow-job version: "2.40" - name: workflow-aggregator version: "2.6" - name: git - version: "4.5.0" + version: "4.7.2" - name: job-dsl version: "1.77" - name: configuration-as-code - version: "1.46" + version: "1.51" - name: kubernetes-credentials-provider - version: "0.15" + version: "0.18-1" ``` You can change their versions. diff --git a/website/content/en/docs/Getting Started/latest/schema.md b/website/content/en/docs/Getting Started/latest/schema.md index 2a1444c7..58638cbd 100644 --- a/website/content/en/docs/Getting Started/latest/schema.md +++ b/website/content/en/docs/Getting Started/latest/schema.md @@ -661,7 +661,12 @@ Values defined by an Env with a duplicate key will take precedence.

    (Optional) -

    Pod volumes to mount into the container’s filesystem.

    +

    +Pod volumes to mount into the container’s filesystem. More info: + +https://jenkinsci.github.io/kubernetes-operator/docs/installation/#note-on-restricted-jenkins-controller-pod-volumemounts + +

    diff --git a/website/content/en/docs/Getting Started/v0.5.x/configure-backup-and-restore.md b/website/content/en/docs/Getting Started/v0.5.x/configure-backup-and-restore.md index 08033892..0a079cba 100644 --- a/website/content/en/docs/Getting Started/v0.5.x/configure-backup-and-restore.md +++ b/website/content/en/docs/Getting Started/v0.5.x/configure-backup-and-restore.md @@ -85,6 +85,6 @@ spec: getLatestAction: exec: command: - - /home/user/bin/get-latest.sh # this command is invoked on "backup" container to get last backup number before pod deletion. If you don't omit it in CR, you can lose data + - /home/user/bin/get-latest.sh # this command is invoked on "backup" container to get last backup number before pod deletion; not having it in the CR may cause loss of data #recoveryOnce: # if want to restore specific backup configure this field and then Jenkins will be restarted and desired backup will be restored ``` diff --git a/website/content/en/docs/Installation/_index.md b/website/content/en/docs/Installation/_index.md index 6d4d8d27..17b8df64 100644 --- a/website/content/en/docs/Installation/_index.md +++ b/website/content/en/docs/Installation/_index.md @@ -2,24 +2,25 @@ title: "Installation" linkTitle: "Installation" weight: 1 -date: 2020-10-05 +date: 2021-07-30 description: > How to install Jenkins Operator --- {{% pageinfo %}} This document describes installation procedure for **Jenkins Operator**. -All container images can be found at [virtuslab/jenkins-operator](https://hub.docker.com/r/virtuslab/jenkins-operator) +All container images can be found at [virtuslab/jenkins-operator](https://hub.docker.com/r/virtuslab/jenkins-operator) Docker Hub repository. {{% /pageinfo %}} ## Requirements To run **Jenkins Operator**, you will need: + - access to a Kubernetes cluster version `1.17+` - `kubectl` version `1.17+` -Listed below are the two ways to deploy Jenkins Operator. For details on how to customize your Jenkins instance, refer to [Getting Started](/kubernetes-operator/docs/installation/) +Listed below are the two ways to deploy Jenkins Operator. For details on how to customize your Jenkins instance, refer to [Getting Started](/kubernetes-operator/docs/installation/). ## Deploy Jenkins Operator using YAML's @@ -877,3 +878,24 @@ Example:
    +## Note on Operator's nightly built images +If you wish to use the newest, not yet released version of the Operator, you can use one of nightly built snapshot images, however the maintainers of this project cannot guarantee their stability. + +You can find nightly built images by heading to [virtuslab/jenkins-operator](https://hub.docker.com/r/virtuslab/jenkins-operator) Docker Hub repository and looking for images with tag in the form of "{git-hash}", {git-hash} being the hash of master branch commit that you want to use snapshot of. + +## Note on restricted Jenkins controller pod volumeMounts +Current design of the Operator puts an emphasis on creating a full GitOps flow of work for Jenkins users. +One of the key points of this design is maintaining an immutable state of Jenkins. + +One of the prerequisites of this is an ephemeral Jenkins home directory. To achieve that, Operator mounts emptyDir Volume +(jenkins-home) as Jenkins home directory. +It is not possible to overwrite volumeMount and specify any other Volume for Jenkins home directory, +as attempting to do so will result in Operator error. + +jenkins-home is not the only Jenkins controller pod volumeMount that is non-configurable and managed by Operator, +below is the full list of those volumeMounts: + +* jenkins-home +* scripts +* init-configuration +* operator-credentials \ No newline at end of file diff --git a/website/package-lock.json b/website/package-lock.json index 67bfa179..334ea961 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -288,16 +288,16 @@ } }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.16.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", + "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001219", + "caniuse-lite": "^1.0.30001248", "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "electron-to-chromium": "^1.3.793", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^1.1.73" } }, "cache-base": { @@ -330,9 +330,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001237", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001237.tgz", - "integrity": "sha512-pDHgRndit6p1NR2GhzMbQ6CkRrp4VKuSsqbcLeOQppYPKOYkKT/6ZvZDvKJUqcmtyWIAHuZq3SVS2vc1egCZzw==", + "version": "1.0.30001249", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001249.tgz", + "integrity": "sha512-vcX4U8lwVXPdqzPWi6cAJ3FnQaqXbBqy/GZseKNQzRj37J7qZdGcBtxq/QLFNLLlfsoXLUdHw8Iwenri86Tagw==", "dev": true }, "chalk": { @@ -568,9 +568,9 @@ } }, "electron-to-chromium": { - "version": "1.3.752", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz", - "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==", + "version": "1.3.798", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.798.tgz", + "integrity": "sha512-fwsr6oXAORoV9a6Ak2vMCdXfmHIpAGgpOGesulS1cbGgJmrMl3H+GicUyRG3t+z9uHTMrIuMTleFDW+EUFYT3g==", "dev": true }, "end-of-stream": { @@ -925,9 +925,9 @@ } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, "has-flag": { @@ -1338,9 +1338,9 @@ "dev": true }, "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", "dev": true, "optional": true },