From 3e5d80269dc7b12b8c494c262abb07a249926fa9 Mon Sep 17 00:00:00 2001 From: Mateusz Korus Date: Tue, 10 Aug 2021 09:58:24 +0200 Subject: [PATCH] Merge master (#620) * Fix workflow for autogenerating docs (#592) * Use grep -c flag in check for changes step to fix case when more than 1 website file was modified * Configure bot for labelling new issues as needing triage (#597) * Configure bot for managing stale issues (#598) * Docs: explanation what is backed up and why (#599) * Explanation what's backed up and why * Auto-updated docs (#600) Co-authored-by: prryb * Docs: clarification of description of get latest command in backup (#601) * Auto-updated docs (#602) Co-authored-by: Sig00rd * Bump seedjobs agent image version to 4.9-1 (#604) * Add GitLFS pull after checkout behaviour to SeedJob GroovyScript Template (#483) Add GitLFS pull after checkout behaviour to support also repositories which are relying on Git LFS Close #482 * Docs: minor fixes (#608) * Link to project's DockerHub in README's section on nightly builds, add paragraph about nightly builds in installation docs * Fix repositoryURL in sample seedJob configuration with SSH auth * Slightly expand on #348 * Fix formatting in docs on Jenkins' customization, update plugin versions * Add notes on Jenkins home Volume in Helm chart values.yaml and docs (#589) * Auto-updated docs (#610) Co-authored-by: Sig00rd * Add an issue template for documentation (#613) * Docs: add info on restricted volumeMounts other than jenkins-home(#612) * Update note in installation docs * Update Helm chart default values.yaml * Update schema * Auto-updated docs (#616) Co-authored-by: Sig00rd * Auto-updated docs (#617) Co-authored-by: Sig00rd * Helm Chart: Remove empty priorityClassName from Jenkins template (#618) Also bump Helm Chart version to v0.5.2 * Fix bad identation in chart/index.yaml (#619) Co-authored-by: Szymon Fugas Co-authored-by: Piotr Ryba <55996264+prryb@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: prryb Co-authored-by: Sig00rd Co-authored-by: Cosnita Radu Viorel Co-authored-by: Morten Birkelund Co-authored-by: Ernestas --- .devbots/needs-triage.yml | 4 ++ .github/ISSUE_TEMPLATE/documentation.md | 14 ++++++ .github/stale.yml | 47 ++++++++++++++++++ .github/workflows/auto-gen-docs.yaml | 24 ++++----- README.md | 5 +- chart/index.yaml | 10 ++++ chart/jenkins-operator/Chart.yaml | 2 +- .../jenkins-operator-0.5.2.tgz | Bin 0 -> 34161 bytes chart/jenkins-operator/templates/jenkins.yaml | 2 - chart/jenkins-operator/values.yaml | 3 ++ docs/docs/developer-guide/index.html | 13 ++++- docs/docs/developer-guide/index.xml | 2 +- .../latest/configuration/index.html | 2 +- .../configure-backup-and-restore/index.html | 10 +++- .../latest/customization/index.html | 29 ++++++----- docs/docs/getting-started/latest/index.html | 4 +- docs/docs/getting-started/latest/index.xml | 44 ++++++++++------ .../getting-started/latest/schema/index.html | 9 +++- .../configure-backup-and-restore/index.html | 2 +- docs/docs/getting-started/v0.5.x/index.html | 4 +- docs/docs/getting-started/v0.5.x/index.xml | 2 +- docs/docs/index.html | 8 +-- docs/docs/index.xml | 46 +++++++++++------ docs/docs/installation/index.html | 45 ++++++++++++++--- docs/docs/installation/index.xml | 2 +- docs/sitemap.xml | 12 ++--- pkg/configuration/user/seedjobs/seedjobs.go | 8 ++- .../content/en/docs/Developer Guide/_index.md | 30 ++++++++--- .../Getting Started/latest/configuration.md | 2 +- .../latest/configure-backup-and-restore.md | 6 ++- .../Getting Started/latest/customization.md | 19 +++---- .../en/docs/Getting Started/latest/schema.md | 7 ++- .../v0.5.x/configure-backup-and-restore.md | 2 +- .../content/en/docs/Installation/_index.md | 28 +++++++++-- website/package-lock.json | 36 +++++++------- 35 files changed, 347 insertions(+), 136 deletions(-) create mode 100644 .devbots/needs-triage.yml create mode 100644 .github/ISSUE_TEMPLATE/documentation.md create mode 100644 .github/stale.yml create mode 100644 chart/jenkins-operator/jenkins-operator-0.5.2.tgz 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/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/chart/index.yaml b/chart/index.yaml index b7e1f554..eb3b8c73 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 0000000000000000000000000000000000000000..c2f1afe9e0063a9c2e03b84b419cade3074dd85f GIT binary patch literal 34161 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

%76 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 R4C4bI{}1}vbn5^R1OO6LISv2- literal 0 HcmV?d00001 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/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 },