Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-gitlabcis for
openSUSE:Factory checked in at 2026-03-16 14:17:39
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-gitlabcis (Old)
and /work/SRC/openSUSE:Factory/.python-gitlabcis.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-gitlabcis"
Mon Mar 16 14:17:39 2026 rev:8 rq:1339216 version:1.17.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-gitlabcis/python-gitlabcis.changes
2026-01-27 16:15:30.642029460 +0100
+++
/work/SRC/openSUSE:Factory/.python-gitlabcis.new.8177/python-gitlabcis.changes
2026-03-16 14:21:00.290444201 +0100
@@ -1,0 +2,13 @@
+Mon Mar 16 06:17:17 UTC 2026 - Johannes Kastl
<[email protected]>
+
+- update to 1.17.1:
+ * Fix
+ - fix: Remove instance error statements (37e7d3a)
+- update to 1.17.0:
+ * Feature
+ - feat: Group support for artifacts checks (#125) (f1a5ed0)
+- update to 1.16.0:
+ * Feature
+ - feat: Support GitLab inputs (#133 (closed)) (0c4b790)
+
+-------------------------------------------------------------------
Old:
----
gitlabcis-1.15.22.tar.gz
New:
----
gitlabcis-1.17.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-gitlabcis.spec ++++++
--- /var/tmp/diff_new_pack.kUe7bN/_old 2026-03-16 14:21:00.750463329 +0100
+++ /var/tmp/diff_new_pack.kUe7bN/_new 2026-03-16 14:21:00.754463496 +0100
@@ -17,7 +17,7 @@
Name: python-gitlabcis
-Version: 1.15.22
+Version: 1.17.1
Release: 0
Summary: An automated tool that assesses the GitLab CIS benchmarks
against a project
License: MIT
++++++ gitlabcis-1.15.22.tar.gz -> gitlabcis-1.17.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/.gitlab/.gitlab-ci.yml
new/gitlabcis-1.17.1/.gitlab/.gitlab-ci.yml
--- old/gitlabcis-1.15.22/.gitlab/.gitlab-ci.yml 2026-01-26
20:46:16.000000000 +0100
+++ new/gitlabcis-1.17.1/.gitlab/.gitlab-ci.yml 2026-03-16 01:39:40.000000000
+0100
@@ -5,9 +5,21 @@
# -----------------------------------------------------------------------------
workflow:
+
auto_cancel:
on_job_failure: all
+ rules:
+ # Run merge request pipelines only (not branch pipelines)
+ - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+ when: always
+ # Run branch pipelines only for main branch
+ - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "main"'
+ when: always
+ # Run scheduled jobs
+ - if: '$CI_PIPELINE_SOURCE == "schedule"'
+ when: always
+
# -----------------------------------------------------------------------------
# Stages:
# -----------------------------------------------------------------------------
@@ -76,8 +88,11 @@
- git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
# ensure that the angular commit msg type is followed
- git log --pretty=format:%s
$CI_MERGE_REQUEST_DIFF_BASE_SHA..$CI_COMMIT_SHA | commitlint --config
.commitlintrc
- only:
- - merge_requests
+ rules:
+ # Don't run on main pipelines:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ when: always
+ allow_failure: false
renovate:
stage: lint
@@ -86,8 +101,12 @@
- npm install -g renovate
- renovate-config-validator
rules:
- - changes:
- - renovate.json
+ # Don't run on main pipelines:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ changes:
+ - "renovate.json"
+ - ".tool-versions"
+ allow_failure: false
docs:
stage: lint
@@ -96,7 +115,12 @@
- npm install -g markdownlint-cli
- markdownlint **/*.md
rules:
- - when: always
+ # Don't run on main pipelines:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ changes:
+ - "**/*.md"
+ - "*.md"
+ allow_failure: false
codebase:flake8:
stage: lint
@@ -105,7 +129,13 @@
- make install
- venv/bin/tox -e flake8
rules:
- - when: always
+ # Don't run on main pipelines:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ changes:
+ - "**/*.py"
+ - "*.py"
+ - "pyproject.toml"
+ allow_failure: false
benchmarks:baseline:
stage: lint
@@ -114,7 +144,14 @@
- make install
- venv/bin/tox -e baseline
rules:
- - when: always
+ # Don't run on main pipelines:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ changes:
+ - "**/*.yml"
+ - "*.yml"
+ - "**/*.yaml"
+ - "*.yaml"
+ allow_failure: false
benchmarks:yamllint:
stage: lint
@@ -123,7 +160,14 @@
- make install
- venv/bin/tox -e yamllint
rules:
- - when: always
+ # Don't run on main pipelines:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ changes:
+ - "**/*.yml"
+ - "*.yml"
+ - "**/*.yaml"
+ - "*.yaml"
+ allow_failure: false
codebase:benchmarks:
stage: lint
@@ -132,7 +176,13 @@
- make install
- venv/bin/tox -e benchmarks
rules:
- - when: always
+ # Don't run on main pipelines:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ changes:
+ - "**/*.py"
+ - "*.py"
+ - "pyproject.toml"
+ allow_failure: false
# -----------------------------------------------------------------------------
# Build:
@@ -194,7 +244,13 @@
- make install
- venv/bin/tox -e py314
rules:
- - when: always
+ # Don't run on main pipelines:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ changes:
+ - "**/*.py"
+ - "*.py"
+ - "pyproject.toml"
+ allow_failure: false
python:3.13:
stage: compatibility
@@ -203,7 +259,13 @@
- make install
- venv/bin/tox -e py313
rules:
- - when: always
+ # Don't run on main pipelines:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ changes:
+ - "**/*.py"
+ - "*.py"
+ - "pyproject.toml"
+ allow_failure: false
python:3.12:
stage: compatibility
@@ -212,7 +274,13 @@
- make install
- venv/bin/tox -e py312
rules:
- - when: always
+ # Don't run on main pipelines:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ changes:
+ - "**/*.py"
+ - "*.py"
+ - "pyproject.toml"
+ allow_failure: false
python:3.11:
stage: compatibility
@@ -221,7 +289,13 @@
- make install
- venv/bin/tox -e py311
rules:
- - when: always
+ # Don't run on main pipelines:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ changes:
+ - "**/*.py"
+ - "*.py"
+ - "pyproject.toml"
+ allow_failure: false
python:3.10:
stage: compatibility
@@ -230,7 +304,13 @@
- make install
- venv/bin/tox -e py310
rules:
- - when: always
+ # Don't run on main pipelines:
+ - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+ changes:
+ - "**/*.py"
+ - "*.py"
+ - "pyproject.toml"
+ allow_failure: false
# -----------------------------------------------------------------------------
# GitLab & Pypi release using python-semantic-release
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/.gitlab/CODEOWNERS
new/gitlabcis-1.17.1/.gitlab/CODEOWNERS
--- old/gitlabcis-1.15.22/.gitlab/CODEOWNERS 2026-01-26 20:46:16.000000000
+0100
+++ new/gitlabcis-1.17.1/.gitlab/CODEOWNERS 2026-03-16 01:39:40.000000000
+0100
@@ -1,5 +1,5 @@
# Core:
-/ @smeadzinger @ayofan @nrosandich @nmcd @mjozenazemian @dmakovey @Joey_Khabie
+/ @ayofan @nrosandich @nmcd @mjozenazemian @dmakovey @Joey_Khabie
# Recommendations:
-/gitlabcis/recommendations @smeadzinger
+/gitlabcis/recommendations @ayofan @nrosandich @nmcd @mjozenazemian
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/.gitlab/duo/agent-config.yml
new/gitlabcis-1.17.1/.gitlab/duo/agent-config.yml
--- old/gitlabcis-1.15.22/.gitlab/duo/agent-config.yml 1970-01-01
01:00:00.000000000 +0100
+++ new/gitlabcis-1.17.1/.gitlab/duo/agent-config.yml 2026-03-16
01:39:40.000000000 +0100
@@ -0,0 +1,21 @@
+# GitLab Duo Agent Platform - Flow Execution Configuration
+# Docs: https://docs.gitlab.com/user/duo_agent_platform/flows/execution/
+
+# Docker image for flow execution in CI/CD.
+image: python:3.13-slim
+
+# Setup script runs before the flow executes.
+setup_script:
+ - apt-get update && apt-get install -y git make
+ - pip install --upgrade pip
+ - pip install ".[test,build]"
+
+# Cache pip downloads and the installed package across flow runs.
+cache:
+ key:
+ files:
+ - pyproject.toml
+ prefix: gitlabcis-deps
+ paths:
+ - .cache/pip
+ - venv/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/.markdownlintignore
new/gitlabcis-1.17.1/.markdownlintignore
--- old/gitlabcis-1.15.22/.markdownlintignore 2026-01-26 20:46:16.000000000
+0100
+++ new/gitlabcis-1.17.1/.markdownlintignore 2026-03-16 01:39:40.000000000
+0100
@@ -1,4 +1,5 @@
build
dist
venv
-CHANGELOG.md
\ No newline at end of file
+CHANGELOG.md
+AGENTS.md
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/AGENTS.md
new/gitlabcis-1.17.1/AGENTS.md
--- old/gitlabcis-1.15.22/AGENTS.md 1970-01-01 01:00:00.000000000 +0100
+++ new/gitlabcis-1.17.1/AGENTS.md 2026-03-16 01:39:40.000000000 +0100
@@ -0,0 +1,273 @@
+# AGENTS.md — Coding Agent Guidelines
+
+This file provides instructions and context for agentic coding assistants
working in this repository.
+
+---
+
+## Repository Overview
+
+`gitlabcis` is a Python CLI tool that audits GitLab projects/groups/instances
against CIS Benchmark security controls. It is structured as a Python package
with:
+- `gitlabcis/benchmarks/` — benchmark check implementations (one module per
CIS section)
+- `gitlabcis/cli/` — CLI entry point and argument parsing
+- `gitlabcis/recommendations/` — YAML files defining each benchmark check's
metadata
+- `gitlabcis/utils/` — shared utilities (CI config parsing, etc.)
+- `gitlabcis/tests/` — unit tests and input/CLI tests
+
+---
+
+## Environment Setup
+
+```sh
+make install # creates venv/, installs package with [test,build] extras,
sets up pre-commit hooks
+make clean # removes venv/, build artifacts, uninstalls package
+make build # clean + install + python -m build
+```
+
+Python version is pinned to **3.13** via `.tool-versions` (mise). The package
supports Python 3.10–3.14.
+
+---
+
+## Build, Lint, and Test Commands
+
+### Linting
+
+```sh
+venv/bin/tox -e flake8 # flake8 linting on gitlabcis/
+venv/bin/tox -e bandit # bandit security linting (excludes tests, .tox)
+venv/bin/tox -e yamllint # yamllint on gitlabcis/recommendations/
+```
+
+### Testing
+
+```sh
+# Run all tests (coverage):
+venv/bin/tox -e cover
+
+# Run only benchmark unit tests:
+venv/bin/tox -e benchmarks
+
+# Run only YAML recommendation baseline tests:
+venv/bin/tox -e baseline
+
+# Run all tox environments:
+venv/bin/tox
+```
+
+### Running a Single Test
+
+```sh
+# Single test file:
+venv/bin/pytest
gitlabcis/tests/unit/benchmarks/source_code_1/code_changes_1_1_test.py
+
+# Single test function:
+venv/bin/pytest
gitlabcis/tests/unit/benchmarks/source_code_1/code_changes_1_1_test.py::test_version_control
+
+# With verbose output:
+venv/bin/pytest -s -vv
gitlabcis/tests/unit/benchmarks/source_code_1/code_changes_1_1_test.py::test_version_control
+
+# Pass extra args through tox:
+venv/bin/tox -e benchmarks --
gitlabcis/tests/unit/benchmarks/source_code_1/code_changes_1_1_test.py::test_version_control
+```
+
+Note: test files use the `from conftest import run` import, so `pytest` must
be run from the repo root (not from inside `gitlabcis/`).
+
+### Pre-commit Hooks
+
+```sh
+pre-commit run --all-files # run all hooks: commitlint, markdownlint,
gitleaks, isort, black, flake8
+```
+
+---
+
+## Code Style Guidelines
+
+### Line Length
+
+**79 characters** (enforced by `black --line-length=79`). Use `# noqa: E501`
sparingly for unavoidable long lines.
+
+### Formatter
+
+`black` with `-S` flag (skip string normalization). **Single quotes are
predominant** — do not change quote style unless necessary.
+
+### Import Sorting
+
+`isort` (via pre-commit). Standard import order:
+1. Standard library
+2. Third-party libraries
+3. Local `gitlabcis` imports
+
+**Benchmark modules use deferred (inside-function) imports** — this is
intentional and must be preserved:
+
+```python
+def some_benchmark(glEntity, glObject, **kwargs):
+ from gitlab.exceptions import (GitlabAuthenticationError, GitlabGetError,
+ GitlabHttpError, GitlabListError)
+ from gitlabcis.utils import ci
+ ...
+```
+
+Only `cli/` and `utils/` modules use top-level imports.
+
+### File Headers
+
+Every Python source file begins with a 79-character separator comment:
+
+```python
+# -----------------------------------------------------------------------------
+```
+
+### Naming Conventions
+
+| Element | Convention | Example |
+|---|---|---|
+| Functions | `snake_case` | `sign_artifacts_in_build_pipeline` |
+| Classes | `PascalCase` | `GitlabCIS`, `CustomLogFilter` |
+| Local variables | `camelCase` | `glEntity`, `defaultBranch`,
`protectedBranches` |
+| Constants | `UPPER_SNAKE_CASE` | `MAX_WORKERS`, `OUTPUT_FORMATS`, `CHECK` |
+| Private helpers | `_snake_case` | `_checkCrosslinks`, `_staleBranches` |
+| Test files | `<module>_test.py` | `code_changes_1_1_test.py` (suffix, not
prefix) |
+
+### Comments
+
+Do **not** add comments unless they are truly necessary. Avoid inline
explanations.
+
+---
+
+## Benchmark Function Conventions
+
+Every function in `gitlabcis/benchmarks/` follows a strict pattern:
+
+### Signature
+
+```python
+def function_name(glEntity, glObject, **kwargs):
+ """
+ id: X.Y.Z
+ title: Human-readable title of the check
+ """
+```
+
+The docstring **must** contain `id:` and `title:` fields — this is validated
by tests in `tests/unit/benchmarks/function_test.py`.
+
+### Return Values
+
+All benchmark functions return a single-key dict:
+
+```python
+{True: 'Reason string'} # PASS
+{False: 'Reason string'} # FAIL
+{None: 'Reason string'} # SKIP (insufficient permissions, not applicable,
not implemented)
+```
+
+### Entity Type Dispatch
+
+```python
+if kwargs.get('isProject'):
+ # project-level logic
+elif kwargs.get('isGroup'):
+ return {None: 'Not yet implemented for groups'}
+elif kwargs.get('isInstance'):
+ return {None: 'Not applicable at instance level'}
+```
+
+### Error Handling Pattern
+
+```python
+except (GitlabHttpError, GitlabGetError, GitlabAuthenticationError) as e:
+ if e.response_code in [401, 403]:
+ return {None: 'Insufficient permissions'}
+ if e.response_code == 404:
+ return {None: 'Resource not found'}
+```
+
+Use `except AttributeError: return {None: 'Feature is not enabled'}` for
disabled features.
+
+Do **not** catch unhandled response codes — let them fall through (returns
`None` implicitly).
+
+---
+
+## Recommendation YAML Files
+
+Each benchmark check has a matching YAML file in
`gitlabcis/recommendations/<section>/`. Required keys (validated by
`tests/unit/yaml/`):
+
+```yaml
+id: X.Y.Z
+name: function_name_matching_benchmark_module
+title: Human-readable title
+profile: Level 1 or Level 2
+category: section name
+description: |
+ ...
+rationale: |
+ ...
+references: []
+```
+
+The `name:` field **must exactly match** the benchmark function name.
+
+---
+
+## Testing Conventions
+
+### Test Structure
+
+Tests live in `gitlabcis/tests/unit/benchmarks/<section>/` and are named
`<module>_test.py`.
+
+The `run()` helper from `conftest.py` is used to assert outcomes:
+
+```python
+from conftest import run
+from gitlabcis.benchmarks.source_code_1 import code_changes_1_1
+
+def test_some_function(glEntity, glObject):
+ test = code_changes_1_1.some_function
+
+ glEntity.some_attr = True
+ run(glEntity, glObject, test, True, **{'isProject': True})
+
+ glEntity.some_attr = False
+ run(glEntity, glObject, test, False, **{'isProject': True})
+
+ for kwargs in [{'isGroup': True}, {'isInstance': True}]:
+ run(glEntity, glObject, test, None, **kwargs)
+```
+
+### Available Fixtures (from `conftest.py`)
+
+```python
+glEntity # Mock() — represents a GitLab project/group/instance
+glObject # Mock() — represents the top-level gitlab.Gitlab client
+unauthorised # Mock(side_effect=GitlabGetError(response_code=401))
+gqlClient # patches gql.Client
+```
+
+### Mocking Pattern
+
+Use `from unittest.mock import Mock, patch`. For external API calls, set
attributes or side effects directly on `glEntity`:
+
+```python
+glEntity.some_method.return_value = [Mock()]
+glEntity.some_method.side_effect = GitlabHttpError('msg', response_code=403)
+```
+
+For utility functions, use `@patch('gitlabcis.utils.ci.searchConfig')`.
+
+---
+
+## Commit Message Convention
+
+Enforced by `commitlint` (Angular convention, max 72 char header):
+
+```
+<type>(<optional scope>): <subject in sentence-case or lower-case>
+```
+
+Allowed types: `build`, `chore`, `ci`, `docs`, `feat`, `fix`, `perf`,
`refactor`, `style`, `test`
+
+---
+
+## Bandit / Security Notes
+
+- `# nosec B506` is used for YAML loading with `GitLabYamlLoader` (a safe
custom loader)
+- Do not introduce `yaml.load()` without a safe loader
+- Do not log or expose secrets or tokens
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/CHANGELOG.md
new/gitlabcis-1.17.1/CHANGELOG.md
--- old/gitlabcis-1.15.22/CHANGELOG.md 2026-01-26 20:46:33.000000000 +0100
+++ new/gitlabcis-1.17.1/CHANGELOG.md 2026-03-16 01:39:57.000000000 +0100
@@ -1,5 +1,23 @@
# CHANGELOG
+## v1.17.1 (2026-03-16)
+
+### Fix
+
+* fix: Remove instance error statements
([`37e7d3a`](https://gitlab.com/gitlab-security-oss/cis/gitlabcis/-/commit/37e7d3aaa8cdb830bf0f254753404b76f826190d))
+
+## v1.17.0 (2026-03-15)
+
+### Feature
+
+* feat: Group support for artifacts checks (#125)
([`f1a5ed0`](https://gitlab.com/gitlab-security-oss/cis/gitlabcis/-/commit/f1a5ed001fd45c77073a3a08ded8d28626077b49))
+
+## v1.16.0 (2026-02-02)
+
+### Feature
+
+* feat: Support GitLab inputs (#133)
([`0c4b790`](https://gitlab.com/gitlab-security-oss/cis/gitlabcis/-/commit/0c4b790e19bbe8c3fffe0a3612fe7b90dfdb15ce))
+
## v1.15.22 (2026-01-26)
### Fix
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/PKG-INFO
new/gitlabcis-1.17.1/PKG-INFO
--- old/gitlabcis-1.15.22/PKG-INFO 2026-01-26 20:46:42.582966300 +0100
+++ new/gitlabcis-1.17.1/PKG-INFO 2026-03-16 01:40:06.635062000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: gitlabcis
-Version: 1.15.22
+Version: 1.17.1
Summary: An automated tool that assesses the GitLab CIS benchmarks against a
project.
Author-email: Nate Rosandich <[email protected]>, Neil McDonald
<[email protected]>, Mitra JozeNazemian
<[email protected]>
License: MIT License
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/docs/limitations.md
new/gitlabcis-1.17.1/docs/limitations.md
--- old/gitlabcis-1.15.22/docs/limitations.md 2026-01-26 20:46:16.000000000
+0100
+++ new/gitlabcis-1.17.1/docs/limitations.md 2026-03-16 01:39:40.000000000
+0100
@@ -79,13 +79,15 @@
| 3.1.7 | pin_dependency_version | `SKIP` by default as we cannot automate
this |
| 3.1.8 | packages_over_60_days_old | `SKIP` by default as we cannot automate
this |
| 3.2.4 | package_ownership_change | `SKIP` by default as we cannot ascertain
the relevant information programmatically. |
-| 4.1.1 | sign_artifacts_in_build_pipeline | `PASS` if every file in
artifacts.zip has a corresponding .sig file, indicating that the artifacts are
signed |
+| 4.1.1 | sign_artifacts_in_build_pipeline | `PASS` if every file in
artifacts.zip has a corresponding .sig file, indicating that the artifacts are
signed. `SKIP` for `Group` input types as there is no group-level pipeline
artifact API. |
| 4.1.2 | encrypt_artifacts_before_distribution | `SKIP` by default as we
cannot automate this |
| 4.1.3 | only_authorized_platforms_can_decrypt_artifacts | `SKIP` by default
as we cannot automate this |
| 4.2.1 | limit_certifying_artifacts | `SKIP` by default as we cannot automate
this |
| 4.2.2 | limit_artifact_uploaders | `PASS` if the number of members with
maintainer role or higher is below 20% or fewer than three. |
| 4.2.4 | external_auth_server | `SKIP` by default as we cannot automate this |
| 4.2.6 | minimum_package_registry_admins | `PASS` if the number of members
with reporter role or higher is below 40% or fewer than three. |
+| 4.3.1 | validate_signed_artifacts_on_upload | `SKIP` for `Group` input types
as commit signing status cannot be queried at the group level. |
+| 4.3.2 | all_artifact_versions_signed | `SKIP` for `Group` input types as
commit signing status cannot be queried at the group level. |
| 4.3.3 | audit_package_registry_config | `SKIP` by default as we cannot
automate this |
| 4.4.1 | artifact_origin_info | `SKIP` by default as we cannot automate this |
| 5.1.1 | separate_deployment_config | `PASS` if ci config yml file is
available and not in the root directory of this project |
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/gitlabcis/__init__.py
new/gitlabcis-1.17.1/gitlabcis/__init__.py
--- old/gitlabcis-1.15.22/gitlabcis/__init__.py 2026-01-26 20:46:33.000000000
+0100
+++ new/gitlabcis-1.17.1/gitlabcis/__init__.py 2026-03-16 01:39:57.000000000
+0100
@@ -9,4 +9,4 @@
# -------------------------------------------------------------------------
__author__ = '[email protected]'
-__version__ = '1.15.22' # noqa: E999
+__version__ = '1.17.1' # noqa: E999
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gitlabcis-1.15.22/gitlabcis/benchmarks/artifacts_4/access_to_artifacts_4_2.py
new/gitlabcis-1.17.1/gitlabcis/benchmarks/artifacts_4/access_to_artifacts_4_2.py
---
old/gitlabcis-1.15.22/gitlabcis/benchmarks/artifacts_4/access_to_artifacts_4_2.py
2026-01-26 20:46:16.000000000 +0100
+++
new/gitlabcis-1.17.1/gitlabcis/benchmarks/artifacts_4/access_to_artifacts_4_2.py
2026-03-16 01:39:40.000000000 +0100
@@ -24,7 +24,7 @@
from gitlab.exceptions import (GitlabAuthenticationError, GitlabGetError,
GitlabHttpError)
- if kwargs.get('isProject'):
+ if kwargs.get('isProject') or kwargs.get('isGroup'):
try:
members = glEntity.members.list(all=True)
maintainer_and_above = sum(
@@ -55,9 +55,6 @@
elif kwargs.get('isInstance'):
return {None: 'Not applicable at instance level'}
- elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for groups'}
-
# -------------------------------------------------------------------------
@@ -135,7 +132,7 @@
from gitlab.exceptions import (GitlabAuthenticationError, GitlabGetError,
GitlabHttpError)
- if kwargs.get('isProject'):
+ if kwargs.get('isProject') or kwargs.get('isGroup'):
try:
members = glEntity.members.list(all=True)
reporter_and_above = sum(
@@ -164,6 +161,3 @@
elif kwargs.get('isInstance'):
return {None: 'Not applicable at instance level'}
-
- elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for groups'}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gitlabcis-1.15.22/gitlabcis/benchmarks/artifacts_4/package_registries_4_3.py
new/gitlabcis-1.17.1/gitlabcis/benchmarks/artifacts_4/package_registries_4_3.py
---
old/gitlabcis-1.15.22/gitlabcis/benchmarks/artifacts_4/package_registries_4_3.py
2026-01-26 20:46:16.000000000 +0100
+++
new/gitlabcis-1.17.1/gitlabcis/benchmarks/artifacts_4/package_registries_4_3.py
2026-03-16 01:39:40.000000000 +0100
@@ -96,12 +96,9 @@
GitlabHttpError, GitlabListError)
try:
- if kwargs.get('isProject'):
+ if kwargs.get('isProject') or kwargs.get('isGroup'):
webhooks = glEntity.hooks.list(get_all=True)
- elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for groups'}
-
elif kwargs.get('isInstance'):
webhooks = glObject.hooks.list(get_all=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gitlabcis-1.15.22/gitlabcis/benchmarks/deployment_5/deployment_configuration_5_1.py
new/gitlabcis-1.17.1/gitlabcis/benchmarks/deployment_5/deployment_configuration_5_1.py
---
old/gitlabcis-1.15.22/gitlabcis/benchmarks/deployment_5/deployment_configuration_5_1.py
2026-01-26 20:46:16.000000000 +0100
+++
new/gitlabcis-1.17.1/gitlabcis/benchmarks/deployment_5/deployment_configuration_5_1.py
2026-03-16 01:39:40.000000000 +0100
@@ -95,7 +95,7 @@
return {None: 'Not applicable at instance level'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
# -------------------------------------------------------------------------
@@ -174,7 +174,7 @@
return {None: 'Not applicable at instance level'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
# -------------------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gitlabcis-1.15.22/gitlabcis/benchmarks/source_code_1/code_risks_1_5.py
new/gitlabcis-1.17.1/gitlabcis/benchmarks/source_code_1/code_risks_1_5.py
--- old/gitlabcis-1.15.22/gitlabcis/benchmarks/source_code_1/code_risks_1_5.py
2026-01-26 20:46:16.000000000 +0100
+++ new/gitlabcis-1.17.1/gitlabcis/benchmarks/source_code_1/code_risks_1_5.py
2026-03-16 01:39:40.000000000 +0100
@@ -74,7 +74,7 @@
return {None: 'This check requires validation'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
# -------------------------------------------------------------------------
@@ -165,7 +165,7 @@
return {None: 'Not applicable at instance level'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
# -------------------------------------------------------------------------
@@ -243,7 +243,7 @@
return {None: 'Not applicable at instance level'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
# -------------------------------------------------------------------------
@@ -322,7 +322,7 @@
return {None: 'Not applicable at instance level'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
# -------------------------------------------------------------------------
@@ -402,7 +402,7 @@
return {None: 'Not applicable at instance level'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
# -------------------------------------------------------------------------
@@ -481,7 +481,7 @@
return {None: 'Not applicable at instance level'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
# -------------------------------------------------------------------------
@@ -559,4 +559,4 @@
return {None: 'Not applicable at instance level'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gitlabcis-1.15.22/gitlabcis/benchmarks/source_code_1/contribution_access_1_3.py
new/gitlabcis-1.17.1/gitlabcis/benchmarks/source_code_1/contribution_access_1_3.py
---
old/gitlabcis-1.15.22/gitlabcis/benchmarks/source_code_1/contribution_access_1_3.py
2026-01-26 20:46:16.000000000 +0100
+++
new/gitlabcis-1.17.1/gitlabcis/benchmarks/source_code_1/contribution_access_1_3.py
2026-03-16 01:39:40.000000000 +0100
@@ -221,7 +221,7 @@
return {None: 'Not applicable at instance level'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
except (GitlabHttpError, GitlabGetError, GitlabAuthenticationError) as e:
if e.response_code in [401, 403]:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gitlabcis-1.15.22/gitlabcis/benchmarks/source_code_1/repository_management_1_2.py
new/gitlabcis-1.17.1/gitlabcis/benchmarks/source_code_1/repository_management_1_2.py
---
old/gitlabcis-1.15.22/gitlabcis/benchmarks/source_code_1/repository_management_1_2.py
2026-01-26 20:46:16.000000000 +0100
+++
new/gitlabcis-1.17.1/gitlabcis/benchmarks/source_code_1/repository_management_1_2.py
2026-03-16 01:39:40.000000000 +0100
@@ -33,7 +33,7 @@
return {None: 'Not applicable at instance level'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
except (GitlabHttpError, GitlabGetError, GitlabAuthenticationError) as e:
if e.response_code in [401, 403]:
@@ -135,7 +135,7 @@
return {None: 'Not applicable at instance level'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
except (GitlabHttpError, GitlabGetError, GitlabAuthenticationError,
GitlabListError) as e:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gitlabcis-1.15.22/gitlabcis/benchmarks/source_code_1/third_party_1_4.py
new/gitlabcis-1.17.1/gitlabcis/benchmarks/source_code_1/third_party_1_4.py
--- old/gitlabcis-1.15.22/gitlabcis/benchmarks/source_code_1/third_party_1_4.py
2026-01-26 20:46:16.000000000 +0100
+++ new/gitlabcis-1.17.1/gitlabcis/benchmarks/source_code_1/third_party_1_4.py
2026-03-16 01:39:40.000000000 +0100
@@ -88,7 +88,7 @@
return {None: 'Not applicable at instance level'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
# -------------------------------------------------------------------------
@@ -116,7 +116,7 @@
return {None: 'This check requires validation'}
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
except (GitlabHttpError, GitlabGetError, GitlabAuthenticationError,
GitlabListError) as e:
@@ -163,7 +163,7 @@
return verify_hooks(glObject.hooks.list(get_all=True))
elif kwargs.get('isGroup'):
- return {None: 'Not yet implemented for instances or groups'}
+ return {None: 'Not yet implemented for groups'}
except (GitlabHttpError, GitlabGetError, GitlabAuthenticationError,
GitlabListError) as e:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gitlabcis-1.15.22/gitlabcis/tests/unit/benchmarks/artifacts_4/access_to_artifacts_4_2_test.py
new/gitlabcis-1.17.1/gitlabcis/tests/unit/benchmarks/artifacts_4/access_to_artifacts_4_2_test.py
---
old/gitlabcis-1.15.22/gitlabcis/tests/unit/benchmarks/artifacts_4/access_to_artifacts_4_2_test.py
2026-01-26 20:46:16.000000000 +0100
+++
new/gitlabcis-1.17.1/gitlabcis/tests/unit/benchmarks/artifacts_4/access_to_artifacts_4_2_test.py
2026-03-16 01:39:40.000000000 +0100
@@ -24,35 +24,35 @@
test = access_to_artifacts_4_2.limit_artifact_uploaders
- kwargs = {'isProject': True}
- glEntity.members.list.return_value = [
- Mock(access_level=40),
- Mock(access_level=30),
- Mock(access_level=20),
- Mock(access_level=10),
- Mock(access_level=10)
- ]
- run(glEntity, glObject, test, True, **kwargs)
-
- glEntity.members.list.return_value = [
- Mock(access_level=40),
- Mock(access_level=40),
- Mock(access_level=40),
- Mock(access_level=30),
- Mock(access_level=20)
- ]
- run(glEntity, glObject, test, False, **kwargs)
+ for kwargs in [{'isProject': True}, {'isGroup': True}]:
- glEntity.members.list.side_effect = GitlabHttpError(response_code=403)
- run(glEntity, glObject, test, None, **kwargs)
+ glEntity.members.list.side_effect = None
+ glEntity.members.list.return_value = [
+ Mock(access_level=40),
+ Mock(access_level=30),
+ Mock(access_level=20),
+ Mock(access_level=10),
+ Mock(access_level=10)
+ ]
+ run(glEntity, glObject, test, True, **kwargs)
+
+ glEntity.members.list.return_value = [
+ Mock(access_level=40),
+ Mock(access_level=40),
+ Mock(access_level=40),
+ Mock(access_level=30),
+ Mock(access_level=20)
+ ]
+ run(glEntity, glObject, test, False, **kwargs)
- glEntity.members.list.side_effect = GitlabHttpError(response_code=418)
- assert test(glEntity, glObject, **kwargs) is None
-
- kwarg = [{'isGroup': True}, {'isInstance': True}]
- for kwargs in kwarg:
+ glEntity.members.list.side_effect = GitlabHttpError(response_code=403)
run(glEntity, glObject, test, None, **kwargs)
+ glEntity.members.list.side_effect = GitlabHttpError(response_code=418)
+ assert test(glEntity, glObject, **kwargs) is None
+
+ run(glEntity, glObject, test, None, **{'isInstance': True})
+
# -----------------------------------------------------------------------------
@@ -111,31 +111,31 @@
test = access_to_artifacts_4_2.minimum_package_registry_admins
- kwargs = {'isProject': True}
- glEntity.members.list.return_value = [
- Mock(access_level=40),
- Mock(access_level=10),
- Mock(access_level=10),
- Mock(access_level=10),
- Mock(access_level=10)
- ]
- run(glEntity, glObject, test, True, **kwargs)
-
- glEntity.members.list.return_value = [
- Mock(access_level=40),
- Mock(access_level=40),
- Mock(access_level=40),
- Mock(access_level=40),
- Mock(access_level=20)
- ]
- run(glEntity, glObject, test, False, **kwargs)
+ for kwargs in [{'isProject': True}, {'isGroup': True}]:
- glEntity.members.list.side_effect = GitlabHttpError(response_code=403)
- run(glEntity, glObject, test, None, **kwargs)
+ glEntity.members.list.side_effect = None
+ glEntity.members.list.return_value = [
+ Mock(access_level=40),
+ Mock(access_level=10),
+ Mock(access_level=10),
+ Mock(access_level=10),
+ Mock(access_level=10)
+ ]
+ run(glEntity, glObject, test, True, **kwargs)
+
+ glEntity.members.list.return_value = [
+ Mock(access_level=40),
+ Mock(access_level=40),
+ Mock(access_level=40),
+ Mock(access_level=40),
+ Mock(access_level=20)
+ ]
+ run(glEntity, glObject, test, False, **kwargs)
- glEntity.members.list.side_effect = GitlabHttpError(response_code=418)
- assert test(glEntity, glObject, **kwargs) is None
-
- kwarg = [{'isGroup': True}, {'isInstance': True}]
- for kwargs in kwarg:
+ glEntity.members.list.side_effect = GitlabHttpError(response_code=403)
run(glEntity, glObject, test, None, **kwargs)
+
+ glEntity.members.list.side_effect = GitlabHttpError(response_code=418)
+ assert test(glEntity, glObject, **kwargs) is None
+
+ run(glEntity, glObject, test, None, **{'isInstance': True})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gitlabcis-1.15.22/gitlabcis/tests/unit/benchmarks/artifacts_4/package_registries_4_3_test.py
new/gitlabcis-1.17.1/gitlabcis/tests/unit/benchmarks/artifacts_4/package_registries_4_3_test.py
---
old/gitlabcis-1.15.22/gitlabcis/tests/unit/benchmarks/artifacts_4/package_registries_4_3_test.py
2026-01-26 20:46:16.000000000 +0100
+++
new/gitlabcis-1.17.1/gitlabcis/tests/unit/benchmarks/artifacts_4/package_registries_4_3_test.py
2026-03-16 01:39:40.000000000 +0100
@@ -83,9 +83,9 @@
test = package_registries_4_3.secure_repo_webhooks
- kwarg = [{'isProject': True}, {'isInstance': True}]
-
- for kwargs in kwarg:
+ for kwargs in [
+ {'isProject': True}, {'isGroup': True}, {'isInstance': True}
+ ]:
secHookSSLVerify = Mock(
url='https://example.com', enable_ssl_verification=True)
@@ -96,32 +96,25 @@
unsecureHook = Mock(
url='http://example.com', enable_ssl_verification=False)
- print(kwargs)
+ glEntity.hooks.list.side_effect = None
+ glObject.hooks.list.side_effect = None
+
glEntity.hooks.list.return_value = []
glObject.hooks.list.return_value = []
run(glEntity, glObject, test, True, **kwargs)
- glEntity.hooks.list.return_value = [
- secHookSSLVerify]
- glObject.hooks.list.return_value = [
- secHookSSLVerify]
+ glEntity.hooks.list.return_value = [secHookSSLVerify]
+ glObject.hooks.list.return_value = [secHookSSLVerify]
run(glEntity, glObject, test, True, **kwargs)
- glEntity.hooks.list.return_value = [
- secHookNoSSLVerify]
- glObject.hooks.list.return_value = [
- secHookNoSSLVerify]
+ glEntity.hooks.list.return_value = [secHookNoSSLVerify]
+ glObject.hooks.list.return_value = [secHookNoSSLVerify]
run(glEntity, glObject, test, False, **kwargs)
- glEntity.hooks.list.return_value = [
- unsecureHook]
- glObject.hooks.list.return_value = [
- unsecureHook]
+ glEntity.hooks.list.return_value = [unsecureHook]
+ glObject.hooks.list.return_value = [unsecureHook]
run(glEntity, glObject, test, False, **kwargs)
- kwarg = [{'isProject': True}, {'isInstance': True}]
-
- for kwargs in kwarg:
glEntity.hooks.list.side_effect = GitlabHttpError(response_code=403)
glObject.hooks.list.side_effect = GitlabHttpError(response_code=403)
run(glEntity, glObject, test, None, **kwargs)
@@ -129,5 +122,3 @@
glEntity.hooks.list.side_effect = GitlabHttpError(response_code=418)
glObject.hooks.list.side_effect = GitlabHttpError(response_code=418)
assert test(glEntity, glObject, **kwargs) is None
-
- run(glEntity, glObject, test, None, **{'isGroup': True})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gitlabcis-1.15.22/gitlabcis/tests/unit/utils/ci_test.py
new/gitlabcis-1.17.1/gitlabcis/tests/unit/utils/ci_test.py
--- old/gitlabcis-1.15.22/gitlabcis/tests/unit/utils/ci_test.py 2026-01-26
20:46:16.000000000 +0100
+++ new/gitlabcis-1.17.1/gitlabcis/tests/unit/utils/ci_test.py 2026-03-16
01:39:40.000000000 +0100
@@ -6,7 +6,7 @@
from gitlab.exceptions import GitlabAuthenticationError, GitlabGetError
from gitlab.v4.objects.files import ProjectFile
-from gitlabcis.utils.ci import getConfig, searchConfig
+from gitlabcis.utils.ci import getConfig, safeLoad, searchConfig
# -----------------------------------------------------------------------------
@@ -154,3 +154,56 @@
response_code=418)
result = getConfig(glEntity, glObject)
assert result == {None: 'Insufficient permissions'}
+
+
+def test_safeLoad():
+ result = safeLoad("""
+stages:
+ - stage1
+job:
+ stage: stage1
+ script:
+ - exit 0""")
+ assert result["job"]["stage"] == "stage1"
+ assert result["job"]["script"][0] == "exit 0"
+
+
+def test_safeLoad_inputs():
+ result = safeLoad("""
+spec:
+ inputs:
+ example:
+ default: foo
+ options:
+ - foo
+ - bar
+---
+stages:
+ - stage1
+job:
+ stage: stage1
+ script:
+ - exit 0""")
+ assert result["job"]["stage"] == "stage1"
+ assert result["job"]["script"][0] == "exit 0"
+
+
+def test_safeLoad_invalid():
+ result = safeLoad("""
+spec:
+ inputs:
+ example:
+ default: foo
+ options:
+ - foo
+ - bar
+---
+stages:
+ - stage1
+job:
+ stage: stage1
+ script:
+ - exit 0
+---
+foo: bar""")
+ assert result == {None: 'Could not load CI config file'}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/gitlabcis/utils/ci.py
new/gitlabcis-1.17.1/gitlabcis/utils/ci.py
--- old/gitlabcis-1.15.22/gitlabcis/utils/ci.py 2026-01-26 20:46:16.000000000
+0100
+++ new/gitlabcis-1.17.1/gitlabcis/utils/ci.py 2026-03-16 01:39:40.000000000
+0100
@@ -158,8 +158,16 @@
# We exclude Bandit's yaml load, as we _are_ using the SafeLoader
# but we're monkey patching it to allow !reference tags.
# (nosec B506)
- return yaml.load(ciConfigObject, Loader=GitLabYamlLoader) # nosec B506
+ yamlDocs = list(yaml.load_all(ciConfigObject,
Loader=GitLabYamlLoader)) # noqa: E501, nosec B506
+ if len(yamlDocs) == 1:
+ return yamlDocs[0]
+ # This .gitlab-ci.yml probably uses inputs
+ # https://docs.gitlab.com/ci/inputs/
+ elif len(yamlDocs) == 2:
+ return yamlDocs[1]
+ else:
+ raise yaml.constructor.ConstructorError
except yaml.constructor.ConstructorError:
logging.error('Failed to load the CI config file')
return {None: 'Could not load CI config file'}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/gitlabcis.egg-info/PKG-INFO
new/gitlabcis-1.17.1/gitlabcis.egg-info/PKG-INFO
--- old/gitlabcis-1.15.22/gitlabcis.egg-info/PKG-INFO 2026-01-26
20:46:42.000000000 +0100
+++ new/gitlabcis-1.17.1/gitlabcis.egg-info/PKG-INFO 2026-03-16
01:40:06.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: gitlabcis
-Version: 1.15.22
+Version: 1.17.1
Summary: An automated tool that assesses the GitLab CIS benchmarks against a
project.
Author-email: Nate Rosandich <[email protected]>, Neil McDonald
<[email protected]>, Mitra JozeNazemian
<[email protected]>
License: MIT License
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/gitlabcis.egg-info/SOURCES.txt
new/gitlabcis-1.17.1/gitlabcis.egg-info/SOURCES.txt
--- old/gitlabcis-1.15.22/gitlabcis.egg-info/SOURCES.txt 2026-01-26
20:46:42.000000000 +0100
+++ new/gitlabcis-1.17.1/gitlabcis.egg-info/SOURCES.txt 2026-03-16
01:40:06.000000000 +0100
@@ -6,6 +6,7 @@
.pypirc
.tool-versions
.yamllint.yml
+AGENTS.md
CHANGELOG.md
CONTRIBUTING.md
LICENSE
@@ -17,6 +18,7 @@
renovate.json
.gitlab/.gitlab-ci.yml
.gitlab/CODEOWNERS
+.gitlab/duo/agent-config.yml
.gitlab/issue_templates/bug.md
.gitlab/issue_templates/feature.md
.gitlab/issue_templates/vuln.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gitlabcis-1.15.22/pyproject.toml
new/gitlabcis-1.17.1/pyproject.toml
--- old/gitlabcis-1.15.22/pyproject.toml 2026-01-26 20:46:33.000000000
+0100
+++ new/gitlabcis-1.17.1/pyproject.toml 2026-03-16 01:39:57.000000000 +0100
@@ -12,7 +12,7 @@
[project]
name = "gitlabcis"
-version = "1.15.22"
+version = "1.17.1"
requires-python = ">=3.10"
description = "An automated tool that assesses the GitLab CIS benchmarks
against a project."
authors = [