diff --git a/.github/workflows/__main-ci.yml b/.github/workflows/__main-ci.yml index 7d109cec..56532c7a 100644 --- a/.github/workflows/__main-ci.yml +++ b/.github/workflows/__main-ci.yml @@ -20,7 +20,6 @@ permissions: pull-requests: write security-events: write statuses: write - # FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659 id-token: write concurrency: diff --git a/.github/workflows/__pull-request-ci.yml b/.github/workflows/__pull-request-ci.yml index 503fc586..e6271043 100644 --- a/.github/workflows/__pull-request-ci.yml +++ b/.github/workflows/__pull-request-ci.yml @@ -14,7 +14,6 @@ permissions: pull-requests: write security-events: write statuses: write - # FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659 id-token: write concurrency: diff --git a/.github/workflows/__shared-ci.yml b/.github/workflows/__shared-ci.yml index a9dba027..cc29a2d5 100644 --- a/.github/workflows/__shared-ci.yml +++ b/.github/workflows/__shared-ci.yml @@ -12,8 +12,6 @@ permissions: pull-requests: read security-events: write statuses: write - # yamllint disable-line rule:line-length - # FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659 id-token: write jobs: diff --git a/.github/workflows/__test-action-docker-prune-pull-requests-image-tags.yml b/.github/workflows/__test-action-docker-prune-pull-requests-image-tags.yml index 50b9d886..5d17ae09 100644 --- a/.github/workflows/__test-action-docker-prune-pull-requests-image-tags.yml +++ b/.github/workflows/__test-action-docker-prune-pull-requests-image-tags.yml @@ -10,7 +10,6 @@ permissions: issues: read packages: write pull-requests: read - # FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659 id-token: write env: diff --git a/.github/workflows/__test-action-helm-release-chart.yml b/.github/workflows/__test-action-helm-release-chart.yml index be66fae3..bebaa096 100644 --- a/.github/workflows/__test-action-helm-release-chart.yml +++ b/.github/workflows/__test-action-helm-release-chart.yml @@ -13,9 +13,6 @@ jobs: tests: name: Test for "helm/release-chart" action with simple chart runs-on: ubuntu-latest - permissions: - contents: read - packages: write strategy: fail-fast: false matrix: diff --git a/.github/workflows/__test-action-helm-test-chart.yml b/.github/workflows/__test-action-helm-test-chart.yml index 529ba602..7b923327 100644 --- a/.github/workflows/__test-action-helm-test-chart.yml +++ b/.github/workflows/__test-action-helm-test-chart.yml @@ -10,7 +10,6 @@ permissions: issues: read packages: write pull-requests: read - # FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659 id-token: write jobs: diff --git a/.github/workflows/__test-workflow-docker-build-images.yml b/.github/workflows/__test-workflow-docker-build-images.yml index 4af9c0f4..29c6899e 100644 --- a/.github/workflows/__test-workflow-docker-build-images.yml +++ b/.github/workflows/__test-workflow-docker-build-images.yml @@ -10,12 +10,12 @@ permissions: issues: read packages: write pull-requests: read - # FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659 id-token: write # jscpd:ignore-start jobs: arrange: + name: Arrange runs-on: ubuntu-latest steps: - run: | @@ -24,7 +24,8 @@ jobs: exit 1 fi - act-build-arch: + act-build-images: + name: Act - Build multi-arch and mono-arch images needs: arrange uses: ./.github/workflows/docker-build-images.yml secrets: @@ -55,17 +56,18 @@ jobs: } ] - assert-build-arch: - needs: act-build-arch + assert-build-arch-mono-arch: + name: Assert - multi-arch and mono-arch builds + needs: act-build-images runs-on: "ubuntu-latest" steps: - - name: Check built images ouput + - name: Assert - built images output uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const assert = require("assert"); - const builtImagesOutput = `${{ needs.act-build-arch.outputs.built-images }}`; + const builtImagesOutput = `${{ needs.act-build-images.outputs.built-images }}`; assert(builtImagesOutput.length, `"built-images" output is empty`); // Check if is valid Json @@ -132,13 +134,13 @@ jobs: username: ${{ github.repository_owner }} password: ${{ github.token }} - - name: Check multi-arch docker image and manifest + - name: Assert - multi-arch docker image and manifest uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const assert = require("assert"); - const image = `${{ fromJson(needs.act-build-arch.outputs.built-images).test-multi-arch.images[0] }}`; + const image = `${{ fromJson(needs.act-build-images.outputs.built-images).test-multi-arch.images[0] }}`; await exec.exec('docker', ['pull', image]); @@ -194,13 +196,32 @@ jobs: assert.equal(annotations[key], value, `Expected annotation not found: ${key}`); }); - - name: Check mono-arch docker image + - uses: sigstore/cosign-installer@398d4b0eeef1380460a10c8013a76f728fb906ac # v3.9.1 + + - name: Assert - signed multi-arch docker image + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const images = ${{ toJson(fromJson(needs.act-build-images.outputs.built-images).test-multi-arch.images) }}; + + for(const image of images) { + await exec.exec( + 'cosign', + [ + 'verify', image, + '--certificate-oidc-issuer', 'https://token.actions.githubusercontent.com', + '--certificate-identity-regexp', 'https://github.com/hoverkraft-tech/ci-github-container', + ] + ); + } + + - name: Assert - mono-arch docker image uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const assert = require("assert"); - const image = `${{ fromJson(needs.act-build-arch.outputs.built-images).test-mono-arch.images[0] }}`; + const image = `${{ fromJson(needs.act-build-images.outputs.built-images).test-mono-arch.images[0] }}`; await exec.exec('docker', ['pull', image]); @@ -239,7 +260,25 @@ jobs: ); }); + - name: Assert - signed mono-arch docker image + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const images = ${{ toJson(fromJson(needs.act-build-images.outputs.built-images).test-mono-arch.images) }}; + + for(const image of images) { + await exec.exec( + 'cosign', + [ + 'verify', image, + '--certificate-oidc-issuer', 'https://token.actions.githubusercontent.com', + '--certificate-identity-regexp', 'https://github.com/hoverkraft-tech/ci-github-container', + ] + ); + } + act-build-args-secrets-and-registry-caching: + name: Act - Build with args, secrets and registry caching needs: arrange uses: ./.github/workflows/docker-build-images.yml secrets: @@ -275,6 +314,7 @@ jobs: SECRET_ENV_GITHUB_APP_TOKEN_2 assert-build-args-secrets-and-registry-caching: + name: Assert - Build with args, secrets and registry caching needs: act-build-args-secrets-and-registry-caching runs-on: "ubuntu-latest" steps: diff --git a/.github/workflows/docker-build-images.md b/.github/workflows/docker-build-images.md index 6c2e218b..6602073e 100644 --- a/.github/workflows/docker-build-images.md +++ b/.github/workflows/docker-build-images.md @@ -19,7 +19,7 @@ Needs the following permissions: - `issues`: `read` - `packages`: `write` - `pull-requests`: `read` -- `id-token`: `write` +- `id-token`: `write` @@ -39,7 +39,6 @@ permissions: issues: read packages: write pull-requests: read - # FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659 id-token: write jobs: diff --git a/.github/workflows/docker-build-images.yml b/.github/workflows/docker-build-images.yml index 5cea947b..ca6de261 100644 --- a/.github/workflows/docker-build-images.yml +++ b/.github/workflows/docker-build-images.yml @@ -137,7 +137,6 @@ permissions: issues: read packages: write pull-requests: read - # FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659 id-token: write jobs: @@ -500,3 +499,23 @@ jobs: oci-registry-username: ${{ inputs.oci-registry-username }} oci-registry-password: ${{ secrets.oci-registry-password }} built-images: ${{ steps.built-images.outputs.built-images }} + + - id: get-images-to-sign + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const builtImagesInput = `${{ steps.built-images.outputs.built-images }}`; + let builtImages = null; + try { + builtImages = JSON.parse(builtImagesInput); + } catch (error) { + throw new Error(`"built-images" input is not a valid JSON: ${error}`); + } + + // Get images to sign + const imagesToSign = Object.values(builtImages).map(image => image.images).flat(); + core.setOutput('images-to-sign', JSON.stringify(imagesToSign)); + - uses: ./self-workflow/actions/docker/sign-images + with: + images: ${{ steps.get-images-to-sign.outputs.images-to-sign }} + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/actions/docker/create-images-manifests/action.yml b/actions/docker/create-images-manifests/action.yml index 6bc6ad9a..0c4dbd84 100644 --- a/actions/docker/create-images-manifests/action.yml +++ b/actions/docker/create-images-manifests/action.yml @@ -91,12 +91,13 @@ runs: ) .flat().join(" "); - createManifestCommand = `docker buildx imagetools create ${annotations} ${tags} ${digests}`; + const createManifestCommand = `docker buildx imagetools create ${annotations} ${tags} ${digests}`; return new Promise(async (resolve, reject) => { try { await exec.exec(createManifestCommand); core.debug(`Create manifest for "${builtImage.name}" ("${createManifestCommand}") executed`); + resolve(); } catch(error){ reject(error); diff --git a/actions/docker/sign-images/README.md b/actions/docker/sign-images/README.md new file mode 100644 index 00000000..47a80742 --- /dev/null +++ b/actions/docker/sign-images/README.md @@ -0,0 +1,37 @@ + + +# branding<icon:package color:gray-dark> GitHub Action: Docker - Sign Images + + + + + + + + + + + + + +If default GitHub token is used, the following permissions are required: + +```yml +permissions: + id-token: write +``` + + + + + + + + + + + diff --git a/actions/docker/sign-images/action.yml b/actions/docker/sign-images/action.yml new file mode 100644 index 00000000..99341107 --- /dev/null +++ b/actions/docker/sign-images/action.yml @@ -0,0 +1,102 @@ +--- +name: "Docker - Sign images" +description: | + Action to sign OCI images. + It is based on [cosign](https://github.com/sigstore/cosign). + It signs the images with the GitHub Actions OIDC token. + If the provided image does not have a digest, it will retrieve the digest using `docker buildx imagetools inspect`. + +author: hoverkraft +branding: + icon: award + color: blue + +inputs: + images: + description: | + Images to sign. + Can be a single image or a list of images separated by commas or newlines or spaces. + The images should be in the format `ghcr.io/my-org/my-repo/application:pr-63-5222075`. + It can also be a list of images in JSON format. + Example: + ``` + [ + "ghcr.io/my-org/my-repo/application:pr-63-5222075", + "ghcr.io/my-org/my-repo/application:pr-63" + ] + ``` + required: true + github-token: + description: | + GitHub Token to sign the image. + Permissions: + - id-token: write + default: ${{ github.token }} + +runs: + using: "composite" + steps: + - uses: sigstore/cosign-installer@398d4b0eeef1380460a10c8013a76f728fb906ac # v3.9.1 + + - name: Sign the images with GitHub OIDC Token + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + github-token: ${{ inputs.github-token }} + script: | + const images = `${{ inputs.images }}`; + let imagesList = null; + try { + // Try to parse the input as JSON + imagesList = JSON.parse(images); + } catch (error) { + // If it fails, split the input by commas, newlines or spaces + imagesList = images.split(/[\s,]+/).filter(image => image.trim() !== ""); + } + + if (!Array.isArray(imagesList) || imagesList.length === 0) { + throw new Error(`"images" input is not a valid JSON array or a non-empty string: ${images}`); + } + + const getImageDigest = async function(image) { + // Check if the image already has a digest + if (image.match(/@/)) { + core.debug(`Image "${image}" already has a digest, skipping inspection.`); + return image; + } + + const inspectImageCommand = `docker buildx imagetools inspect ${image}`; + core.debug(`Inspecting image "${image}" with command: "${inspectImageCommand}"`); + + const { stdout } = await exec.getExecOutput(inspectImageCommand); + + core.debug(`Inspect image "${image}" ("${inspectImageCommand}") executed: ${stdout}`); + + if (!stdout) { + throw new Error(`Failed to retrieve manifest for image "${image}": "${inspectImageCommand}" returned empty output`); + } + + // Retrieve digest from the manifest + const digestRegex = /Digest:\s+([a-z0-9]+:[a-z0-9]{64})/; + const digestMatch = stdout.match(digestRegex); + if (!digestMatch || digestMatch.length < 2) { + throw new Error(`Failed to retrieve digest for image "${image}": "${inspectImageCommand}" returned unexpected output: ${stdout}`); + } + + const digest = digestMatch[1]; + if (!digest) { + throw new Error(`Failed to retrieve digest for image "${image}": "${inspectImageCommand}" returned empty digest`); + } + + core.debug(`Digest for image "${image}" is "${digest}"`); + return `${image}@${digest}`; + } + + // Wait for all images to be inspected and digests retrieved + const imagesWithDigests = await Promise.all(imagesList.map(image => getImageDigest(image))); + + // Create manifest for each image + const signImageCommand = `cosign sign --recursive --yes ${imagesWithDigests.map(image => `"${image}"`).join(" ")}`; + + core.debug(`Signing images with command: "${signImageCommand}"`); + await exec.exec(signImageCommand); + core.debug("All images signed successfully"); diff --git a/tests/charts/application/README.md b/tests/charts/application/README.md index 36717a55..1a13f553 100644 --- a/tests/charts/application/README.md +++ b/tests/charts/application/README.md @@ -6,66 +6,67 @@ A Helm chart for Kubernetes ## Requirements -| Repository | Name | Version | -|------------|------|---------| -| https://charts.bitnami.com/bitnami | mysql | 12.2.1 | +| Repository | Name | Version | +| ------------------------------------ | ----- | ------- | +| | MySQL | 12.2.1 | ## Values -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| application.dbConnection | string | `"mysql"` | | -| application.dbDatabase | string | `"test"` | | -| application.dbHost | string | `"mysql"` | | -| application.dbPassword | string | `"test"` | | -| application.dbPort | int | `3306` | | -| application.dbUsername | string | `"test"` | | -| autoscaling.enabled | bool | `false` | | -| autoscaling.maxReplicas | int | `100` | | -| autoscaling.minReplicas | int | `1` | | -| autoscaling.targetCPUUtilizationPercentage | int | `80` | | -| fullnameOverride | string | `""` | | -| image.digest | string | `"sha256:da3b65f32ea75f8041079d220b72da4f605738996256a7dc32715424cc117271"` | | -| image.pullPolicy | string | `"Always"` | | -| image.registry | string | `"ghcr.io"` | | -| image.repository | string | `"hoverkraft-tech/ci-github-container/application-test"` | | -| image.tag | string | `""` | | -| imagePullSecrets | list | `[]` | | -| ingress.annotations | object | `{}` | | -| ingress.className | string | `""` | | -| ingress.enabled | bool | `false` | | -| ingress.hosts[0].host | string | `"chart-example.local"` | | -| ingress.hosts[0].paths[0].path | string | `"/"` | | -| ingress.hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` | | -| ingress.tls | list | `[]` | | -| mysql.auth.database | string | `"test"` | | -| mysql.auth.password | string | `"test"` | | -| mysql.auth.rootPassword | string | `"root"` | | -| mysql.auth.username | string | `"test"` | | -| mysql.enabled | bool | `false` | | -| mysql.fullnameOverride | string | `"mysql"` | | -| nameOverride | string | `""` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podSecurityContext | object | `{}` | | -| replicaCount | int | `1` | | -| resources.limits.cpu | string | `"100m"` | | -| resources.limits.memory | string | `"128Mi"` | | -| resources.requests.cpu | string | `"100m"` | | -| resources.requests.memory | string | `"128Mi"` | | -| securityContext.allowPrivilegeEscalation | bool | `false` | | -| securityContext.capabilities.drop[0] | string | `"ALL"` | | -| securityContext.readOnlyRootFilesystem | bool | `true` | | -| securityContext.runAsNonRoot | bool | `true` | | -| securityContext.runAsUser | int | `10001` | | -| securityContext.seccompProfile.type | string | `"RuntimeDefault"` | | -| service.port | int | `8080` | | -| service.type | string | `"ClusterIP"` | | -| serviceAccount.annotations | object | `{}` | | -| serviceAccount.create | bool | `true` | | -| serviceAccount.name | string | `""` | | -| tolerations | list | `[]` | | +| Key | Type | Default | Description | +| ------------------------------------------ | ------ | --------------------------------------------------------------------------- | ----------- | +| affinity | object | `{}` | | +| application.dbConnection | string | `"mysql"` | | +| application.dbDatabase | string | `"test"` | | +| application.dbHost | string | `"mysql"` | | +| application.dbPassword | string | `"test"` | | +| application.dbPort | int | `3306` | | +| application.dbUsername | string | `"test"` | | +| autoscaling.enabled | bool | `false` | | +| autoscaling.maxReplicas | int | `100` | | +| autoscaling.minReplicas | int | `1` | | +| autoscaling.targetCPUUtilizationPercentage | int | `80` | | +| fullnameOverride | string | `""` | | +| image.digest | string | `"sha256:da3b65f32ea75f8041079d220b72da4f605738996256a7dc32715424cc117271"` | | +| image.pullPolicy | string | `"Always"` | | +| image.registry | string | `"ghcr.io"` | | +| image.repository | string | `"hoverkraft-tech/ci-github-container/application-test"` | | +| image.tag | string | `""` | | +| imagePullSecrets | list | `[]` | | +| ingress.annotations | object | `{}` | | +| ingress.className | string | `""` | | +| ingress.enabled | bool | `false` | | +| ingress.hosts[0].host | string | `"chart-example.local"` | | +| ingress.hosts[0].paths[0].path | string | `"/"` | | +| ingress.hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` | | +| ingress.tls | list | `[]` | | +| mysql.auth.database | string | `"test"` | | +| mysql.auth.password | string | `"test"` | | +| mysql.auth.rootPassword | string | `"root"` | | +| mysql.auth.username | string | `"test"` | | +| mysql.enabled | bool | `false` | | +| mysql.fullnameOverride | string | `"mysql"` | | +| nameOverride | string | `""` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podSecurityContext | object | `{}` | | +| replicaCount | int | `1` | | +| resources.limits.cpu | string | `"100m"` | | +| resources.limits.memory | string | `"128Mi"` | | +| resources.requests.cpu | string | `"100m"` | | +| resources.requests.memory | string | `"128Mi"` | | +| securityContext.allowPrivilegeEscalation | bool | `false` | | +| securityContext.capabilities.drop[0] | string | `"ALL"` | | +| securityContext.readOnlyRootFilesystem | bool | `true` | | +| securityContext.runAsNonRoot | bool | `true` | | +| securityContext.runAsUser | int | `10001` | | +| securityContext.seccompProfile.type | string | `"RuntimeDefault"` | | +| service.port | int | `8080` | | +| service.type | string | `"ClusterIP"` | | +| serviceAccount.annotations | object | `{}` | | +| serviceAccount.create | bool | `true` | | +| serviceAccount.name | string | `""` | | +| tolerations | list | `[]` | | + +--- ----------------------------------------------- Autogenerated from chart metadata using [helm-docs v1.14.2](https://github.com/norwoodj/helm-docs/releases/v1.14.2) diff --git a/tests/charts/umbrella-application/README.md b/tests/charts/umbrella-application/README.md index a123c44a..e7d03187 100644 --- a/tests/charts/umbrella-application/README.md +++ b/tests/charts/umbrella-application/README.md @@ -6,22 +6,23 @@ An umbrella Helm chart for Kubernetes ## Requirements -| Repository | Name | Version | -|------------|------|---------| -| file://./charts/app | app | 0.0.0 | -| https://charts.bitnami.com/bitnami | database(mysql) | 12.2.1 | +| Repository | Name | Version | +| ------------------------------------ | --------------- | ------- | +| file://./charts/app | app | 0.0.0 | +| | database(MySQL) | 12.2.1 | ## Values -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| app.enabled | bool | `true` | | -| database.auth.database | string | `"test-umbrella-application"` | | -| database.auth.username | string | `"test-umbrella-application"` | | -| database.enabled | bool | `true` | | -| database.fullnameOverride | string | `"database"` | | -| global.fullnameOverride | string | `""` | | -| global.nameOverride | string | `""` | | - ----------------------------------------------- +| Key | Type | Default | Description | +| ------------------------- | ------ | ----------------------------- | ----------- | +| app.enabled | bool | `true` | | +| database.auth.database | string | `"test-umbrella-application"` | | +| database.auth.username | string | `"test-umbrella-application"` | | +| database.enabled | bool | `true` | | +| database.fullnameOverride | string | `"database"` | | +| global.fullnameOverride | string | `""` | | +| global.nameOverride | string | `""` | | + +--- + Autogenerated from chart metadata using [helm-docs v1.14.2](https://github.com/norwoodj/helm-docs/releases/v1.14.2) diff --git a/tests/charts/umbrella-application/charts/app/README.md b/tests/charts/umbrella-application/charts/app/README.md index 4d807c81..2ac865bb 100644 --- a/tests/charts/umbrella-application/charts/app/README.md +++ b/tests/charts/umbrella-application/charts/app/README.md @@ -6,65 +6,66 @@ An umbrella Helm chart for Kubernetes (app component) ## Values -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| affinity | object | `{}` | | -| app.dbConnection | string | `"mysql"` | | -| app.dbDatabase | string | `"test"` | | -| app.dbHost | string | `"mysql"` | | -| app.dbPassword | string | `"test"` | | -| app.dbPort | int | `3306` | | -| app.dbUsername | string | `"test"` | | -| autoscaling.enabled | bool | `false` | | -| autoscaling.maxReplicas | int | `100` | | -| autoscaling.minReplicas | int | `1` | | -| autoscaling.targetCPUUtilizationPercentage | int | `80` | | -| autoscaling.targetMemoryUtilizationPercentage | int | `80` | | -| fullnameOverride | string | `""` | | -| image.digest | string | `"sha256:da3b65f32ea75f8041079d220b72da4f605738996256a7dc32715424cc117271"` | | -| image.pullPolicy | string | `"Always"` | | -| image.registry | string | `"ghcr.io"` | | -| image.repository | string | `"hoverkraft-tech/ci-github-container/application-test"` | | -| image.tag | string | `""` | | -| imagePullSecrets | list | `[]` | | -| ingress.annotations | object | `{}` | | -| ingress.className | string | `""` | | -| ingress.enabled | bool | `false` | | -| ingress.hosts[0].host | string | `"chart-example.local"` | | -| ingress.hosts[0].paths[0].path | string | `"/"` | | -| ingress.hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` | | -| ingress.tls | list | `[]` | | -| mysql.auth.database | string | `"test"` | | -| mysql.auth.password | string | `"test"` | | -| mysql.auth.rootPassword | string | `"root"` | | -| mysql.auth.username | string | `"test"` | | -| mysql.enabled | bool | `false` | | -| mysql.fullnameOverride | string | `"mysql"` | | -| nameOverride | string | `""` | | -| namespace | string | `"app-system"` | | -| networkPolicy.egress | list | `[]` | | -| networkPolicy.enabled | bool | `true` | | -| networkPolicy.ingress | list | `[]` | | -| nodeSelector | object | `{}` | | -| podAnnotations | object | `{}` | | -| podSecurityContext | object | `{}` | | -| replicaCount | int | `1` | | -| resources.limits.cpu | string | `"100m"` | | -| resources.limits.memory | string | `"128Mi"` | | -| resources.requests.cpu | string | `"100m"` | | -| resources.requests.memory | string | `"128Mi"` | | -| securityContext.allowPrivilegeEscalation | bool | `false` | | -| securityContext.capabilities.drop[0] | string | `"ALL"` | | -| securityContext.readOnlyRootFilesystem | bool | `true` | | -| securityContext.runAsNonRoot | bool | `true` | | -| securityContext.runAsUser | int | `10001` | | -| securityContext.seccompProfile.type | string | `"RuntimeDefault"` | | -| service.port | int | `8080` | | -| service.type | string | `"ClusterIP"` | | -| serviceAccount.annotations | object | `{}` | | -| serviceAccount.create | bool | `true` | | -| serviceAccount.name | string | `""` | | -| tolerations | list | `[]` | | +| Key | Type | Default | Description | +| --------------------------------------------- | ------ | --------------------------------------------------------------------------- | ----------- | +| affinity | object | `{}` | | +| app.dbConnection | string | `"mysql"` | | +| app.dbDatabase | string | `"test"` | | +| app.dbHost | string | `"mysql"` | | +| app.dbPassword | string | `"test"` | | +| app.dbPort | int | `3306` | | +| app.dbUsername | string | `"test"` | | +| autoscaling.enabled | bool | `false` | | +| autoscaling.maxReplicas | int | `100` | | +| autoscaling.minReplicas | int | `1` | | +| autoscaling.targetCPUUtilizationPercentage | int | `80` | | +| autoscaling.targetMemoryUtilizationPercentage | int | `80` | | +| fullnameOverride | string | `""` | | +| image.digest | string | `"sha256:da3b65f32ea75f8041079d220b72da4f605738996256a7dc32715424cc117271"` | | +| image.pullPolicy | string | `"Always"` | | +| image.registry | string | `"ghcr.io"` | | +| image.repository | string | `"hoverkraft-tech/ci-github-container/application-test"` | | +| image.tag | string | `""` | | +| imagePullSecrets | list | `[]` | | +| ingress.annotations | object | `{}` | | +| ingress.className | string | `""` | | +| ingress.enabled | bool | `false` | | +| ingress.hosts[0].host | string | `"chart-example.local"` | | +| ingress.hosts[0].paths[0].path | string | `"/"` | | +| ingress.hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` | | +| ingress.tls | list | `[]` | | +| mysql.auth.database | string | `"test"` | | +| mysql.auth.password | string | `"test"` | | +| mysql.auth.rootPassword | string | `"root"` | | +| mysql.auth.username | string | `"test"` | | +| mysql.enabled | bool | `false` | | +| mysql.fullnameOverride | string | `"mysql"` | | +| nameOverride | string | `""` | | +| namespace | string | `"app-system"` | | +| networkPolicy.egress | list | `[]` | | +| networkPolicy.enabled | bool | `true` | | +| networkPolicy.ingress | list | `[]` | | +| nodeSelector | object | `{}` | | +| podAnnotations | object | `{}` | | +| podSecurityContext | object | `{}` | | +| replicaCount | int | `1` | | +| resources.limits.cpu | string | `"100m"` | | +| resources.limits.memory | string | `"128Mi"` | | +| resources.requests.cpu | string | `"100m"` | | +| resources.requests.memory | string | `"128Mi"` | | +| securityContext.allowPrivilegeEscalation | bool | `false` | | +| securityContext.capabilities.drop[0] | string | `"ALL"` | | +| securityContext.readOnlyRootFilesystem | bool | `true` | | +| securityContext.runAsNonRoot | bool | `true` | | +| securityContext.runAsUser | int | `10001` | | +| securityContext.seccompProfile.type | string | `"RuntimeDefault"` | | +| service.port | int | `8080` | | +| service.type | string | `"ClusterIP"` | | +| serviceAccount.annotations | object | `{}` | | +| serviceAccount.create | bool | `true` | | +| serviceAccount.name | string | `""` | | +| tolerations | list | `[]` | | + +--- ----------------------------------------------- Autogenerated from chart metadata using [helm-docs v1.14.2](https://github.com/norwoodj/helm-docs/releases/v1.14.2)