Merge remote-tracking branch 'origin/master' into version-9.0
This commit is contained in:
		
						commit
						0b796360ec
					
				|  | @ -24,6 +24,13 @@ | |||
|             "version": "latest" | ||||
|         }, | ||||
|         "ghcr.io/brokenpip3/devcontainers-bats/bats-libs:0": { | ||||
|         }, | ||||
|         "ghcr.io/devcontainers/features/nix:1": { | ||||
|             "multiUser": "false", | ||||
|             "extraNixConfig": "experimental-features = nix-command flakes" | ||||
|         }, | ||||
|         "ghcr.io/devcontainers/features/hugo:1": { | ||||
|             "version": "v0.99.1" | ||||
|         } | ||||
|     }, | ||||
|     // "forwardPorts": [], | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| name: codespell | ||||
| name: CI Lint | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|  | @ -8,14 +8,26 @@ on: | |||
|     types: [opened, synchronize, ready_for_review, reopened] | ||||
| jobs: | ||||
|   codespell: | ||||
|     name: codespell | ||||
|     name: Codespell | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v4 | ||||
|       - name: Codespell | ||||
|         uses: codespell-project/actions-codespell@v2 | ||||
|         with: | ||||
|           check_filenames: true | ||||
|           ignore_words_list: aks,ags,startin | ||||
|           skip: "*.js,package-lock.json,*.lock,*/Font-Awesome/*,*.toml,*.svg,*assets/vendor/bootstrap*,cert-manager.crds.yaml" | ||||
|     - name: Checkout | ||||
|       uses: actions/checkout@v4 | ||||
|     - name: Codespell | ||||
|       uses: codespell-project/actions-codespell@v2 | ||||
|       with: | ||||
|         check_filenames: true | ||||
|         ignore_words_list: aks,ags,startin | ||||
|         skip: "*.js,package-lock.json,*.lock,*/Font-Awesome/*,*.toml,*.svg,*assets/vendor/bootstrap*,cert-manager.crds.yaml" | ||||
|   pre-commit: | ||||
|     name: PreCommit | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|     - uses: actions/setup-python@v5.0.0 | ||||
|     - name: Checkout | ||||
|       uses: actions/checkout@v4 | ||||
|     - id: files | ||||
|       uses: tj-actions/changed-files@v42 | ||||
|     - uses: pre-commit/action@v3.0.1 | ||||
|       with: | ||||
|         extra_args: --files ${{ steps.files.outputs.all_changed_files }} --show-diff-on-failure | ||||
|  |  | |||
|  | @ -1,86 +1,105 @@ | |||
| name: auto-generate-docs | ||||
| name: Website | ||||
| 
 | ||||
| # Run this workflow every time a new commit pushed to your repository | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - master | ||||
|       - main | ||||
|     paths: | ||||
|       - 'docs/**' | ||||
|       - 'website/**' | ||||
|       - 'assets/**' | ||||
|   pull_request: | ||||
|     types: [opened, synchronize, ready_for_review, reopened] | ||||
|     paths: | ||||
|       - 'website/**' | ||||
|       - 'assets/**' | ||||
| 
 | ||||
| jobs: | ||||
|   # Set the job key. The key is displayed as the job name | ||||
|   # when a job name is not provided | ||||
|   docs: | ||||
|     # Name the Job | ||||
|     name: auto-generate-docs | ||||
|     # Set the type of machine to run on | ||||
|     runs-on: ubuntu-latest | ||||
| permissions: | ||||
|   contents: read | ||||
|   pages: write | ||||
|   id-token: write | ||||
| 
 | ||||
| concurrency: | ||||
|   group: "website" | ||||
|   cancel-in-progress: false | ||||
| 
 | ||||
| defaults: | ||||
|   run: | ||||
|     shell: bash | ||||
| 
 | ||||
