gitlabform 5.5.4__tar.gz → 5.5.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. {gitlabform-5.5.4 → gitlabform-5.5.6}/.github/workflows/_main.yml +13 -15
  2. gitlabform-5.5.6/.github/workflows/_releases.yml +203 -0
  3. gitlabform-5.5.6/.github/workflows/build.yml +84 -0
  4. gitlabform-5.5.4/.github/workflows/prs.yml → gitlabform-5.5.6/.github/workflows/pr-ci-workflow.yml +25 -41
  5. gitlabform-5.5.6/.github/workflows/prs-entrypoint-forks.yml +34 -0
  6. gitlabform-5.5.6/.github/workflows/prs-entrypoint-main.yml +34 -0
  7. gitlabform-5.5.6/.github/workflows/static-analysis.yml +56 -0
  8. gitlabform-5.5.6/.github/workflows/tests-acceptance.yml +91 -0
  9. gitlabform-5.5.6/.github/workflows/tests-unit.yml +49 -0
  10. {gitlabform-5.5.4 → gitlabform-5.5.6}/PKG-INFO +4 -4
  11. gitlabform-5.5.6/dev/docker.py +47 -0
  12. {gitlabform-5.5.4 → gitlabform-5.5.6}/dev/main.py +59 -16
  13. gitlabform-5.5.4/dev/release.py → gitlabform-5.5.6/dev/package.py +5 -65
  14. gitlabform-5.5.6/dev/release.py +275 -0
  15. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/changelog.md +29 -0
  16. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/contrib/releases.md +2 -0
  17. gitlabform-5.5.6/docs/images/Opencast-logo.png +0 -0
  18. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/index.md +2 -1
  19. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/files.md +43 -1
  20. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/files_processor.py +145 -108
  21. {gitlabform-5.5.4 → gitlabform-5.5.6}/pyproject.toml +14 -13
  22. {gitlabform-5.5.4 → gitlabform-5.5.6}/tbump.toml +1 -1
  23. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_branches.py +52 -1
  24. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_files.py +176 -0
  25. gitlabform-5.5.6/tests/unit/processors/test_files_processor.py +312 -0
  26. {gitlabform-5.5.4 → gitlabform-5.5.6}/uv.lock +218 -221
  27. gitlabform-5.5.4/.github/workflows/_releases.yml +0 -157
  28. gitlabform-5.5.4/.github/workflows/docs.yml +0 -28
  29. gitlabform-5.5.4/.github/workflows/linters.yml +0 -67
  30. gitlabform-5.5.4/.github/workflows/pr_on_fork.yml +0 -29
  31. gitlabform-5.5.4/.github/workflows/pr_on_main_repo.yml +0 -29
  32. gitlabform-5.5.4/.github/workflows/tests-premium.yml +0 -56
  33. gitlabform-5.5.4/.github/workflows/tests-standard.yml +0 -176
  34. gitlabform-5.5.4/.github/workflows/tests-ultimate.yml +0 -59
  35. {gitlabform-5.5.4 → gitlabform-5.5.6}/.coveragerc +0 -0
  36. {gitlabform-5.5.4 → gitlabform-5.5.6}/.dockerignore +0 -0
  37. {gitlabform-5.5.4 → gitlabform-5.5.6}/.git-blame-ignore-revs +0 -0
  38. {gitlabform-5.5.4 → gitlabform-5.5.6}/.github/CODEOWNERS +0 -0
  39. {gitlabform-5.5.4 → gitlabform-5.5.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  40. {gitlabform-5.5.4 → gitlabform-5.5.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  41. {gitlabform-5.5.4 → gitlabform-5.5.6}/.github/ISSUE_TEMPLATE/question-or-other-issue.md +0 -0
  42. {gitlabform-5.5.4 → gitlabform-5.5.6}/.github/actions/setup-uv-local/README.md +0 -0
  43. {gitlabform-5.5.4 → gitlabform-5.5.6}/.github/actions/setup-uv-local/action.yml +0 -0
  44. {gitlabform-5.5.4 → gitlabform-5.5.6}/.github/dependabot.yml +0 -0
  45. {gitlabform-5.5.4 → gitlabform-5.5.6}/.gitignore +0 -0
  46. {gitlabform-5.5.4 → gitlabform-5.5.6}/.lgtm.yml +0 -0
  47. {gitlabform-5.5.4 → gitlabform-5.5.6}/.mypy.ini +0 -0
  48. {gitlabform-5.5.4 → gitlabform-5.5.6}/.overrides/gitlabform-logo-favicon.png +0 -0
  49. {gitlabform-5.5.4 → gitlabform-5.5.6}/.overrides/gitlabform-logo-favicon.svg +0 -0
  50. {gitlabform-5.5.4 → gitlabform-5.5.6}/.python-version +0 -0
  51. {gitlabform-5.5.4 → gitlabform-5.5.6}/CONTRIBUTING.md +0 -0
  52. {gitlabform-5.5.4 → gitlabform-5.5.6}/Dockerfile +0 -0
  53. {gitlabform-5.5.4 → gitlabform-5.5.6}/LICENSE +0 -0
  54. {gitlabform-5.5.4 → gitlabform-5.5.6}/README.md +0 -0
  55. {gitlabform-5.5.4 → gitlabform-5.5.6}/codecov.yml +0 -0
  56. {gitlabform-5.5.4 → gitlabform-5.5.6}/dev/__init__.py +0 -0
  57. {gitlabform-5.5.4 → gitlabform-5.5.6}/dev/common.py +0 -0
  58. {gitlabform-5.5.4 → gitlabform-5.5.6}/dev/docs.py +0 -0
  59. {gitlabform-5.5.4 → gitlabform-5.5.6}/dev/env.py +0 -0
  60. {gitlabform-5.5.4 → gitlabform-5.5.6}/dev/gitlab/await-healthy.sh +0 -0
  61. {gitlabform-5.5.4 → gitlabform-5.5.6}/dev/gitlab/gitlab.rb +0 -0
  62. {gitlabform-5.5.4 → gitlabform-5.5.6}/dev/gitlab/healthcheck-and-setup.sh +0 -0
  63. {gitlabform-5.5.4 → gitlabform-5.5.6}/dev/gitlab/run_gitlab_in_docker.sh +0 -0
  64. {gitlabform-5.5.4 → gitlabform-5.5.6}/dev/gitlab/tests.Dockerfile +0 -0
  65. {gitlabform-5.5.4 → gitlabform-5.5.6}/dev/infra.py +0 -0
  66. {gitlabform-5.5.4 → gitlabform-5.5.6}/dev/qa.py +0 -0
  67. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/automation.md +0 -0
  68. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/contrib/coding_guidelines.md +0 -0
  69. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/contrib/implementation_design.md +0 -0
  70. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/contrib/index.md +0 -0
  71. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/contrib/local_development.md +0 -0
  72. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/contrib/workflows.md +0 -0
  73. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/features.md +0 -0
  74. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/images/egnyte-logo.svg +0 -0
  75. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/images/elastic-path-logo.svg +0 -0
  76. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/images/gitlabform-logo-square.png +0 -0
  77. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/images/gitlabform-logo.png +0 -0
  78. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/images/gitlabform-logo.svg +0 -0
  79. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/images/group-ldap-links-provider.png +0 -0
  80. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/images/liquidlight-logo.svg +0 -0
  81. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/images/roche-logo.png +0 -0
  82. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/images/stroeer-online-marketing-logo.svg +0 -0
  83. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/installation.md +0 -0
  84. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/archive_unarchive.md +0 -0
  85. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/avatar.md +0 -0
  86. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/badges.md +0 -0
  87. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/ci_cd_variables.md +0 -0
  88. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/deploy_keys.md +0 -0
  89. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/group_ldap_links.md +0 -0
  90. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/group_saml_links.md +0 -0
  91. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/index.md +0 -0
  92. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/integrations.md +0 -0
  93. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/job_token_scope.md +0 -0
  94. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/labels.md +0 -0
  95. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/members.md +0 -0
  96. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/merge_requests.md +0 -0
  97. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/pipeline_schedules.md +0 -0
  98. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/project_security_settings.md +0 -0
  99. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/project_transfer.md +0 -0
  100. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/protected_branches.md +0 -0
  101. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/protected_environments.md +0 -0
  102. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/push_mirrors.md +0 -0
  103. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/push_rules.md +0 -0
  104. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/resource_groups.md +0 -0
  105. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/settings.md +0 -0
  106. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/tags_protection.md +0 -0
  107. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/reference/webhooks.md +0 -0
  108. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/requirements.md +0 -0
  109. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/running.md +0 -0
  110. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/similar_apps.md +0 -0
  111. {gitlabform-5.5.4 → gitlabform-5.5.6}/docs/upgrade.md +0 -0
  112. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlab-config/config.yml +0 -0
  113. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlab-config/gitlab-config.md +0 -0
  114. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/__init__.py +0 -0
  115. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/configuration/__init__.py +0 -0
  116. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/configuration/common.py +0 -0
  117. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/configuration/core.py +0 -0
  118. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/configuration/groups.py +0 -0
  119. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/configuration/projects.py +0 -0
  120. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/configuration/transform.py +0 -0
  121. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/constants.py +0 -0
  122. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/__init__.py +0 -0
  123. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/commits.py +0 -0
  124. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/core.py +0 -0
  125. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/group_badges.py +0 -0
  126. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/group_ldap_links.py +0 -0
  127. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/groups.py +0 -0
  128. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/merge_requests.py +0 -0
  129. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/pipelines.py +0 -0
  130. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/project_badges.py +0 -0
  131. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/project_deploy_keys.py +0 -0
  132. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/project_merge_requests_approvals.py +0 -0
  133. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/project_protected_environments.py +0 -0
  134. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/projects.py +0 -0
  135. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/python_gitlab.py +0 -0
  136. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/gitlab/variables.py +0 -0
  137. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/lists/__init__.py +0 -0
  138. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/lists/filter.py +0 -0
  139. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/lists/groups.py +0 -0
  140. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/lists/projects.py +0 -0
  141. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/output.py +0 -0
  142. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/__init__.py +0 -0
  143. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/abstract_processor.py +0 -0
  144. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/application/__init__.py +0 -0
  145. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/application/application_settings_processor.py +0 -0
  146. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/defining_keys.py +0 -0
  147. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/group/__init__.py +0 -0
  148. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/group/group_badges_processor.py +0 -0
  149. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/group/group_hooks_processor.py +0 -0
  150. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/group/group_labels_processor.py +0 -0
  151. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/group/group_ldap_links_processor.py +0 -0
  152. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/group/group_members_processor.py +0 -0
  153. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/group/group_protected_branches_processor.py +0 -0
  154. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/group/group_push_rules_processor.py +0 -0
  155. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/group/group_saml_links_processor.py +0 -0
  156. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/group/group_settings_processor.py +0 -0
  157. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/group/group_variables_processor.py +0 -0
  158. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/multiple_entities_processor.py +0 -0
  159. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/__init__.py +0 -0
  160. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/badges_processor.py +0 -0
  161. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/branches_processor.py +0 -0
  162. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/deploy_keys_processor.py +0 -0
  163. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/hooks_processor.py +0 -0
  164. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/integrations_processor.py +0 -0
  165. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/job_token_scope_processor.py +0 -0
  166. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/members_processor.py +0 -0
  167. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/merge_requests_approval_rules.py +0 -0
  168. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/merge_requests_approvals.py +0 -0
  169. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/project_labels_processor.py +0 -0
  170. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/project_processor.py +0 -0
  171. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/project_push_rules_processor.py +0 -0
  172. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/project_security_settings.py +0 -0
  173. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/project_settings_processor.py +0 -0
  174. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/project_variables_processor.py +0 -0
  175. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/remote_mirrors_processor.py +0 -0
  176. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/resource_groups_processor.py +0 -0
  177. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/schedules_processor.py +0 -0
  178. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/project/tags_processor.py +0 -0
  179. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/shared/__init__.py +0 -0
  180. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/shared/protected_environments_processor.py +0 -0
  181. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/util/__init__.py +0 -0
  182. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/util/branch_protection.py +0 -0
  183. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/util/decorators.py +0 -0
  184. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/util/difference_logger.py +0 -0
  185. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/util/labels_processor.py +0 -0
  186. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/processors/util/variables_processor.py +0 -0
  187. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/run.py +0 -0
  188. {gitlabform-5.5.4 → gitlabform-5.5.6}/gitlabform/util.py +0 -0
  189. {gitlabform-5.5.4 → gitlabform-5.5.6}/mkdocs.yml +0 -0
  190. {gitlabform-5.5.4 → gitlabform-5.5.6}/prek.toml +0 -0
  191. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/__init__.py +0 -0
  192. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/__init__.py +0 -0
  193. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/conftest.py +0 -0
  194. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_branches.py +0 -0
  195. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_branches_users_case_insensitive.py +0 -0
  196. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_group_ldap_links.py +0 -0
  197. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_group_protected_branches.py +0 -0
  198. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_group_push_rules.py +0 -0
  199. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_group_saml_links.py +0 -0
  200. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_group_settings.py +0 -0
  201. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_group_variables.py +0 -0
  202. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_merge_request_approval_rules.py +0 -0
  203. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_merge_request_approvals_settings.py +0 -0
  204. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_protected_environments.py +0 -0
  205. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_push_rules.py +0 -0
  206. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/premium/test_tags.py +0 -0
  207. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/__init__.py +0 -0
  208. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_application_settings.py +0 -0
  209. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_archive_project.py +0 -0
  210. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_badges.py +0 -0
  211. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_deploy_keys.py +0 -0
  212. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_deploy_keys_all_projects.py +0 -0
  213. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_files_templates.py +0 -0
  214. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_group_avatar.py +0 -0
  215. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_group_badges.py +0 -0
  216. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_group_hooks.py +0 -0
  217. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_group_labels.py +0 -0
  218. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_group_members_case_insensitive.py +0 -0
  219. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_group_members_groups.py +0 -0
  220. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_group_members_users.py +0 -0
  221. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_group_settings.py +0 -0
  222. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_group_variables.py +0 -0
  223. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_hooks.py +0 -0
  224. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_integrations.py +0 -0
  225. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_job_token_scope.py +0 -0
  226. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_members.py +0 -0
  227. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_members_add_group.py +0 -0
  228. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_members_enforce.py +0 -0
  229. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_project_avatar.py +0 -0
  230. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_project_group_members_case_insensitive.py +0 -0
  231. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_project_labels.py +0 -0
  232. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_project_members_case_insensitve.py +0 -0
  233. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_project_settings.py +0 -0
  234. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_project_variables.py +0 -0
  235. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_remote_mirrors.py +0 -0
  236. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_resource_groups.py +0 -0
  237. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_running.py +0 -0
  238. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_scheduled_for_deletion_project.py +0 -0
  239. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_schedules.py +0 -0
  240. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_tags.py +0 -0
  241. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_token_from_config.py +0 -0
  242. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/standard/test_transfer_project.py +0 -0
  243. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/ultimate/test_group_members.py +0 -0
  244. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/ultimate/test_group_settings.py +0 -0
  245. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/ultimate/test_members.py +0 -0
  246. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/ultimate/test_project_security_settings.py +0 -0
  247. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/acceptance/ultimate/test_project_settings.py +0 -0
  248. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/__init__.py +0 -0
  249. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/__init__.py +0 -0
  250. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/test_case_sensitivity.py +0 -0
  251. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/test_inheritance_break_projects_and_groups.py +0 -0
  252. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/test_inheritance_break_subgroups.py +0 -0
  253. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/test_inheritance_break_validation.py +0 -0
  254. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/test_projects_and_groups.py +0 -0
  255. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/test_skip_groups_skip_projects.py +0 -0
  256. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/test_subgroups.py +0 -0
  257. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/test_yaml_version.py +0 -0
  258. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/transform/test_access_level_transformer.py +0 -0
  259. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/transform/test_group_transformer.py +0 -0
  260. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/transform/test_implicit_name_transformer.py +0 -0
  261. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/transform/test_user_and_group_transformers.py +0 -0
  262. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/configuration/transform/test_user_transformer.py +0 -0
  263. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/gitlab/test_core.py +0 -0
  264. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/gitlab/test_python_gitlab.py +0 -0
  265. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/processors/__init__.py +0 -0
  266. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/processors/test_abstract_processor.py +0 -0
  267. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/processors/test_abstract_processors.py +0 -0
  268. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/processors/test_branches_processor.py +0 -0
  269. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/processors/test_difference_logger.py +0 -0
  270. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/processors/test_group_protected_branches_processor.py +0 -0
  271. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/processors/test_schedules_processor_extended_cron_pattern.py +0 -0
  272. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/test_access_levels.py +0 -0
  273. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/test_non_empty_configs_provider.py +0 -0
  274. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/test_parse_args.py +0 -0
  275. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/test_projects_provider.py +0 -0
  276. {gitlabform-5.5.4 → gitlabform-5.5.6}/tests/unit/test_utils.py +0 -0
@@ -18,31 +18,29 @@ on:
18
18
 
19
19
  jobs:
20
20
 
21
- build-docs:
22
- uses: ./.github/workflows/docs.yml
21
+ build:
22
+ name: Build
23
+ uses: ./.github/workflows/build.yml
23
24
  with:
24
25
  BRANCH_REF: ${{ github.ref }}
25
26
 
26
- linters:
27
- uses: ./.github/workflows/linters.yml
27
+ static-analysis:
28
+ name: Lint
29
+ uses: ./.github/workflows/static-analysis.yml
28
30
  with:
29
31
  BRANCH_REF: ${{ github.ref }}
30
32
 
31
- tests-standard:
32
- uses: ./.github/workflows/tests-standard.yml
33
+ tests:
34
+ name: Tests
35
+ uses: ./.github/workflows/tests-unit.yml
33
36
  with:
34
37
  BRANCH_REF: ${{ github.ref }}
35
-
36
- tests-premium:
37
- uses: ./.github/workflows/tests-premium.yml
38
- with:
39
- BRANCH_REF: ${{ github.ref }}
40
- environment: Main Tests
41
38
  secrets: inherit
42
39
 
43
- tests-ultimate:
44
- uses: ./.github/workflows/tests-ultimate.yml
40
+ tests-acceptance:
41
+ name: Acceptance Tests
42
+ uses: ./.github/workflows/tests-acceptance.yml
45
43
  with:
46
44
  BRANCH_REF: ${{ github.ref }}
47
45
  environment: Main Tests
48
- secrets: inherit
46
+ secrets: inherit
@@ -0,0 +1,203 @@
1
+ name: Releases
2
+ run-name: >-
3
+ ${{ github.event_name == 'workflow_dispatch'
4
+ && format('Manual Release: {0}', inputs.manual_tag)
5
+ || format('Release: {0}', github.event.workflow_run.display_title) }}
6
+
7
+ on:
8
+ # Trigger A: Automatic execution when Main Workflow finishes
9
+ workflow_run:
10
+ workflows: ["Main branch"]
11
+ types:
12
+ - completed
13
+
14
+ # Trigger B: Manual execution fallback from the GitHub UI
15
+ workflow_dispatch:
16
+ inputs:
17
+ manual_tag:
18
+ description: 'Tag to release (e.g., v1.2.3)'
19
+ required: true
20
+ type: string
21
+ override_run_id:
22
+ description: 'Main Workflow Run ID (Required if downloading artifacts)'
23
+ required: true
24
+ type: string
25
+
26
+ permissions:
27
+ contents: write
28
+ packages: write
29
+
30
+ jobs:
31
+ prep-release:
32
+ name: Prepare release
33
+ runs-on: ubuntu-latest
34
+ outputs:
35
+ is_valid_release: ${{ steps.validate.outputs.is_valid }}
36
+ semver_tag: ${{ steps.validate.outputs.version }}
37
+ target_run_id: ${{ steps.validate.outputs.run_id }}
38
+ steps:
39
+ - name: Checkout Code
40
+ uses: actions/checkout@v4
41
+
42
+ - name: Configure uv environment
43
+ uses: ./.github/actions/setup-uv-local
44
+ with:
45
+ python-version: "3.14"
46
+
47
+ - name: Validate release conditions
48
+ id: validate
49
+ env:
50
+ # Authentication Token
51
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
52
+ # Upstream Workflow Configuration
53
+ # This is the name of the workflow that both manual and automated
54
+ # release validations depend on.
55
+ UPSTREAM_WORKFLOW_NAME: "Main branch"
56
+ # GitHub Context Variables (provided by the workflow_run or workflow_dispatch event)
57
+ REPO: ${{ github.repository }}
58
+ EVENT: ${{ github.event_name }}
59
+ CONCLUSION: ${{ github.event.workflow_run.conclusion }}
60
+ SHA: ${{ github.event.workflow_run.head_sha }}
61
+ AUTOMATED_UPSTREAM_RUN_ID: ${{ github.event.workflow_run.id }}
62
+ # Manual Trigger Inputs (from workflow_dispatch)
63
+ MANUAL_RELEASE_TAG: ${{ inputs.manual_tag }}
64
+ MANUAL_UPSTREAM_RUN_ID: ${{ inputs.override_run_id }}
65
+ run: uv run release gh-workflow-check
66
+
67
+ # TODO: Remove this job when all the release jobs have been migrated
68
+ # to consume build artifacts from Main workflow instead of rebuilding.
69
+ build-release-artifacts:
70
+ name: Build release artifacts
71
+ if: ${{ needs.prep-release.outputs.is_valid_release == 'true' }}
72
+ needs:
73
+ - prep-release
74
+ uses: ./.github/workflows/build.yml
75
+ with:
76
+ BRANCH_REF: ${{ needs.prep-release.outputs.semver_tag }}
77
+
78
+ publish-docs:
79
+ name: Publish Docs
80
+ if: ${{ needs.prep-release.outputs.is_valid_release == 'true' }}
81
+ needs:
82
+ - prep-release
83
+ runs-on: ubuntu-latest
84
+ steps:
85
+ - name: Checkout repository
86
+ uses: actions/checkout@v6
87
+ with:
88
+ ref: ${{ needs.prep-release.outputs.semver_tag }}
89
+ fetch-depth: 2
90
+ - name: Download built documentation
91
+ uses: actions/download-artifact@v4
92
+ with:
93
+ run-id: ${{ needs.prep-release.outputs.target_run_id }}
94
+ github-token: ${{ secrets.GITHUB_TOKEN }}
95
+ name: docs-site
96
+ path: site
97
+ - name: Deploy 🚀
98
+ uses: JamesIves/github-pages-deploy-action@v4.8.0
99
+ with:
100
+ branch: gh-pages
101
+ folder: site
102
+
103
+ publish-to-github:
104
+ name: Publish Release
105
+ if: ${{ needs.prep-release.outputs.is_valid_release == 'true' }}
106
+ needs:
107
+ - prep-release
108
+ runs-on: ubuntu-latest
109
+ steps:
110
+ - name: Create release in GitHub
111
+ uses: ncipollo/release-action@v1
112
+ with:
113
+ tag: ${{ needs.prep-release.outputs.semver_tag }}
114
+ name: ${{ needs.prep-release.outputs.semver_tag }}
115
+ body: "(this is a placeholder, it will be replaced with a changelog contents)"
116
+ token: ${{ secrets.GITHUB_TOKEN }}
117
+
118
+ publish-to-pypi:
119
+ name: Publish PyPI
120
+ if: ${{ needs.prep-release.outputs.is_valid_release == 'true' }}
121
+ needs:
122
+ - prep-release
123
+ - build-release-artifacts
124
+ runs-on: ubuntu-latest
125
+ environment:
126
+ name: pypi
127
+ url: https://pypi.org/p/gitlabform
128
+ permissions:
129
+ id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
130
+ steps:
131
+ - name: Checkout repository
132
+ uses: actions/checkout@v6
133
+ with:
134
+ ref: ${{ needs.prep-release.outputs.semver_tag }}
135
+ fetch-depth: 2
136
+ - name: Configure uv environment
137
+ uses: ./.github/actions/setup-uv-local
138
+ with:
139
+ python-version: "3.14"
140
+ - name: Setup Python ${{ env.UV_PYTHON }} and install dependencies
141
+ run: |
142
+ uv sync --frozen --no-dev --group release
143
+ # TODO: In a separate PR, consume the build artifact (package-dist) uploaded
144
+ # in build-release-artifacts instead of rebuilding and verifying the package here.
145
+ - name: Build and verify the package
146
+ run: |
147
+ uv run --no-sync package build
148
+ uv run --no-sync package verify
149
+ - name: Publish to PyPI
150
+ run: |
151
+ uv run --no-sync release pypi
152
+
153
+ publish-to-ghcr:
154
+ name: Publish GHCR
155
+ if: ${{ needs.prep-release.outputs.is_valid_release == 'true' }}
156
+ needs:
157
+ - prep-release
158
+ - build-release-artifacts
159
+ - publish-to-pypi
160
+ runs-on: ubuntu-latest
161
+ steps:
162
+ # TODO: In a separate PR, optimize docker image build to consume the built package artifact
163
+ # (package-dist) instead of copying and rebuilding from source if applicable.
164
+ - name: Checkout repository
165
+ uses: actions/checkout@v6
166
+ with:
167
+ ref: ${{ needs.prep-release.outputs.semver_tag }}
168
+ - name: Get the version from the tag
169
+ run: echo "VERSION=${GITHUB_REF/refs\/tags\/v/}" >> $GITHUB_ENV
170
+ - name: Docker metadata
171
+ id: metadata
172
+ uses: docker/metadata-action@v6
173
+ with:
174
+ images: |
175
+ ghcr.io/gitlabform/gitlabform
176
+ flavor: |
177
+ latest=auto
178
+ tags: |
179
+ type=pep440,pattern={{version}}
180
+ type=pep440,pattern={{major}}.{{minor}}
181
+ type=pep440,pattern={{major}}
182
+ - name: Set up QEMU
183
+ uses: docker/setup-qemu-action@v4
184
+ - name: Set up Docker Buildx
185
+ uses: docker/setup-buildx-action@v4
186
+ # gitlabform/gitlabform image is going to be here
187
+ - name: Login to GitHub Container Registry
188
+ uses: docker/login-action@v4
189
+ with:
190
+ registry: ghcr.io
191
+ username: ${{ github.repository_owner }}
192
+ # This token is provided by Actions, you do not need to create your own token
193
+ password: ${{ secrets.GITHUB_TOKEN }}
194
+ # Docker image will use UV internally and builds the image from the Codebase at the current tag, rather than downloding from PyPi
195
+ - name: Publish image to registries
196
+ uses: docker/build-push-action@v7
197
+ with:
198
+ push: true
199
+ context: .
200
+ file: Dockerfile
201
+ platforms: linux/amd64,linux/arm64
202
+ tags: ${{ steps.metadata.outputs.tags }}
203
+ labels: ${{ steps.metadata.outputs.labels }}
@@ -0,0 +1,84 @@
1
+ name: Build and package artifacts
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ BRANCH_REF:
7
+ type: string
8
+ required: true
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ package:
15
+ name: Package
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - name: Checkout repository
19
+ uses: actions/checkout@v6
20
+ with:
21
+ ref: ${{ inputs.BRANCH_REF }}
22
+ fetch-depth: 2
23
+ - name: Configure uv environment
24
+ uses: ./.github/actions/setup-uv-local
25
+ with:
26
+ python-version: "3.14"
27
+ - name: Install dependencies
28
+ run: uv sync --frozen --no-dev --group release
29
+ - name: Build and verify the package
30
+ run: |
31
+ uv run --no-sync package build
32
+ uv run --no-sync package verify
33
+ - name: Upload package distribution
34
+ uses: actions/upload-artifact@v4
35
+ with:
36
+ name: package-dist
37
+ path: dist/*
38
+
39
+ docs:
40
+ name: Docs
41
+ runs-on: ubuntu-latest
42
+ steps:
43
+ - name: Checkout repository
44
+ uses: actions/checkout@v6
45
+ with:
46
+ ref: ${{ inputs.BRANCH_REF }}
47
+ fetch-depth: 2
48
+ - name: Configure uv environment
49
+ uses: ./.github/actions/setup-uv-local
50
+ with:
51
+ python-version: "3.14"
52
+ - name: Install dependencies
53
+ run: uv sync --frozen --no-dev --group docs
54
+ - name: Build documentation
55
+ run: uv run --no-sync docs build
56
+ - name: Upload docs site
57
+ uses: actions/upload-artifact@v4
58
+ with:
59
+ name: docs-site
60
+ path: site
61
+
62
+ smoke-tests:
63
+ name: "Smoke test - (${{ matrix.os == 'ubuntu-latest' && 'Linux' || matrix.os == 'macos-latest' && 'macOS' || 'Windows' }}, Python ${{ matrix.python-version }})"
64
+ strategy:
65
+ fail-fast: false
66
+ matrix:
67
+ os: [ubuntu-latest, macos-latest, windows-latest]
68
+ python-version: ["3.14", "3.12"]
69
+ needs: package
70
+ runs-on: ${{ matrix.os }}
71
+ steps:
72
+ - name: Checkout repository
73
+ uses: actions/checkout@v6
74
+ with:
75
+ ref: ${{ inputs.BRANCH_REF }}
76
+ fetch-depth: 2
77
+ - name: Configure uv environment
78
+ uses: ./.github/actions/setup-uv-local
79
+ with:
80
+ python-version: ${{ matrix.python-version }}
81
+ - name: Install dependencies
82
+ run: uv sync --frozen --no-dev --group test
83
+ - name: Run smoke tests
84
+ run: uv run --no-sync gitlabform -V
@@ -1,4 +1,11 @@
1
- name: Linter and tests (PRs)
1
+ name: "CI - Build · Lint · Tests"
2
+
3
+ # Reusable workflow containing the actual CI jobs for pull request validation.
4
+ # This file is called by prs-entrypoint.yml and is intentionally separated so that
5
+ # event/routing logic stays in the entrypoint while the CI job set remains reusable.
6
+
7
+ # This reusable workflow does not receive secrets automatically from the PR event.
8
+ # The caller workflow (prs-entrypoint.yml) must explicitly pass secrets when calling it.
2
9
 
3
10
  on:
4
11
  workflow_call:
@@ -9,54 +16,31 @@ on:
9
16
 
10
17
  jobs:
11
18
 
12
- approve:
13
- runs-on: ubuntu-latest
14
- steps:
15
- - name: Approve
16
- run: echo For security reasons, all pull requests need to be approved first before running the Premium Acceptance Tests.
17
-
18
- build-docs:
19
- uses: ./.github/workflows/docs.yml
20
- permissions:
21
- contents: read
22
- pull-requests: write
23
- with:
24
- branch_ref: ${{ inputs.BRANCH_REF }}
25
-
26
- linters:
27
- uses: ./.github/workflows/linters.yml
28
- permissions:
29
- contents: read
30
- pull-requests: write
19
+ build:
20
+ name: Build
21
+ uses: ./.github/workflows/build.yml
31
22
  with:
32
- branch_ref: ${{ inputs.BRANCH_REF }}
23
+ BRANCH_REF: ${{ inputs.BRANCH_REF }}
33
24
 
34
- tests-standard:
35
- uses: ./.github/workflows/tests-standard.yml
36
- permissions:
37
- contents: read
38
- pull-requests: write
25
+ static-analysis:
26
+ name: Lint
27
+ uses: ./.github/workflows/static-analysis.yml
39
28
  with:
40
- branch_ref: ${{ inputs.BRANCH_REF }}
29
+ BRANCH_REF: ${{ inputs.BRANCH_REF }}
41
30
 
42
- tests-premium:
43
- uses: ./.github/workflows/tests-premium.yml
44
- permissions:
45
- contents: read
46
- pull-requests: write
31
+ tests:
32
+ name: Tests
33
+ uses: ./.github/workflows/tests-unit.yml
47
34
  with:
48
- branch_ref: ${{ inputs.BRANCH_REF }}
49
- environment: Integrate Pull Request # Our dummy environment
35
+ BRANCH_REF: ${{ inputs.BRANCH_REF }}
50
36
  secrets: inherit
51
37
 
52
- tests-ultimate:
53
- uses: ./.github/workflows/tests-ultimate.yml
54
- permissions:
55
- contents: read
56
- pull-requests: write
38
+ tests-acceptance:
39
+ name: Acceptance Tests
40
+ uses: ./.github/workflows/tests-acceptance.yml
57
41
  with:
58
- branch_ref: ${{ inputs.BRANCH_REF }}
59
- environment: Integrate Pull Request # Our dummy environment
42
+ BRANCH_REF: ${{ inputs.BRANCH_REF }}
43
+ environment: Integrate Pull Request
60
44
  secrets: inherit
61
45
 
62
46
  analyze:
@@ -0,0 +1,34 @@
1
+ name: "CI - Fork PRs"
2
+
3
+ # This workflow handles pull requests from forked repositories.
4
+ # It uses pull_request_target so the reusable CI workflow can receive explicit secrets.
5
+
6
+ permissions:
7
+ actions: read
8
+ contents: read
9
+ pull-requests: write
10
+ security-events: write
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
13
+ cancel-in-progress: true
14
+
15
+ on:
16
+ pull_request_target:
17
+ branches:
18
+ - main
19
+
20
+ jobs:
21
+ pr_jobs:
22
+ name: "Pipeline"
23
+ # github.event.pull_request object defined here: https://docs.github.com/en/rest/pulls/pulls?apiVersion=2026-03-10#get-a-pull-request
24
+ if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
25
+ uses: ./.github/workflows/pr-ci-workflow.yml
26
+ permissions:
27
+ actions: read
28
+ contents: read
29
+ packages: read
30
+ pull-requests: write
31
+ security-events: write
32
+ with:
33
+ BRANCH_REF: ${{ github.event.pull_request.head.sha }}
34
+ secrets: inherit
@@ -0,0 +1,34 @@
1
+ name: "CI - PRs"
2
+
3
+ # This workflow is the entrypoint for pull requests opened from host repository.
4
+ # Fork PRs are handled by prs-entrypoint-forks.yml using pull_request_target.
5
+ # It forwards the branch SHA and explicit secrets to the reusable workflow.
6
+
7
+ permissions:
8
+ actions: read
9
+ contents: read
10
+ pull-requests: write
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
13
+ cancel-in-progress: true
14
+
15
+ on:
16
+ pull_request:
17
+ branches:
18
+ - main
19
+
20
+ jobs:
21
+ pr_jobs:
22
+ name: "Pipeline"
23
+ # github.event.pull_request object defined here: https://docs.github.com/en/rest/pulls/pulls?apiVersion=2026-03-10#get-a-pull-request
24
+ if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
25
+ uses: ./.github/workflows/pr-ci-workflow.yml
26
+ permissions:
27
+ actions: read
28
+ contents: read
29
+ packages: read
30
+ pull-requests: write
31
+ security-events: write
32
+ with:
33
+ BRANCH_REF: ${{ github.event.pull_request.head.sha }}
34
+ secrets: inherit
@@ -0,0 +1,56 @@
1
+ name: Static Analysis
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ BRANCH_REF:
7
+ type: string
8
+ required: true
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ # This workflow currently covers lockfile verification plus lint-style checks.
14
+ # Bandit is treated here as a lightweight quality/security guardrail, not a full
15
+ # security scanning pipeline. Future security-only workflows can be introduced
16
+ # once heavier security tooling is needed.
17
+ jobs:
18
+ lockfile-verify:
19
+ name: Lockfile
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - name: Checkout repository
23
+ uses: actions/checkout@v6
24
+ with:
25
+ ref: ${{ inputs.BRANCH_REF }}
26
+ - name: Configure uv environment
27
+ uses: ./.github/actions/setup-uv-local
28
+ - name: Verify that uv.lock is in sync
29
+ run: uv lock --check
30
+
31
+ linting:
32
+ name: "${{ matrix.check == 'black' && 'Black' || matrix.check == 'mypy' && 'Mypy' || 'Bandit' }}"
33
+ runs-on: ubuntu-latest
34
+ strategy:
35
+ fail-fast: false
36
+ matrix:
37
+ check: [black, mypy, bandit]
38
+ steps:
39
+ - name: Checkout repository
40
+ uses: actions/checkout@v6
41
+ with:
42
+ ref: ${{ inputs.BRANCH_REF }}
43
+ fetch-depth: 2
44
+ - name: Configure uv environment
45
+ uses: ./.github/actions/setup-uv-local
46
+ - name: Install dependencies
47
+ run: uv sync --frozen --no-dev --group lint
48
+ - name: Run ${{ matrix.check }}
49
+ run: |
50
+ if [ "${{ matrix.check }}" == "black" ]; then
51
+ uv run --no-sync qa lint black --check .
52
+ elif [ "${{ matrix.check }}" == "mypy" ]; then
53
+ uv run --no-sync qa lint mypy .
54
+ elif [ "${{ matrix.check }}" == "bandit" ]; then
55
+ uv run --no-sync qa lint bandit .
56
+ fi
@@ -0,0 +1,91 @@
1
+ name: Acceptance Tests
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ BRANCH_REF:
7
+ type: string
8
+ required: true
9
+ environment:
10
+ description: "Environment to run licensed acceptance tests in: 'Integrate Pull Request' for PRs (requires approval) or 'Main Tests' for main/release runs."
11
+ type: string
12
+ required: true
13
+ secrets:
14
+ GITLAB_EE_LICENSE:
15
+ required: false
16
+ GITLAB_EE_ULTIMATE_LICENSE:
17
+ required: false
18
+ CODECOV_TOKEN:
19
+ required: true
20
+
21
+ permissions:
22
+ contents: read
23
+ actions: read # Required by codecov/codecov-action
24
+
25
+ jobs:
26
+ acceptance-standard:
27
+ name: "GitLab ${{ matrix.flavor == 'ce' && 'CE' || 'EE' }}"
28
+ runs-on: ubuntu-latest
29
+ strategy:
30
+ matrix:
31
+ flavor: [ce, ee]
32
+ fail-fast: false
33
+ steps:
34
+ - name: Checkout repository
35
+ uses: actions/checkout@v6
36
+ with:
37
+ ref: ${{ inputs.BRANCH_REF }}
38
+ fetch-depth: 2
39
+ - name: Configure uv environment
40
+ uses: ./.github/actions/setup-uv-local
41
+ - name: Install dependencies
42
+ run: uv sync --frozen --no-dev --group test
43
+ - name: Start GitLab (${{ matrix.flavor }}) in docker
44
+ run: uv run --no-sync gitlab-local up --gitlab-flavor ${{ matrix.flavor }}
45
+ - name: Run Standard acceptance tests for ${{ matrix.flavor }} flavor
46
+ run: uv run --no-sync qa test tests/acceptance/standard --cov=. --cov-report=xml --durations=0 --reruns 3 --reruns-delay 10 --log-cli-level=WARNING
47
+ - name: Upload coverage
48
+ uses: Wandalen/wretry.action@v3
49
+ with:
50
+ action: codecov/codecov-action@v3
51
+ with: |
52
+ name: codecov-acceptance-test-standard-${{ matrix.flavor }}
53
+ flags: integration
54
+ token: ${{ secrets.CODECOV_TOKEN }}
55
+ attempt_limit: 5
56
+ attempt_delay: 10000
57
+
58
+ acceptance-licensed:
59
+ name: "GitLab ${{ matrix.tier == 'premium' && 'Premium' || 'Ultimate' }}"
60
+ environment: ${{ inputs.environment }}
61
+ runs-on: ubuntu-latest
62
+ strategy:
63
+ matrix:
64
+ tier: [premium, ultimate]
65
+ fail-fast: false
66
+ steps:
67
+ - name: Checkout repository
68
+ uses: actions/checkout@v6
69
+ with:
70
+ ref: ${{ inputs.BRANCH_REF }}
71
+ fetch-depth: 2
72
+ - name: Configure uv environment
73
+ uses: ./.github/actions/setup-uv-local
74
+ - name: Install dependencies
75
+ run: uv sync --frozen --no-dev --group test
76
+ - name: Start GitLab (${{ matrix.tier }}) in docker
77
+ env:
78
+ GITLAB_EE_LICENSE: "${{ matrix.tier == 'premium' && secrets.GITLAB_EE_LICENSE || secrets.GITLAB_EE_ULTIMATE_LICENSE }}"
79
+ run: uv run --no-sync gitlab-local up
80
+ - name: Run acceptance Tests for ${{ matrix.tier }} features
81
+ run: uv run --no-sync qa test tests/acceptance/${{ matrix.tier }} --cov=. --cov-report=xml --durations=0 --reruns 3 --reruns-delay 10 --log-cli-level=WARNING
82
+ - name: Upload coverage
83
+ uses: Wandalen/wretry.action@v3
84
+ with:
85
+ action: codecov/codecov-action@v3
86
+ with: |
87
+ name: codecov-acceptance-test-${{ matrix.tier }}
88
+ flags: integration
89
+ token: ${{ secrets.CODECOV_TOKEN }}
90
+ attempt_limit: 5
91
+ attempt_delay: 10000
@@ -0,0 +1,49 @@
1
+ name: Unit Tests
2
+ # Reusable workflow for unit tests only.
3
+
4
+ on:
5
+ workflow_call:
6
+ inputs:
7
+ BRANCH_REF:
8
+ type: string
9
+ required: true
10
+ secrets:
11
+ CODECOV_TOKEN:
12
+ required: true
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ jobs:
18
+ unit:
19
+ name: "Unit (${{ matrix.python-version }})"
20
+ runs-on: ubuntu-latest
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ python-version: ["3.14", "3.12"]
25
+ steps:
26
+ - name: Checkout repository
27
+ uses: actions/checkout@v6
28
+ with:
29
+ ref: ${{ inputs.BRANCH_REF }}
30
+ fetch-depth: 2
31
+ - name: Configure uv environment
32
+ uses: ./.github/actions/setup-uv-local
33
+ with:
34
+ python-version: ${{ matrix.python-version }}
35
+ - name: Install dependencies
36
+ run: uv sync --frozen --no-dev --group test
37
+ - name: Run unit tests
38
+ run: uv run --no-sync qa test tests/unit --cov=. --cov-report=xml --log-cli-level=WARNING
39
+ - name: Upload coverage to Codecov
40
+ uses: Wandalen/wretry.action@v3
41
+ with:
42
+ action: codecov/codecov-action@v3
43
+ with: |
44
+ name: unit-tests-${{ matrix.python-version }}
45
+ flags: unittests
46
+ fail_ci_if_error: true
47
+ token: ${{ secrets.CODECOV_TOKEN }}
48
+ attempt_limit: 5
49
+ attempt_delay: 10000