GitlabProject

The GitlabProject resource allows you to manage GitLab projects declaratively using Frigg.

Schema Reference

GitlabProjectResource

PropertyTypeRequiredDescription
versionstringYesVersion of Frigg to use. Should be 1.
kindGitlabProjectYesKind of resource you want to specify
metadataobjectYesData used by Frigg internally
metadata.namestringYesName used to reference this resource from other resources
metadata.configDefaultsstringYesName of the GitlabDefaults resource to use to resolve default configuration.
metadata.idnumberNoNumeric ID of the GitLab project. Specify this when you want to start managing an already existing project using Frigg.
specobjectYesState you want the resource to have
spec.namestringYesName of the project in GitLab
spec.groupNamespacestringNo*Name of the parent group (*must have either groupNamespace or userNamespace)
spec.userNamespacestringNo*Name of the user in whose namespace the project is in (*must have either groupNamespace or userNamespace)
spec.configGitlabProjectConfigNoProject configuration. Leave undefined to fully use configDefaults.projectConfig.
spec.approvalsConfigGitlabApprovalsConfigNoApproval configuration. Leave undefined to fully use configDefaults.approvalsConfig.
spec.approvalRulesGitlabApprovalRule arrayNoApproval rules for merge requests. Leave undefined to fully use configDefaults.approvalRules.
spec.pushRulesGitlabPushRuleNoPush rules for commits. Leave undefined to fully use configDefaults.pushRules.
spec.protectedBranchesGitlabProtectedBranch arrayNoProtected branch configurations. Leave undefined to fully use configDefaults.protectedBranches.
spec.manageMembersbooleanNoWhether Frigg should manage member access. When true, only members specified in spec.members will have access.
spec.membersGitlabMember arrayNoDirect members of the project. Only used when manageMembers is true.
spec.sharedWithGroupsSharedWithGroup arrayNoGroups that this project is shared with, granting all group members access.

Namespace Selection Guide

You must specify either groupNamespace or userNamespace, but not both:

Use CaseNamespace TypeExample
Team or organizational projectsgroupNamespacegroupNamespace: my_team
Personal or individual projectsuserNamespaceuserNamespace: john.doe

Configuration Details

GitlabProjectConfig

All properties are optional. Any undefined properties will default to the specified configDefaults.projectConfig of the referenced GitlabDefaults.

Required Configuration Properties

Most projects will want to configure these essential properties:

PropertyTypeDefaultDescription
defaultBranchstringmainThe default branch for the project
visibilitypublic | internal | privateprivateProject visibility level
mergeMethodmerge | rebase_merge | ffmergeMerge request merge strategy
removeSourceBranchAfterMergebooleanfalseAutomatically delete source branch after merge

CI/CD Configuration

PropertyTypeDescription
ciConfigPathstringPath to CI configuration file (default: .gitlab-ci.yml)
ciDefaultGitDepthnumberGit depth for CI clones (0 = full clone, default: 20)
autoCancelPendingPipelinesenabled | disabledCancel older pipelines when new one starts
ciAllowForkPipelinesToRunInParentProjectbooleanAllow fork pipelines to access parent project CI/CD variables
ciForwardDeploymentEnabledbooleanPrevent older deployments to same environment
ciSeparatedCachesbooleanUse separate caches for protected/non-protected branches
mergePipelinesEnabledbooleanEnable merged results pipelines
mergeTrainsEnabledbooleanEnable merge trains
onlyAllowMergeIfPipelineSucceedsbooleanRequire pipeline success before merge
allowMergeOnSkippedPipelinebooleanAllow merge when pipeline is skipped
allowPipelineTriggerApproveDeploymentbooleanAllow pipeline triggers to approve deployments
autoDevopsEnabledbooleanEnable Auto DevOps
autoDevopsDeployStrategycontinuous | manual | timed_incrementalAuto DevOps deployment strategy
buildGitStrategystringGit strategy for builds (fetch or clone)
buildTimeoutnumberMaximum build time in seconds (default: 3600)
keepLatestArtifactbooleanKeep artifacts from latest successful pipeline
restrictUserDefinedVariablesbooleanRestrict use of user-defined CI/CD variables to maintainers
sharedRunnersEnabledbooleanEnable shared runners for this project
groupRunnersEnabledbooleanEnable group runners for this project

Merge Request Configuration

PropertyTypeDescription
onlyAllowMergeIfAllDiscussionsAreResolvedbooleanRequire all discussions resolved before merge
squashOptionnever | always | default_on | default_offSquash commits behavior
mergeCommitTemplatestringTemplate for merge commit messages
squashCommitTemplatestringTemplate for squash commit messages
mergeRequestsTemplatestringTemplate for new merge request descriptions
suggestionCommitMessagestringTemplate for suggestion commit messages
resolveOutdatedDiffDiscussionsbooleanAutomatically resolve outdated diff discussions
printingMergeRequestLinkEnabledbooleanPrint merge request link after push

Access Level Configuration

Configure feature access with these levels: disabled (feature unavailable), private (accessible only to project members), enabled (accessible based on project visibility).

PropertyTypeDescription
issuesAccessLeveldisabled | private | enabledIssues feature access
repositoryAccessLeveldisabled | private | enabledRepository access
mergeRequestsAccessLeveldisabled | private | enabledMerge requests feature access
forkingAccessLeveldisabled | private | enabledAbility to fork the project
wikiAccessLeveldisabled | private | enabledWiki feature access
snippetsAccessLeveldisabled | private | enabledSnippets feature access
buildsAccessLeveldisabled | private | enabledCI/CD pipelines and jobs access
analyticsAccessLeveldisabled | private | enabledAnalytics features access
containerRegistryAccessLeveldisabled | private | enabledContainer registry access
securityAndComplianceAccessLeveldisabled | private | enabledSecurity and compliance features access
releasesAccessLeveldisabled | private | enabledReleases feature access
infrastructureAccessLeveldisabled | private | enabledInfrastructure feature access
featureFlagsAccessLeveldisabled | private | enabledFeature flags access
monitorAccessLeveldisabled | private | enabledMonitoring features access
requirementsAccessLeveldisabled | private | enabledRequirements management access
pagesAccessLeveldisabled | private | enabled | publicGitLab Pages access (public allows external access)

Additional Configuration

PropertyTypeDescription
descriptionstringProject description
topicsstring[]Project topics/tags for categorization
lfsEnabledbooleanEnable Git LFS
requestAccessEnabledbooleanAllow users to request access
emailsEnabledbooleanEnable email notifications
packagesEnabledbooleanEnable package registry
serviceDeskEnabledbooleanEnable service desk for external issue creation
autocloseReferencedIssuesbooleanAuto-close issues referenced in merged merge requests
issueBranchTemplatestringTemplate for creating branches from issues
issuesTemplatestringTemplate for new issue descriptions
mirrorbooleanEnable repository mirroring
enforceAuthChecksOnUploadsbooleanEnforce authentication on uploads
externalAuthorizationClassificationLabelstringExternal authorization classification label
containerExpirationPolicyAttributesobjectContainer registry cleanup policy configuration

Container Expiration Policy

Configure automatic cleanup of container registry images:

containerExpirationPolicyAttributes:
    enabled: true                      # Enable cleanup policy
    cadence: 1d                        # How often to run (1d, 7d, 14d, 1month, 3month)
    keepN: 10                          # Number of tags to keep
    olderThan: 90d                     # Delete tags older than this (7d, 14d, 30d, 90d)
    nameRegexDelete: .*                # Regex for tags to delete (default: all)
    nameRegexKeep: ''                  # Regex for tags to keep (overrides delete)

GitlabApprovalsConfig

Configuration for merge request approval behavior. All properties are optional and inherit from configDefaults.approvalsConfig when undefined.

PropertyTypeDefaultDescription
resetApprovalsOnPushbooleantrueReset approvals when new commits are pushed
disableOverridingApproversPerMergeRequestbooleanfalsePrevent changing approvers per merge request
mergeRequestsAuthorApprovalbooleanfalseAllow merge request authors to approve their own merge requests
mergeRequestsDisableCommittersApprovalbooleanfalsePrevent commit authors from approving merge requests
requirePasswordToApprovebooleanfalseRequire password confirmation for approvals

Example

The following example includes all possible properties for GitlabProjectConfig and GitlabApprovalsConfig. Furthermore, an example GitlabApprovalRule array is included.

version: '1'
kind: GitlabProject
metadata:
    name: example_project
    configDefaults: GitlabDefaults
spec:
    name: Example Project
    groupNamespace: example_group
    userNamespace: example_user
    config:
        allowMergeOnSkippedPipeline: false
        allowPipelineTriggerApproveDeployment: false
        analyticsAccessLevel: enabled
        autoCancelPendingPipelines: enabled
        autoDevopsDeployStrategy: continuous
        autoDevopsEnabled: false
        autocloseReferencedIssues: true
        buildGitStrategy: fetch
        buildTimeout: 3600
        buildsAccessLevel: enabled
        ciAllowForkPipelinesToRunInParentProject: true
        ciConfigPath: ''
        ciDefaultGitDepth: 20
        ciForwardDeploymentEnabled: true
        ciSeparatedCaches: true
        containerExpirationPolicyAttributes:
            cadence: 1d
            enabled: false
            keepN: 10
            nameRegexDelete: .*
            nameRegexKeep: ''
            olderThan: 90d
        containerRegistryAccessLevel: enabled
        defaultBranch: main
        description: ''
        emailsEnabled: false
        enforceAuthChecksOnUploads: true
        externalAuthorizationClassificationLabel: ''
        featureFlagsAccessLevel: enabled
        forkingAccessLevel: enabled
        groupRunnersEnabled: true
        infrastructureAccessLevel: enabled
        issueBranchTemplate: ''
        issuesAccessLevel: enabled
        issuesTemplate: ''
        keepLatestArtifact: true
        lfsEnabled: true
        mergeCommitTemplate: ''
        mergeMethod: ff
        mergePipelinesEnabled: true
        mergeRequestsAccessLevel: private
        mergeRequestsTemplate: ''
        mergeTrainsEnabled: false
        mirror: false
        monitorAccessLevel: enabled
        onlyAllowMergeIfAllDiscussionsAreResolved: true
        onlyAllowMergeIfPipelineSucceeds: true
        packagesEnabled: true
        pagesAccessLevel: private
        printingMergeRequestLinkEnabled: true
        releasesAccessLevel: enabled
        removeSourceBranchAfterMerge: true
        repositoryAccessLevel: enabled
        requestAccessEnabled: false
        requirementsAccessLevel: enabled
        resolveOutdatedDiffDiscussions: false
        restrictUserDefinedVariables: false
        securityAndComplianceAccessLevel: private
        serviceDeskEnabled: true
        sharedRunnersEnabled: true
        snippetsAccessLevel: disabled
        squashCommitTemplate: ''
        squashOption: default_off
        suggestionCommitMessage: ''
        topics: []
        visibility: private
        wikiAccessLevel: disabled
    approvalsConfig:
        disableOverridingApproversPerMergeRequest: false
        mergeRequestsAuthorApproval: false
        mergeRequestsDisableCommittersApproval: false
        requirePasswordToApprove: false
        resetApprovalsOnPush: true
    approvalRules:
        - name: Approval rule
          appliesToAllProtectedBranches: false
          approvalsRequired: 1
          groupIds: []
          protectedBranchIds: []
          ruleType: any_approver
          usernames: []
    protectedBranches:
        - name: main
          allowForcePush: false
          codeOwnerApprovalRequired: false
          mergeAccessLevels:
              - maintainer
          pushAccessLevels:
              - maintainer
          unprotectedAccessLevels: []
    members:
        - name: alice.johnson
          accessLevel: maintainer
        - name: erik.klein
          accessLevel: developer
    sharedWithGroups:
        - name: another_example_group
          accessLevel: developer

Required Resources

Sub-Resources

External Documentation