Merge remote-tracking branch 'origin/master' into version-9.0

This commit is contained in:
brokenpip3 2024-03-16 16:03:22 +01:00
commit 0b796360ec
No known key found for this signature in database
GPG Key ID: 1D9BDC803797B4B6
34 changed files with 1331 additions and 621 deletions

View File

@ -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": [],

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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}

View File

@ -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

5
.gitignore vendored
View File

@ -97,3 +97,8 @@ chart/jenkins-operator/deploy.tmp
### Nix
result
### website
website/node_modules
website/public
website/.hugo_build.lock

View File

@ -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

View File

@ -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:

View File

@ -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"
}
},

View File

@ -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;
};
}

22
nix/website-build.nix Normal file
View File

@ -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}";
}

17
nix/website-shell.nix Normal file
View File

@ -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}";
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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)
})

View File

@ -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)
})
})

View File

@ -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")

View File

@ -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),

35
test/make_matrix_ginkgo.sh Executable file
View File

@ -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}"

1
website/.envrc Normal file
View File

@ -0,0 +1 @@
has nix && use flake ../.#website

View File

@ -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/).

View File

@ -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.

View File

@ -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 -->

View File

@ -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.

View File

@ -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 %}}

View File

@ -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

0
website/content/en/docs/_index.md Executable file → Normal file
View File

View File

@ -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

View File

@ -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"
}
}