| jobs: | ||||
|   update-date: | ||||
|     name: Auto update dates | ||||
|     runs-on: ubuntu-latest | ||||
|     if: github.event_name == 'pull_request' || (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') | ||||
|     steps: | ||||
|       # Checks out a copy of your repository on the ubuntu-latest machine | ||||
|       - uses: DeterminateSystems/nix-installer-action@v9 | ||||
|         with: | ||||
|           diagnostic-endpoint: "" | ||||
|       - uses: DeterminateSystems/magic-nix-cache-action@v3 | ||||
|         with: | ||||
|           diagnostic-endpoint: "" | ||||
|       - name: Checkout code | ||||
|         uses: actions/checkout@v4 | ||||
|         with: | ||||
|           submodules: recursive  # Fetch the Docsy theme | ||||
|           fetch-depth: 0 | ||||
| 
 | ||||
|       # Checks if the previous commit introduced any changes to website files | ||||
|       - name: Check for changes | ||||
|         run: | | ||||
|           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 == 'true' | ||||
|         uses: peaceiris/actions-hugo@v2 | ||||
|         with: | ||||
|           hugo-version: '0.113.0' | ||||
|           extended: true | ||||
| 
 | ||||
|       # Sets up node - required by Hugo | ||||
|       - name: Setup Node | ||||
|         if: env.IS_CHANGED == 'true' | ||||
|         uses: actions/setup-node@v4 | ||||
|         with: | ||||
|           node-version: '12.x' | ||||
| 
 | ||||
|       # Installs dependencies required by docsy theme | ||||
|       - name: Install docsy dependencies | ||||
|         if: env.IS_CHANGED == 'true' | ||||
|         run: | | ||||
|           cd website | ||||
|           npm install | ||||
|           npm build | ||||
|           sudo npm install -D --save autoprefixer | ||||
|           sudo npm install -D --save postcss-cli | ||||
|           cd ../ | ||||
| 
 | ||||
|       - name: Update last modified date in modified docs | ||||
|         if: env.IS_CHANGED == 'true' | ||||
|         run: | | ||||
|           git diff --name-only --diff-filter=d ${{ github.event.before }} ${{ github.sha }} | grep -E "^website*" \ | ||||
|           | sed -e 's/\(.*\)/"\1"/' | xargs sed -i "/date:/c\date: $(date +'%Y-%m-%d')" | ||||
| 
 | ||||
|       # Runs makefile goal - checks changes to /website folder and generates docs | ||||
|       - name: Run Makefile goal | ||||
|         if: env.IS_CHANGED == 'true' | ||||
|         env: | ||||
|           DEFAULT_BRANCH: master | ||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
|         run: make generate-docs | ||||
| 
 | ||||
|       # Creates pull request with generated docs | ||||
|       - name: Create Pull Request | ||||
|         if: env.IS_CHANGED == 'true' | ||||
|         uses: peter-evans/create-pull-request@v6 | ||||
|         if: env.IS_CHANGED == 'true' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') | ||||
|         with: | ||||
|           commit-message: Auto-updated docs | ||||
|           branch: docs-generator | ||||
|           title: Auto-generated docs update | ||||
|           body: | | ||||
|             Auto generated docs from master commit ${{ github.sha }} | ||||
| 
 | ||||
|   website-generate: | ||||
|     name: Auto generate website | ||||
|     runs-on: ubuntu-latest | ||||
|     if: github.event_name == 'pull_request' || (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') | ||||
|     steps: | ||||
|       - uses: DeterminateSystems/nix-installer-action@v9 | ||||
|         with: | ||||
|           diagnostic-endpoint: "" | ||||
|       - uses: DeterminateSystems/magic-nix-cache-action@v3 | ||||
|         with: | ||||
|           diagnostic-endpoint: "" | ||||
|       - name: Checkout code | ||||
|         uses: actions/checkout@v4 | ||||
|       - name: nix checks | ||||
|         run: nix flake check | ||||
|       - name: nix build | ||||
|         env: | ||||
|           HUGO_ENVIRONMENT: production | ||||
|           HUGO_ENV: production | ||||
|         run: nix build .#website | ||||
|       - name: Setup Pages | ||||
|         id: pages | ||||
|         uses: actions/configure-pages@v4 | ||||
|       - name: Upload artifact | ||||
|         uses: actions/upload-pages-artifact@v3 | ||||
|         with: | ||||
|           path: ./result | ||||
| 
 | ||||
|   website-deploy: | ||||
|     name: Deploy website | ||||
|     if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' | ||||
|     environment: | ||||
|       name: github-pages | ||||
|       url: ${{ steps.deployment.outputs.page_url }} | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: website-generate | ||||
|     steps: | ||||
|       - name: Deploy to GitHub Pages | ||||
|         id: deployment | ||||
|         uses: actions/deploy-pages@v4 | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| name: Run bats tests | ||||
| name: Tests BATS | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|  | @ -19,10 +19,11 @@ on: | |||
|       - 'backup/**' | ||||
|       - '*.md' | ||||
| 
 | ||||
| #TODO: create a matrix per earch bats file | ||||
| jobs: | ||||
|   run-tests: | ||||
|     if: github.event.pull_request.draft == false | ||||
|     name: Run automated bats tests | ||||
|     name: BATS Run tests | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Check out code | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| name: Run e2e tests | ||||
| name: Tests E2E | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|  | @ -20,20 +20,29 @@ on: | |||
|       - '*.md' | ||||
| 
 | ||||
| jobs: | ||||
|   run-tests: | ||||
|     if: github.event.pull_request.draft == false | ||||
|     name: Run automated tests | ||||
|   create-e2e-list: | ||||
|     name: E2E Create tests list | ||||
|     runs-on: ubuntu-latest | ||||
|     outputs: | ||||
|       matrix: ${{ steps.matrix.outputs.matrix }} | ||||
|     steps: | ||||
|       - name: Check out code | ||||
|         uses: actions/checkout@v4 | ||||
|       - uses: actions/checkout@v4 | ||||
|       - id: matrix | ||||
|         run: | | ||||
|           script=$(./test/make_matrix_ginkgo.sh e2e) | ||||
|           echo "matrix=${script}" >> $GITHUB_OUTPUT | ||||
| 
 | ||||
|   verify-code: | ||||
|     name: E2E Verify code before tests | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: [create-e2e-list] | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
| 
 | ||||
|       - name: Set up env vars | ||||
|         run: | | ||||
|           echo "GO111MODULE=on" >> $GITHUB_ENV | ||||
|           echo "GO_VERSION=v$(sed -n 's/GO_VERSION=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV | ||||
|           echo "HELM_VERSION=v$(sed -n 's/HELM_VERSION=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV | ||||
|           echo "KIND_CLUSTER_NAME=$(sed -n 's/KIND_CLUSTER_NAME=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV | ||||
|           echo "GOPATH=/home/runner/go" >> $GITHUB_ENV | ||||
| 
 | ||||
|       - name: Prepare go environment | ||||
|  | @ -47,6 +56,33 @@ jobs: | |||
|       - name: Verify code formatting | ||||
|         run: make verify | ||||
| 
 | ||||
|   run-e2e-tests: | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: [create-e2e-list, verify-code] | ||||
|     if: github.event.pull_request.draft == false | ||||
|     name: E2E ${{ matrix.test }} | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: ${{ fromJSON(needs.create-e2e-list.outputs.matrix) }} | ||||
|     steps: | ||||
|       - name: Check out code | ||||
|         uses: actions/checkout@v4 | ||||
| 
 | ||||
|       - name: Set up env vars | ||||
|         run: | | ||||
|           echo "GO111MODULE=on" >> $GITHUB_ENV | ||||
|           echo "GO_VERSION=v$(sed -n 's/GO_VERSION=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV | ||||
|           echo "KIND_CLUSTER_NAME=$(sed -n 's/KIND_CLUSTER_NAME=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV | ||||
|           echo "GOPATH=/home/runner/go" >> $GITHUB_ENV | ||||
| 
 | ||||
|       - name: Prepare go environment | ||||
|         uses: actions/setup-go@v5 | ||||
|         with: | ||||
|           go-version: ${{ env.GO_VERSION }} | ||||
| 
 | ||||
|       - name: Ensure Golang runtime dependencies | ||||
|         run: make go-dependencies | ||||
| 
 | ||||
|       - name: Kind setup | ||||
|         uses: helm/kind-action@v1.9.0 | ||||
|         with: | ||||
|  | @ -55,16 +91,19 @@ jobs: | |||
| 
 | ||||
|       - name: Prepare environment for e2e | ||||
|         run: | | ||||
|           sudo apt-get update | ||||
|           sudo apt-get install socat | ||||
|           sudo apt-get update && sudo apt-get install -y socat | ||||
|           sudo mkdir -p $HOME/.kube | ||||
|           sudo chown -R $USER $HOME/.kube | ||||
| 
 | ||||
|       - name: Jenkins Operator - e2e - list tests | ||||
|         run: make e2e E2E_TEST_ARGS='-ginkgo.v -ginkgo.dryRun' | ||||
| 
 | ||||
|       - name: Jenkins Operator - e2e | ||||
|         run: make e2e E2E_TEST_ARGS='-ginkgo.v' | ||||
|       - name: Jenkins Operator - e2e Chart tests | ||||
|         env: | ||||
|           TNAME: ${{ matrix.test }} | ||||
|           TFILE: ${{ matrix.file }} | ||||
|           TLINE: ${{ matrix.line }} | ||||
|         run: | | ||||
|           git reset --hard | ||||
|           printf "\n \n > Running test: %s from file: $s line: %s\n" "${TNAME}" "${TFILE}" "${TLINE}" | ||||
|           make e2e E2E_TEST_ARGS='-ginkgo.v -ginkgo.focus="${TNAME}"' | ||||
| 
 | ||||
|       - name: Debug | ||||
|         if: failure() | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| name: Run Helm e2e tests | ||||
| name: Tests HELM | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|  | @ -20,10 +20,50 @@ on: | |||
|       - '*.md' | ||||
| 
 | ||||
| jobs: | ||||
|   run-tests: | ||||
|     if: github.event.pull_request.draft == false | ||||
|     name: Run automated tests | ||||
|   create-helm-list: | ||||
|     name: HELM Create tests list | ||||
|     runs-on: ubuntu-latest | ||||
|     outputs: | ||||
|       matrix: ${{ steps.matrix.outputs.matrix }} | ||||
|     steps: | ||||
|     - uses: actions/checkout@v4 | ||||
|     - id: matrix | ||||
|       run: | | ||||
|         script=$(./test/make_matrix_ginkgo.sh helm) | ||||
|         echo "matrix=${script}" >> $GITHUB_OUTPUT | ||||
| 
 | ||||
|   verify-code: | ||||
|     name: HELM Verify code before tests | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: [create-helm-list] | ||||
|     steps: | ||||
|     - uses: actions/checkout@v4 | ||||
| 
 | ||||
|     - name: Set up env vars | ||||
|       run: | | ||||
|         echo "GO111MODULE=on" >> $GITHUB_ENV | ||||
|         echo "GO_VERSION=v$(sed -n 's/GO_VERSION=//p' config.base.env | tr -d '\n' | tr -d '"')" >> $GITHUB_ENV | ||||
|         echo "GOPATH=/home/runner/go" >> $GITHUB_ENV | ||||
| 
 | ||||
|     - name: Prepare go environment | ||||
|       uses: actions/setup-go@v5 | ||||
|       with: | ||||
|         go-version: ${{ env.GO_VERSION }} | ||||
| 
 | ||||
|     - name: Ensure Golang runtime dependencies | ||||
|       run: make go-dependencies | ||||
| 
 | ||||
|     - name: Verify code formatting | ||||
|       run: make verify | ||||
| 
 | ||||
|   run-helm-tests: | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: [create-helm-list, verify-code] | ||||
|     if: github.event.pull_request.draft == false | ||||
|     name: HELM ${{ matrix.test }} | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: ${{ fromJSON(needs.create-helm-list.outputs.matrix) }} | ||||
|     steps: | ||||
|       - name: Check out code | ||||
|         uses: actions/checkout@v4 | ||||
|  | @ -44,9 +84,6 @@ jobs: | |||
|       - name: Ensure Golang runtime dependencies | ||||
|         run: make go-dependencies | ||||
| 
 | ||||
|       - name: Verify code formatting | ||||
|         run: make verify | ||||
| 
 | ||||
|       - name: Kind setup | ||||
|         uses: helm/kind-action@v1.9.0 | ||||
|         with: | ||||
|  | @ -55,13 +92,26 @@ jobs: | |||
| 
 | ||||
|       - name: Prepare environment for e2e | ||||
|         run: | | ||||
|           sudo apt-get update | ||||
|           sudo apt-get install socat | ||||
|           sudo apt-get update && sudo apt-get install -y socat | ||||
|           sudo mkdir -p $HOME/.kube | ||||
|           sudo chown -R $USER $HOME/.kube | ||||
| 
 | ||||
|       - name: Jenkins Operator - Helm Chart tests | ||||
|         env: | ||||
|           TNAME: ${{ matrix.test }} | ||||
|           TFILE: ${{ matrix.file }} | ||||
|           TLINE: ${{ matrix.line }} | ||||
|         run: | | ||||
|           git reset --hard | ||||
|           make helm-lint | ||||
|           make helm-e2e E2E_TEST_ARGS='-ginkgo.v' | ||||
|           printf "\n \n > Running test: %s from file: $s line: %s\n" "${TNAME}" "${TFILE}" "${TLINE}" | ||||
|           make helm-e2e E2E_TEST_ARGS='-ginkgo.v -ginkgo.focus="${TNAME}"' | ||||
| 
 | ||||
|       - name: Debug | ||||
|         if: failure() | ||||
|         shell: bash | ||||
|         continue-on-error: true | ||||
|         run: | | ||||
|           randomns=$(kubectl get ns| grep -i 'ns[0-9]\+' |cut -d ' ' -f 1) | ||||
|           kubectl get pods -n ${randomns} | ||||
|           kubectl get events -n ${randomns} | ||||
|  |  | |||
|  | @ -71,6 +71,8 @@ jobs: | |||
|           make helm-e2e E2E_TEST_ARGS='-ginkgo.v' | ||||
| 
 | ||||
|       - name: Test - bats | ||||
|         env: | ||||
|           BATS_LIB_PATH: "${{ github.workspace }}/.bats" | ||||
|         if: ${{ github.event.inputs.skipTests != 'true' }} | ||||
|         run: make bats-tests | ||||
| 
 | ||||
|  |  | |||
|  | @ -97,3 +97,8 @@ chart/jenkins-operator/deploy.tmp | |||
| 
 | ||||
| ### Nix | ||||
| result | ||||
| 
 | ||||
| ### website | ||||
| website/node_modules | ||||
| website/public | ||||
| website/.hugo_build.lock | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| repos: | ||||
|   - repo: https://github.com/sirosen/check-jsonschema | ||||
|     rev: 0.22.0 | ||||
|     rev: 0.28.0 | ||||
|     hooks: | ||||
|       - id: check-github-workflows | ||||
|   - repo: https://github.com/pre-commit/pre-commit-hooks | ||||
|  |  | |||
							
								
								
									
										6
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										6
									
								
								Makefile
								
								
								
								
							|  | @ -186,6 +186,10 @@ update-lts-version: ## Update the latest lts version | |||
| 	sed -i 's|jenkins/jenkins:[0-9]\+.[0-9]\+.[0-9]\+|jenkins/jenkins:$(LATEST_LTS_VERSION)|g' test/e2e/test_utility.go | ||||
| 	sed -i 's|jenkins/jenkins:[0-9]\+.[0-9]\+.[0-9]\+|jenkins/jenkins:$(LATEST_LTS_VERSION)|g' test/helm/helm_test.go | ||||
| 	sed -i 's|jenkins/jenkins:[0-9]\+.[0-9]\+.[0-9]\+|jenkins/jenkins:$(LATEST_LTS_VERSION)|g' pkg/constants/constants.go | ||||
| 	#TODO: source the version from config.base.env for bats test, no need of hardcoded version | ||||
| 	sed -i 's|jenkins/jenkins:[0-9]\+.[0-9]\+.[0-9]\+|jenkins/jenkins:$(LATEST_LTS_VERSION)|g' test/bats/1-deploy.bats | ||||
| 	sed -i 's|jenkins/jenkins:[0-9]\+.[0-9]\+.[0-9]\+|jenkins/jenkins:$(LATEST_LTS_VERSION)|g' test/bats/2-deploy-with-more-options.bats | ||||
| 	sed -i 's|jenkins/jenkins:[0-9]\+.[0-9]\+.[0-9]\+|jenkins/jenkins:$(LATEST_LTS_VERSION)|g' test/bats/3-deploy-with-webhook.bats | ||||
| 
 | ||||
| .PHONY: run | ||||
| run: export WATCH_NAMESPACE = $(NAMESPACE) | ||||
|  | @ -456,7 +460,7 @@ endif | |||
| 
 | ||||
| # Download and build hugo extended locally if necessary
 | ||||
| HUGO_PATH = $(shell pwd)/bin/hugo | ||||
| HUGO_VERSION = v0.113.0 | ||||
| HUGO_VERSION = v0.99.1 | ||||
| HAS_HUGO := $(shell $(HUGO_PATH)/hugo version 2>&- | grep $(HUGO_VERSION)) | ||||
| .PHONY: hugo | ||||
| hugo: | ||||
|  |  | |||
							
								
								
									
										17
									
								
								flake.lock
								
								
								
								
							
							
						
						
									
										17
									
								
								flake.lock
								
								
								
								
							|  | @ -41,6 +41,22 @@ | |||
|         "type": "github" | ||||
|       } | ||||
|     }, | ||||
|     "hugo_099": { | ||||
|       "locked": { | ||||
|         "lastModified": 1657975505, | ||||
|         "narHash": "sha256-juMbw+GY2ycTrg3QbdFfEQs6P3FJeoYEv8aMVl2EZsg=", | ||||
|         "owner": "nixos", | ||||
|         "repo": "nixpkgs", | ||||
|         "rev": "d6df226c53d46821bd4773bd7ec3375f30238edb", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|         "owner": "nixos", | ||||
|         "repo": "nixpkgs", | ||||
|         "rev": "d6df226c53d46821bd4773bd7ec3375f30238edb", | ||||
|         "type": "github" | ||||
|       } | ||||
|     }, | ||||
|     "nixpkgs": { | ||||
|       "locked": { | ||||
|         "lastModified": 1708751719, | ||||
|  | @ -61,6 +77,7 @@ | |||
|       "inputs": { | ||||
|         "flake-utils": "flake-utils", | ||||
|         "gomod2nix": "gomod2nix", | ||||
|         "hugo_099": "hugo_099", | ||||
|         "nixpkgs": "nixpkgs" | ||||
|       } | ||||
|     }, | ||||
|  |  | |||
							
								
								
									
										50
									
								
								flake.nix
								
								
								
								
							
							
						
						
									
										50
									
								
								flake.nix
								
								
								
								
							|  | @ -4,6 +4,7 @@ | |||
|   inputs = { | ||||
|     nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; | ||||
|     flake-utils.url = "github:numtide/flake-utils"; | ||||
|     hugo_099.url = "github:nixos/nixpkgs/d6df226c53d46821bd4773bd7ec3375f30238edb"; | ||||
|     gomod2nix = { | ||||
|       url = "github:nix-community/gomod2nix"; | ||||
|       inputs.nixpkgs.follows = "nixpkgs"; | ||||
|  | @ -11,10 +12,11 @@ | |||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   outputs = { self, nixpkgs, flake-utils, gomod2nix, ... }: | ||||
|   outputs = { self, nixpkgs, flake-utils, gomod2nix, hugo_099, ... }: | ||||
|     flake-utils.lib.eachDefaultSystem (system: | ||||
|       let | ||||
|         pkgs = nixpkgs.legacyPackages.${system}; | ||||
|         hugo_099_pkgs = hugo_099.legacyPackages.${system}; | ||||
|         operatorVersion = builtins.readFile ./VERSION.txt; | ||||
|         sdkVersion = ((builtins.fromTOML (builtins.readFile ./config.base.env)).OPERATOR_SDK_VERSION); | ||||
|         jenkinsLtsVersion = ((builtins.fromTOML (builtins.readFile ./config.base.env)).LATEST_LTS_VERSION); | ||||
|  | @ -26,27 +28,51 @@ | |||
|         # shell in nix develop | ||||
|         devShells.default = nixpkgs.legacyPackages.${system}.mkShell { | ||||
|           packages = [ | ||||
|               pkgs.gnumake | ||||
|               pkgs.wget | ||||
|               pkgs.helm-docs | ||||
|               pkgs.go_1_20 | ||||
|               pkgs.golangci-lint | ||||
|             pkgs.gnumake | ||||
|             pkgs.wget | ||||
|             pkgs.helm-docs | ||||
|             pkgs.pre-commit | ||||
|             pkgs.kind | ||||
|             pkgs.golangci-lint | ||||
|             pkgs.go_1_20 | ||||
| 
 | ||||
|             (pkgs.bats.withLibraries (p: [ | ||||
|             p.bats-support | ||||
|             p.bats-assert | ||||
|             p.bats-file | ||||
|             p.bats-detik | ||||
|             ])) | ||||
| 
 | ||||
|             (pkgs.writeShellApplication { | ||||
|               name = "make_matrix"; | ||||
|               runtimeInputs = with pkgs; [ bash gnugrep gawk ]; | ||||
|               text = builtins.readFile ./test/make_matrix_ginkgo.sh; | ||||
|             }) | ||||
|           ]; | ||||
|           shellHook = '' | ||||
|               echo Operator Version ${operatorVersion} | ||||
|               echo Latest Jenkins LTS version: ${jenkinsLtsVersion} | ||||
|               echo Operator SDK version: ${sdkVersion} | ||||
|             echo Operator Version ${operatorVersion} | ||||
|             echo Latest Jenkins LTS version: ${jenkinsLtsVersion} | ||||
|             echo Operator SDK version: ${sdkVersion} | ||||
|           ''; | ||||
|         }; | ||||
| 
 | ||||
|         # nix shell .#gomod | ||||
|         devShells.gomod = pkgs.callPackage ./nix/shell.nix { | ||||
|             inherit (gomod2nix.legacyPackages.${system}) mkGoEnv gomod2nix; | ||||
|         devShells.gomod = pkgs.callPackage ./nix/gomod-shell.nix { | ||||
|           inherit (gomod2nix.legacyPackages.${system}) mkGoEnv gomod2nix; | ||||
|         }; | ||||
| 
 | ||||
|         # nix shell .#website | ||||
|         devShells.website = pkgs.callPackage ./nix/website-shell.nix { | ||||
|           inherit pkgs system hugo_099_pkgs; | ||||
|         }; | ||||
| 
 | ||||
|         # nix build with gomod2nix | ||||
|         packages.default = pkgs.callPackage ./nix { | ||||
|             inherit (gomod2nix.legacyPackages.${system}) buildGoApplication; | ||||
|           inherit (gomod2nix.legacyPackages.${system}) buildGoApplication; | ||||
|         }; | ||||
| 
 | ||||
|         packages.website = import ./nix/website-build.nix { | ||||
|           inherit pkgs system hugo_099_pkgs; | ||||
|         }; | ||||
| 
 | ||||
|       } | ||||
|  |  | |||
|  | @ -0,0 +1,22 @@ | |||
| { pkgs, system, hugo_099_pkgs }: | ||||
| 
 | ||||
| let | ||||
|   buildPackages = [ | ||||
|     hugo_099_pkgs.hugo #hugo pre-v100 | ||||
|     pkgs.nodejs_21 #Node 1.21 | ||||
|     pkgs.nodePackages.autoprefixer | ||||
|     pkgs.nodePackages.postcss | ||||
|     pkgs.nodePackages.postcss-cli | ||||
|   ]; | ||||
|   baseUrl = ((builtins.fromTOML (builtins.readFile ../website/config.toml)).baseURL); | ||||
| in | ||||
| pkgs.buildNpmPackage { | ||||
|   name = "jenkins-kubernetes-operator-website"; | ||||
|   src = ../website; | ||||
|   version = "0.0.1"; | ||||
|   npmDepsHash = "sha256-NcspVYF+9dCrGxH/cGNhD+TxLZm6ZDX523mKm9smAAA="; | ||||
|   nativeBuildInputs = buildPackages; | ||||
|   buildPhase = "npm run build"; | ||||
|   installPhase = "cp -r public $out"; | ||||
|   BASE_URL = "${baseUrl}"; | ||||
| } | ||||
|  | @ -0,0 +1,17 @@ | |||
| { pkgs, system, hugo_099_pkgs }: | ||||
| 
 | ||||
| let | ||||
|   devShellPackages = [ | ||||
|     hugo_099_pkgs.hugo #hugo pre-v100 | ||||
|     pkgs.nodejs_21 #Node 1.21 | ||||
|   ]; | ||||
|   baseUrl = ((builtins.fromTOML (builtins.readFile ../website/config.toml)).baseURL); | ||||
| in | ||||
| pkgs.mkShell { | ||||
|   packages = devShellPackages; | ||||
|   shellHook = '' | ||||
|     npm install --save-dev | ||||
|     npm list | ||||
|   ''; | ||||
|   BASE_URL = "${baseUrl}"; | ||||
| } | ||||
|  | @ -7,22 +7,24 @@ diag() { | |||
|   echo "# DEBUG $@" >&3 | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:setup | ||||
| @test "1.0" { | ||||
|   run ! helm repo list | grep -q "jenkins" | ||||
|   [ "$status" -eq 0 ] && run helm repo add jenkins https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/chart | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:setup | ||||
| @test "1.1 Create namespace" { | ||||
| #bats test_tags=phase:setup,scenario:vanilla | ||||
| @test "1.0  Init: create namespace" { | ||||
|   ${KUBECTL} get ns ${DETIK_CLIENT_NAMESPACE} && skip "Namespace ${DETIK_CLIENT_NAMESPACE} already exists" | ||||
|   run ${KUBECTL} create ns ${DETIK_CLIENT_NAMESPACE} | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm | ||||
| @test "1.1 Vanilla install helm chart" { | ||||
| #bats test_tags=phase:setup,scenario:vanilla | ||||
| @test "1.1  Init: add helm chart repo" { | ||||
|     ${HELM} repo list|grep -qc jenkins-operator && skip "Jenkins repo already exists" | ||||
|     upstream_url="https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/chart" | ||||
|     run ${HELM} repo add jenkins-operator $upstream_url | ||||
|     assert_success | ||||
|     assert_output '"jenkins-operator" has been added to your repositories' | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.2  Helm: vanilla install helm chart latest tagged version" { | ||||
|   run echo ${DETIK_CLIENT_NAMESPACE} | ||||
|   run echo ${OPERATOR_IMAGE} | ||||
|   ${HELM} status default && skip "Helm release 'default' already exists" | ||||
|  | @ -31,15 +33,16 @@ diag() { | |||
|     --set namespace=${DETIK_CLIENT_NAMESPACE} \ | ||||
|     --set operator.image=${OPERATOR_IMAGE} \ | ||||
|     --set jenkins.latestPlugins=true \ | ||||
|     --set jenkins.image="jenkins/jenkins:2.440.1-lts" \ | ||||
|     --set jenkins.backup.makeBackupBeforePodDeletion=false \ | ||||
|     chart/jenkins-operator | ||||
|     jenkins-operator/jenkins-operator --version=$(cat ../../VERSION.txt | sed 's/v//') | ||||
|   assert_success | ||||
|   assert ${HELM} status default | ||||
|   touch "chart/jenkins-operator/deploy.tmp" | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm | ||||
| @test "1.2 Helm: check Jenkins operator pods status" { | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.2  Helm: check Jenkins operator pods status" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there is 1 deployment named 'default-jenkins-operator'" | ||||
|   assert_success | ||||
|  | @ -51,8 +54,8 @@ diag() { | |||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm | ||||
| @test "1.3 Helm: check Jenkins Pod status" { | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.3  Helm: check Jenkins Pod status" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run try "at most 20 times every 10s to get pods named 'jenkins-jenkins' and verify that '.status.containerStatuses[?(@.name==\"jenkins-master\")].ready' is 'true'" | ||||
|   assert_success | ||||
|  | @ -61,8 +64,8 @@ diag() { | |||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm | ||||
| @test "1.4 Helm: check Jenkins service status" { | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.4  Helm: check Jenkins service status" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there is 1 service named 'jenkins-operator-http-jenkins'" | ||||
|   assert_success | ||||
|  | @ -71,8 +74,8 @@ diag() { | |||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm | ||||
| @test "1.5 Helm: check Jenkins configmaps created" { | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.5  Helm: check Jenkins configmaps created" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there is 1 configmap named 'jenkins-operator-base-configuration-jenkins'" | ||||
|   assert_success | ||||
|  | @ -82,8 +85,8 @@ diag() { | |||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm | ||||
| @test "1.6 Helm: check Jenkins operator role status" { | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.6  Helm: check Jenkins operator role status" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there are 2 role named 'jenkins-operator*'" | ||||
|   assert_success | ||||
|  | @ -91,8 +94,8 @@ diag() { | |||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm | ||||
| @test "1.7 Helm: check Jenkins operator role binding status" { | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.7  Helm: check Jenkins operator role binding status" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there is 1 rolebinding named 'jenkins-operator-jenkins'" | ||||
|   assert_success | ||||
|  | @ -100,26 +103,81 @@ diag() { | |||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm | ||||
| @test "1.8 Helm: check Jenkins operator service account status" { | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.8  Helm: check Jenkins operator service account status" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there are 2 serviceaccount named 'jenkins-operator*'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm | ||||
| @test "1.9 Helm: check Jenkins crd" { | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.9  Helm: check Jenkins crd" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there is 1 crd named 'jenkins.jenkins.io'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| @test "1.9 Helm: Clean" { | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.10 Helm: upgrade from main branch same values" { | ||||
|   run echo ${DETIK_CLIENT_NAMESPACE} | ||||
|   run echo ${OPERATOR_IMAGE} | ||||
|   run ${HELM} upgrade default \ | ||||
|     --set jenkins.namespace=${DETIK_CLIENT_NAMESPACE} \ | ||||
|     --set namespace=${DETIK_CLIENT_NAMESPACE} \ | ||||
|     --set operator.image=${OPERATOR_IMAGE} \ | ||||
|     --set jenkins.latestPlugins=true \ | ||||
|     --set jenkins.image="jenkins/jenkins:2.440.1-lts" \ | ||||
|     --set jenkins.backup.makeBackupBeforePodDeletion=false \ | ||||
|     chart/jenkins-operator | ||||
|   assert_success | ||||
|   assert ${HELM} status default | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.11 Helm: check Jenkins operator pods status again" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there is 1 deployment named 'default-jenkins-operator'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run verify "there is 1 pod named 'default-jenkins-operator-'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run try "at most 20 times every 10s to get pods named 'default-jenkins-operator-' and verify that '.status.containerStatuses[?(@.name==\"jenkins-operator\")].ready' is 'true'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.12 Helm: check Jenkins operator pods status" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there is 1 deployment named 'default-jenkins-operator'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run verify "there is 1 pod named 'default-jenkins-operator-'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run try "at most 20 times every 10s to get pods named 'default-jenkins-operator-' and verify that '.status.containerStatuses[?(@.name==\"jenkins-operator\")].ready' is 'true'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.13 Helm: check Jenkins Pod status" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run try "at most 20 times every 10s to get pods named 'jenkins-jenkins' and verify that '.status.containerStatuses[?(@.name==\"jenkins-master\")].ready' is 'true'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run try "at most 20 times every 5s to get pods named 'jenkins-jenkins' and verify that '.status.containerStatuses[?(@.name==\"jenkins-master\")].ready' is 'true'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:vanilla | ||||
| @test "1.14 Helm: clean" { | ||||
|   run ${HELM} uninstall default | ||||
|   assert_success | ||||
|   # Wait for the complete removal | ||||
|   sleep 30 | ||||
| 
 | ||||
|   run verify "there is 0 pvc named 'jenkins backup'" | ||||
|   assert_success | ||||
| 
 | ||||
|   rm "chart/jenkins-operator/deploy.tmp" | ||||
| } | ||||
|  |  | |||
|  | @ -3,29 +3,42 @@ setup() { | |||
|   _common_setup | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm | ||||
| @test "2.1 Install helm chart with options" { | ||||
|   # The kind storage class provider needs some sec to delete the old pvc | ||||
|   sleep 30 | ||||
|   run ${HELM} dependency update chart/jenkins-operator | ||||
| #bats test_tags=phase:setup,scenario:more-options | ||||
| @test "2.0  Init: create namespace" { | ||||
|   ${KUBECTL} get ns ${DETIK_CLIENT_NAMESPACE} && skip "Namespace ${DETIK_CLIENT_NAMESPACE} already exists" | ||||
|   run ${KUBECTL} create ns ${DETIK_CLIENT_NAMESPACE} | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:setup,scenario:more-options | ||||
| @test "2.1  Init: add helm chart repo" { | ||||
|     ${HELM} repo list|grep -qc jenkins-operator && skip "Jenkins repo already exists" | ||||
|     upstream_url="https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/chart" | ||||
|     run ${HELM} repo add jenkins-operator $upstream_url | ||||
|     assert_success | ||||
|     assert_output '"jenkins-operator" has been added to your repositories' | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:more-options | ||||
| @test "2.2  Helm Install helm chart with options" { | ||||
|   #assert_success | ||||
|   run ${KUBECTL} label node jenkins-control-plane batstest=yep | ||||
|   ${HELM} status options && skip "Helm release 'options' already exists" | ||||
|   run ${HELM} install options \ | ||||
|     --set jenkins.namespace=${DETIK_CLIENT_NAMESPACE} \ | ||||
|     --set namespace=${DETIK_CLIENT_NAMESPACE} \ | ||||
|     --set operator.image=${OPERATOR_IMAGE} \ | ||||
|     --set jenkins.latestPlugins=true \ | ||||
|     --set jenkins.nodeSelector.batstest=yep \ | ||||
|     --set jenkins.image="jenkins/jenkins:2.440.1-lts" \ | ||||
|     --set jenkins.backup.makeBackupBeforePodDeletion=false \ | ||||
|     chart/jenkins-operator | ||||
|     jenkins-operator/jenkins-operator --version=$(cat ../../VERSION.txt | sed 's/v//') | ||||
|   assert_success | ||||
|   assert ${HELM} status options | ||||
|   touch "chart/jenkins-operator/deploy.tmp" | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm | ||||
| @test "2.2 Helm: check Jenkins operator pods status" { | ||||
| #bats test_tags=phase:helm,scenario:more-options | ||||
| @test "2.3  Helm: check Jenkins operator pods status" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   run verify "there is 1 deployment named 'options-jenkins-operator'" | ||||
|  | @ -38,8 +51,8 @@ setup() { | |||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm | ||||
| @test "2.3 Helm: check Jenkins Pod status" { | ||||
| #bats test_tags=phase:helm,scenario:more-options | ||||
| @test "2.4  Helm: check Jenkins Pod status" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   run try "at most 20 times every 10s to get pods named 'jenkins-jenkins' and verify that '.status.containerStatuses[?(@.name==\"jenkins-master\")].ready' is 'true'" | ||||
|  | @ -49,7 +62,8 @@ setup() { | |||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| @test "2.4 check node selector" { | ||||
| #bats test_tags=phase:helm,scenario:more-options | ||||
| @test "2.5  Helm: check node selector" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   NODENAME=$(${KUBECTL} get pod jenkins-jenkins -o jsonpath={.spec.nodeName}) | ||||
|  | @ -59,7 +73,8 @@ setup() { | |||
|   assert_output "node/$NODENAME" | ||||
| } | ||||
| 
 | ||||
| @test "2.5 check jenkins-plugin-cli command" { | ||||
| #bats test_tags=phase:helm,scenario:more-options | ||||
| @test "2.6  Helm: check jenkins-plugin-cli command" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   run ${KUBECTL} logs -c jenkins-master jenkins-jenkins | ||||
|  | @ -68,8 +83,8 @@ setup() { | |||
|   assert_output --partial 'jenkins-plugin-cli --verbose --latest true -f /var/lib/jenkins/user-plugins.txt' | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @test "2.7 check backup" { | ||||
| #bats test_tags=phase:helm,scenario:more-options | ||||
| @test "2.8  Helm: check backup" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   sleep 120 | ||||
|   run ${KUBECTL} logs -l app.kubernetes.io/name=jenkins-operator --tail 10000 | ||||
|  | @ -78,13 +93,83 @@ setup() { | |||
|   assert_output --partial "Backup completed '1', updating status" | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:more-options | ||||
| @test "2.9  Helm: upgrade from main branch same value" { | ||||
|   # The kind storage class provider needs some sec to delete the old pvc | ||||
|   sleep 30 | ||||
|   #run ${HELM} dependency update chart/jenkins-operator | ||||
|   #assert_success | ||||
|   run ${KUBECTL} label node jenkins-control-plane batstest=yep | ||||
|   ${HELM} status options && skip "Helm release 'options' already exists" | ||||
|   run ${HELM} upgrade options \ | ||||
|     --set jenkins.namespace=${DETIK_CLIENT_NAMESPACE} \ | ||||
|     --set namespace=${DETIK_CLIENT_NAMESPACE} \ | ||||
|     --set operator.image=${OPERATOR_IMAGE} \ | ||||
|     --set jenkins.latestPlugins=true \ | ||||
|     --set jenkins.nodeSelector.batstest=yep \ | ||||
|     --set jenkins.image="jenkins/jenkins:2.440.1-lts" \ | ||||
|     --set jenkins.backup.makeBackupBeforePodDeletion=false \ | ||||
|     chart/jenkins-operator | ||||
|   assert_success | ||||
|   assert ${HELM} status options | ||||
| } | ||||
| 
 | ||||
| @test "2. Helm: Clean" { | ||||
|   skip | ||||
| #bats test_tags=phase:helm,scenario:more-options | ||||
| @test "2.10 Helm: check Jenkins operator pods status again" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   run verify "there is 1 deployment named 'options-jenkins-operator'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run verify "there is 1 pod named 'options-jenkins-operator-'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run try "at most 20 times every 10s to get pods named 'options-jenkins-operator-' and verify that '.status.containerStatuses[?(@.name==\"jenkins-operator\")].ready' is 'true'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:more-options | ||||
| @test "2.11 Helm: check Jenkins Pod status again" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   run try "at most 20 times every 10s to get pods named 'jenkins-jenkins' and verify that '.status.containerStatuses[?(@.name==\"jenkins-master\")].ready' is 'true'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run try "at most 20 times every 5s to get pods named 'jenkins-jenkins' and verify that '.status.containerStatuses[?(@.name==\"jenkins-master\")].ready' is 'true'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:more-options | ||||
| @test "2.12 Helm: check node selector again" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   NODENAME=$(${KUBECTL} get pod jenkins-jenkins -o jsonpath={.spec.nodeName}) | ||||
| 
 | ||||
|   run ${KUBECTL} get node -l batstest=yep -o name | ||||
|   assert_success | ||||
|   assert_output "node/$NODENAME" | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:more-options | ||||
| @test "2.13 Helm: check jenkins-plugin-cli command again" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   run ${KUBECTL} logs -c jenkins-master jenkins-jenkins | ||||
|   assert_success | ||||
|   assert_output --partial 'jenkins-plugin-cli --verbose --latest true -f /var/lib/jenkins/base-plugins.txt' | ||||
|   assert_output --partial 'jenkins-plugin-cli --verbose --latest true -f /var/lib/jenkins/user-plugins.txt' | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:more-options | ||||
| @test "2.14 Helm: clean" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   run ${HELM} uninstall options | ||||
|   assert_success | ||||
|   sleep 30 | ||||
| 
 | ||||
|   run verify "there is 0 pvc named 'jenkins backup'" | ||||
|   assert_success | ||||
| 
 | ||||
|   rm "chart/jenkins-operator/deploy.tmp" | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,149 @@ | |||
| setup() { | ||||
|   load 'test_helper' | ||||
|   _common_setup | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:setup,scenario:webhook | ||||
| @test "3.0  Init: create namespace" { | ||||
|   ${KUBECTL} get ns ${DETIK_CLIENT_NAMESPACE} && skip "Namespace ${DETIK_CLIENT_NAMESPACE} already exists" | ||||
|   run ${KUBECTL} create ns ${DETIK_CLIENT_NAMESPACE} | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:setup,scenario:webhook | ||||
| @test "3.1  Init: add helm chart repo" { | ||||
|     ${HELM} repo list|grep -qc jenkins-operator && skip "Jenkins repo already exists" | ||||
|     upstream_url="https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/chart" | ||||
|     run ${HELM} repo add jenkins-operator $upstream_url | ||||
|     assert_success | ||||
|     assert_output '"jenkins-operator" has been added to your repositories' | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:webhook | ||||
| @test "3.2  Helm: install helm chart with webhook enabled" { | ||||
|   run ${HELM} dependency update chart/jenkins-operator | ||||
|   assert_success | ||||
|   ${HELM} status webhook && skip "Helm release 'webhook' already exists" | ||||
|   run ${HELM} install webhook \ | ||||
|     --set jenkins.namespace=${DETIK_CLIENT_NAMESPACE} \ | ||||
|     --set namespace=${DETIK_CLIENT_NAMESPACE} \ | ||||
|     --set operator.image=${OPERATOR_IMAGE} \ | ||||
|     --set jenkins.latestPlugins=true \ | ||||
|     --set jenkins.image="jenkins/jenkins:2.440.1-lts" \ | ||||
|     --set jenkins.backup.makeBackupBeforePodDeletion=true \ | ||||
|     --set webhook.enabled=true \ | ||||
|     jenkins-operator/jenkins-operator --version=$(cat ../../VERSION.txt | sed 's/v//') | ||||
|   assert_success | ||||
|   assert ${HELM} status webhook | ||||
|   touch "chart/jenkins-operator/deploy.tmp" | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:webhook | ||||
| @test "3.3  Helm: check Jenkins operator pods status" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   run verify "there is 1 deployment named 'webhook-jenkins-operator'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run verify "there is 1 pod named 'webhook-jenkins-operator-'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run try "at most 20 times every 10s to get pods named 'webhook-jenkins-operator-' and verify that '.status.containerStatuses[?(@.name==\"jenkins-operator\")].ready' is 'true'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:webhook | ||||
| @test "3.4  Helm: check Jenkins Pod status" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   run try "at most 20 times every 10s to get pods named 'jenkins-jenkins' and verify that '.status.containerStatuses[?(@.name==\"jenkins-master\")].ready' is 'true'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run try "at most 20 times every 5s to get pods named 'jenkins-jenkins' and verify that '.status.containerStatuses[?(@.name==\"jenkins-master\")].ready' is 'true'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:webhook | ||||
| @test "3.5  Helm: check Jenkins crd" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there is 1 crd named 'jenkins.jenkins.io'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:webhook | ||||
| @test "3.6  Helm: check cert-manager crd" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there is 1 crd named 'certificates.cert-manager.io'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:webhook | ||||
| @test "3.7  Helm: upgrade from main branch same value" { | ||||
|   run ${HELM} dependency update chart/jenkins-operator | ||||
|   assert_success | ||||
|   ${HELM} status webhook && skip "Helm release 'webhook' already exists" | ||||
|   run ${HELM} install webhook \ | ||||
|     --set jenkins.namespace=${DETIK_CLIENT_NAMESPACE} \ | ||||
|     --set namespace=${DETIK_CLIENT_NAMESPACE} \ | ||||
|     --set operator.image=${OPERATOR_IMAGE} \ | ||||
|     --set jenkins.latestPlugins=true \ | ||||
|     --set jenkins.image="jenkins/jenkins:2.440.1-lts" \ | ||||
|     --set jenkins.backup.makeBackupBeforePodDeletion=true \ | ||||
|     --set webhook.enabled=true \ | ||||
|     chart/jenkins-operator | ||||
|   assert_success | ||||
|   assert ${HELM} status webhook | ||||
|   touch "chart/jenkins-operator/deploy.tmp" | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:webhook | ||||
| @test "3.8  Helm: check Jenkins operator pods status again" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   run verify "there is 1 deployment named 'webhook-jenkins-operator'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run verify "there is 1 pod named 'webhook-jenkins-operator-'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run try "at most 20 times every 5s to get pods named 'webhook-jenkins-operator-' and verify that '.status.containerStatuses[?(@.name==\"jenkins-operator\")].ready' is 'true'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:webhook | ||||
| @test "3.9  Helm: check Jenkins Pod status again" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   run try "at most 20 times every 10s to get pods named 'jenkins-jenkins' and verify that '.status.containerStatuses[?(@.name==\"jenkins-master\")].ready' is 'true'" | ||||
|   assert_success | ||||
| 
 | ||||
|   run try "at most 20 times every 5s to get pods named 'jenkins-jenkins' and verify that '.status.containerStatuses[?(@.name==\"jenkins-master\")].ready' is 'true'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:webhook | ||||
| @test "3.10 Helm: check Jenkins crd again" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there is 1 crd named 'jenkins.jenkins.io'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| #bats test_tags=phase:helm,scenario:webhook | ||||
| @test "3.11 Helm: check cert-manager crd again" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
|   run verify "there is 1 crd named 'certificates.cert-manager.io'" | ||||
|   assert_success | ||||
| } | ||||
| 
 | ||||
| @test "3.12 Helm: clean" { | ||||
|   [[ ! -f "chart/jenkins-operator/deploy.tmp" ]] && skip "Jenkins helm chart have not been deployed correctly" | ||||
| 
 | ||||
|   run ${HELM} uninstall webhook | ||||
|   assert_success | ||||
|   sleep 30 | ||||
| 
 | ||||
|   run verify "there is 0 pvc named 'jenkins backup'" | ||||
|   assert_success | ||||
| 
 | ||||
|   rm "chart/jenkins-operator/deploy.tmp" | ||||
| } | ||||
|  | @ -90,7 +90,7 @@ var _ = Describe("Jenkins controller configuration", func() { | |||
| 	}) | ||||
| 
 | ||||
| 	Context("when deploying CR to cluster", func() { | ||||
| 		It("creates Jenkins instance and configures it", func() { | ||||
| 		It("creates vanilla Jenkins instance and configures it", func() { | ||||
| 			WaitForJenkinsBaseConfigurationToComplete(jenkins) | ||||
| 			verifyJenkinsMasterPodAttributes(jenkins) | ||||
| 			verifyServices(jenkins) | ||||
|  | @ -138,7 +138,7 @@ var _ = Describe("Jenkins controller priority class", func() { | |||
| 	}) | ||||
| 
 | ||||
| 	Context("when deploying CR with priority class to cluster", func() { | ||||
| 		It("creates Jenkins instance and configures it", func() { | ||||
| 		It("creates Jenkins instance with priority class and configures it", func() { | ||||
| 			WaitForJenkinsBaseConfigurationToComplete(jenkins) | ||||
| 			verifyJenkinsMasterPodAttributes(jenkins) | ||||
| 		}) | ||||
|  |  | |||
|  | @ -47,7 +47,7 @@ var _ = Describe("Jenkins controller", func() { | |||
| 	}) | ||||
| 
 | ||||
| 	Context("when restarting Jenkins master pod", func() { | ||||
| 		It("new Jenkins Master pod should be created", func() { | ||||
| 		It("new Jenkins pod should be created after a restart", func() { | ||||
| 			WaitForJenkinsBaseConfigurationToComplete(jenkins) | ||||
| 			restartJenkinsMasterPod(jenkins) | ||||
| 			waitForRecreateJenkinsMasterPod(jenkins) | ||||
|  | @ -96,19 +96,16 @@ var _ = Describe("Jenkins controller", func() { | |||
| 	}) | ||||
| 
 | ||||
| 	Context("when running Jenkins safe restart", func() { | ||||
| 		It("authorization strategy is not overwritten", func() { | ||||
| 		It("authorization strategy is not overwritten after a restart", func() { | ||||
| 			// TODO: @brokenpip3 temporary disable this flaky test
 | ||||
| 			Skip("Temporary skipping this test") | ||||
| 			WaitForJenkinsBaseConfigurationToComplete(jenkins) | ||||
| 			WaitForJenkinsUserConfigurationToComplete(jenkins) | ||||
| 			jenkinsClient, cleanUpFunc := verifyJenkinsAPIConnection(jenkins, namespace.Name) | ||||
| 			defer cleanUpFunc() | ||||
| 			checkIfAuthorizationStrategyUnsecuredIsSet(jenkinsClient) | ||||
| 
 | ||||
| 			err := jenkinsClient.SafeRestart() | ||||
| 			Expect(err).NotTo(HaveOccurred()) | ||||
| 			waitForJenkinsSafeRestart(jenkinsClient) | ||||
| 
 | ||||
| 			checkIfAuthorizationStrategyUnsecuredIsSet(jenkinsClient) | ||||
| 		}) | ||||
| 	}) | ||||
|  |  | |||
|  | @ -240,13 +240,14 @@ func verifyJenkinsAPIConnection(jenkins *v1alpha2.Jenkins, namespace string) (je | |||
| func restartJenkinsMasterPod(jenkins *v1alpha2.Jenkins) { | ||||
| 	_, _ = fmt.Fprintf(GinkgoWriter, "Restarting Jenkins master pod\n") | ||||
| 	jenkinsPod := getJenkinsMasterPod(jenkins) | ||||
| 	_, _ = fmt.Fprintf(GinkgoWriter, "Jenkins pod: %+v\n", jenkinsPod) | ||||
| 	initialCreationTimestamp := jenkinsPod.CreationTimestamp.DeepCopy() | ||||
| 
 | ||||
| 	_, _ = fmt.Fprintf(GinkgoWriter, "Jenkins pod: %+v\n", jenkinsPod.Status.Phase) | ||||
| 	Expect(K8sClient.Delete(context.TODO(), jenkinsPod)).Should(Succeed()) | ||||
| 
 | ||||
| 	Eventually(func() (bool, error) { | ||||
| 		jenkinsPod = getJenkinsMasterPod(jenkins) | ||||
| 		fmt.Printf("Jenkins pod deletion timestamp: %v\n", jenkinsPod.DeletionTimestamp) | ||||
| 		return jenkinsPod.DeletionTimestamp != nil, nil | ||||
| 		return !jenkinsPod.CreationTimestamp.Equal(initialCreationTimestamp), nil | ||||
| 	}, 45*retryInterval, retryInterval).Should(BeTrue()) | ||||
| 
 | ||||
| 	_, _ = fmt.Fprintf(GinkgoWriter, "Jenkins master pod has been restarted\n") | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ var _ = Describe("Jenkins Controller", func() { | |||
| 	}) | ||||
| 
 | ||||
| 	Context("Deploys jenkins operator with helm charts with default values", func() { | ||||
| 		It("Deploys Jenkins operator and configures default Jenkins instance", func() { | ||||
| 		It("Deploys Jenkins operator and configures the default Jenkins instance", func() { | ||||
| 			jenkins := &v1alpha2.Jenkins{ | ||||
| 				TypeMeta: v1alpha2.JenkinsTypeMeta(), | ||||
| 				ObjectMeta: metav1.ObjectMeta{ | ||||
|  | @ -99,7 +99,7 @@ var _ = Describe("Jenkins Controller with security validator", func() { | |||
| 	}) | ||||
| 
 | ||||
| 	Context("When Jenkins CR contains plugins with security warnings", func() { | ||||
| 		It("Denies creating a jenkins CR with a warning", func() { | ||||
| 		It("Denies creating a jenkins CR with a plugin contains security warning", func() { | ||||
| 			By("Deploying the operator along with webhook and cert-manager") | ||||
| 			cmd := exec.Command("../../bin/helm", "upgrade", "jenkins", "../../chart/jenkins-operator", "--namespace", namespace.Name, "--debug", | ||||
| 				"--set-string", fmt.Sprintf("jenkins.namespace=%s", namespace.Name), | ||||
|  | @ -121,7 +121,7 @@ var _ = Describe("Jenkins Controller with security validator", func() { | |||
| 		}) | ||||
| 	}) | ||||
| 	Context("When Jenkins CR doesn't contain plugins with security warnings", func() { | ||||
| 		It("Jenkins instance is successfully created", func() { | ||||
| 		It("Permit creating a jenkins CR without security warning in plugins", func() { | ||||
| 			By("Deploying the operator along with webhook and cert-manager") | ||||
| 			cmd := exec.Command("../../bin/helm", "upgrade", "jenkins", "../../chart/jenkins-operator", "--namespace", namespace.Name, "--debug", | ||||
| 				"--set-string", fmt.Sprintf("jenkins.namespace=%s", namespace.Name), | ||||
|  |  | |||
|  | @ -0,0 +1,35 @@ | |||
| #!/usr/bin/env bash | ||||
| 
 | ||||
| TESTDIR="${TESTDIR:-test}" | ||||
| 
 | ||||
| json_output(){ | ||||
|     # Make shellcheck happy, | ||||
|     # declare local before assign | ||||
|     local lastl | ||||
|     local line | ||||
|     local grep_info | ||||
|     local f | ||||
|     local l | ||||
|     local t | ||||
| 
 | ||||
|     lastl=$(echo "${1}" | wc -l) | ||||
|     line=0 | ||||
|     printf '{\"include\":[' | ||||
|     while read -r test; do | ||||
|         line=$((line + 1)) | ||||
|         grep_info=$(echo "${test}"|awk -F '"' '{print $1}') | ||||
|         f=$(echo "${grep_info}"|cut -d ':' -f 1) | ||||
|         l=$(echo "${grep_info}"|cut -d ':' -f 2) | ||||
|         t=$(echo "${test}"|awk -F '"' '{print $2}') | ||||
|         printf '{\"file\":\"%s\",\"line\":\"%s\",\"test\":\"%s\"}' "$f" "$l" "$t" | ||||
|         [[ $line -ne $lastl ]] && printf "," | ||||
|     done <<< "${1}" | ||||
|     printf "]}" | ||||
| } | ||||
| 
 | ||||
| parse(){ | ||||
|     grep -nrE 'It\([^)]+\)' "$1" | ||||
| } | ||||
| 
 | ||||
| tests_list=$(parse "${TESTDIR}"/"${1}") | ||||
| json_output "${tests_list}" | ||||
|  | @ -0,0 +1 @@ | |||
| has nix && use flake ../.#website | ||||
|  | @ -1,28 +0,0 @@ | |||
| # How to Contribute | ||||
| 
 | ||||
| We'd love to accept your patches and contributions to this project. There are | ||||
| just a few small guidelines you need to follow. | ||||
| 
 | ||||
| ## Contributor License Agreement | ||||
| 
 | ||||
| Contributions to this project must be accompanied by a Contributor License | ||||
| Agreement. You (or your employer) retain the copyright to your contribution; | ||||
| this simply gives us permission to use and redistribute your contributions as | ||||
| part of the project. Head over to <https://cla.developers.google.com/> to see | ||||
| your current agreements on file or to sign a new one. | ||||
| 
 | ||||
| You generally only need to submit a CLA once, so if you've already submitted one | ||||
| (even if it was for a different project), you probably don't need to do it | ||||
| again. | ||||
| 
 | ||||
| ## Code reviews | ||||
| 
 | ||||
| All submissions, including submissions by project members, require review. We | ||||
| use GitHub pull requests for this purpose. Consult | ||||
| [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more | ||||
| information on using pull requests. | ||||
| 
 | ||||
| ## Community Guidelines | ||||
| 
 | ||||
| This project follows | ||||
| [Google's Open Source Community Guidelines](https://opensource.google.com/conduct/). | ||||
							
								
								
									
										201
									
								
								website/LICENSE
								
								
								
								
							
							
						
						
									
										201
									
								
								website/LICENSE
								
								
								
								
							|  | @ -1,201 +0,0 @@ | |||
|                                  Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
| 
 | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
| 
 | ||||
|    1. Definitions. | ||||
| 
 | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
| 
 | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
| 
 | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
| 
 | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
| 
 | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
| 
 | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
| 
 | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
| 
 | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
| 
 | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
| 
 | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
| 
 | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
| 
 | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
| 
 | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
| 
 | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
| 
 | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
| 
 | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
| 
 | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
| 
 | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
| 
 | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
| 
 | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
| 
 | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
| 
 | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
| 
 | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
| 
 | ||||
|    END OF TERMS AND CONDITIONS | ||||
| 
 | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
| 
 | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
| 
 | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
| 
 | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
| 
 | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
| 
 | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
|  | @ -2,7 +2,7 @@ | |||
| title: Community | ||||
| menu: | ||||
|   main: | ||||
|     weight: 40 | ||||
|     weight: 41 | ||||
| --- | ||||
| 
 | ||||
| <!--add blocks of content here to add more sections to the community page --> | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| --- | ||||
| title: "v0.6.x" | ||||
| linkTitle: "v0.6.x" | ||||
| weight: 1 | ||||
| weight: 2 | ||||
| date: 2021-12-08 | ||||
| description: > | ||||
|   How to work with Jenkins Operator 0.6.x version. We recommend migrating to a newer version. | ||||
|  | @ -15,5 +15,5 @@ This document describes a getting started guide for **Jenkins Operator** `v0.6.x | |||
| 
 | ||||
| Prepare your Kubernetes cluster and set up your `kubectl` access. | ||||
| 
 | ||||
| Once you have a running Kubernetes cluster you can focus on installing **Jenkins Operator** according to the  | ||||
| Once you have a running Kubernetes cluster you can focus on installing **Jenkins Operator** according to the | ||||
| [Installation](/kubernetes-operator/docs/getting-started/latest/installing-the-operator/) guide. | ||||
|  |  | |||
|  | @ -1,10 +1,10 @@ | |||
| --- | ||||
| title: "Latest (v0.8.x)" | ||||
| linkTitle: "Latest (v0.8.x)" | ||||
| title: "v0.7.x" | ||||
| linkTitle: "v0.7.x" | ||||
| weight: 1 | ||||
| date: 2021-12-08 | ||||
| description: > | ||||
|   How to work with the latest, currently supported Jenkins Operator version. | ||||
|   How to work with Jenkins Operator 0.6.x version. We recommend migrating to a newer version. | ||||
| --- | ||||
| 
 | ||||
| {{% pageinfo %}} | ||||
|  |  | |||
|  | @ -7,8 +7,7 @@ description: > | |||
|     Jenkins security and hardening out of the box | ||||
| --- | ||||
| 
 | ||||
| By default **Jenkins Operator** performs an initial security hardening of Jenkins instance | ||||
| via groovy scripts to prevent any security gaps. | ||||
| By default **Jenkins Operator** performs an initial security hardening of Jenkins instance via groovy scripts to prevent any security gaps. | ||||
| 
 | ||||
| ## Jenkins Access Control | ||||
| 
 | ||||
|  | @ -67,4 +66,4 @@ If you find a vulnerability or any misconfiguration in Jenkins, please report it | |||
| [jenkins-operator-role]:https://github.com/jenkinsci/kubernetes-operator/blob/v0.6.0/deploy/all-in-one-v1alpha2.yaml | ||||
| [jenkins-controller-role]:https://github.com/jenkinsci/kubernetes-operator/blob/v0.6.0/pkg/configuration/base/resources/rbac.go | ||||
| [base-configuration]:https://github.com/jenkinsci/kubernetes-operator/blob/master/pkg/configuration/base/resources/base_configuration_configmap.go | ||||
| [issues]:https://github.com/jenkinsci/kubernetes-operator/issues | ||||
| [issues]:https://github.com/jenkinsci/kubernetes-operator/issues | ||||
|  |  | |||
|  | @ -1,17 +0,0 @@ | |||
| #Copyright 2018 Google LLC | ||||
| # | ||||
| #Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| #you may not use this file except in compliance with the License. | ||||
| #You may obtain a copy of the License at | ||||
| # | ||||
| #    https://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| #Unless required by applicable law or agreed to in writing, software | ||||
| #distributed under the License is distributed on an "AS IS" BASIS, | ||||
| #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| #See the License for the specific language governing permissions and | ||||
| #limitations under the License. | ||||
| # | ||||
| rm -rf public/ | ||||
| HUGO_ENV="production" hugo --gc || exit 1 | ||||
| s3deploy -source=public/ -region=eu-west-1 -bucket=bep.is -distribution-id=E8OKNT7W9ZYZ2 -path temp/td | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,23 +1,11 @@ | |||
| { | ||||
|   "name": "tech-doc-hugo", | ||||
|   "version": "0.0.1", | ||||
|   "description": "Hugo theme for technical documentation.", | ||||
|   "main": "none.js", | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|   }, | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git+https://github.com/bep/tech-doc-hugo.git" | ||||
|   }, | ||||
|   "author": "", | ||||
|   "license": "ISC", | ||||
|   "bugs": { | ||||
|     "url": "https://github.com/bep/tech-doc-hugo/issues" | ||||
|   }, | ||||
|   "homepage": "https://github.com/bep/tech-doc-hugo#readme", | ||||
|   "devDependencies": { | ||||
|     "autoprefixer": "^10.4.17", | ||||
|   "name": "website", | ||||
|     "scripts": { | ||||
|         "build": "echo $BASE_URL; hugo --minify --baseURL=${BASE_URL}" | ||||
|     }, | ||||
|     "devDependencies": { | ||||
|     "autoprefixer": "^10.4.18", | ||||
|     "postcss": "^8.4.35", | ||||
|     "postcss-cli": "^11.0.0" | ||||
|   } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue