Set up Paradime Column-Level Lineage Diff on GitLab merge requests, with the GitLab connection or a pipeline, to post column-impact reports as MR notes for dbt™ changes.
Set up Column-Level Lineage Diff on GitLab. First complete the shared Lineage Diff prerequisites. Then choose how it runs:
With the GitLab connection (recommended): Paradime runs Lineage Diff after Turbo CI on each merge request. You do not need a pipeline or an access token.
From a GitLab pipeline: your .gitlab-ci.yml runs Turbo CI, then asks Paradime for the lineage diff report and posts it.
When Turbo CI starts on a merge request commit, the Paradime Lineage Diff commit status shows as pending. The first Turbo CI run on that commit that produces a dbt™ manifest computes the diff. If columns changed, Paradime posts one note on the merge request that lists the impacted downstream nodes. On each new commit, Paradime updates the same note instead of adding a new one.If the Turbo CI run is cancelled, for example by a new push, the commit’s Paradime Lineage Diff status shows as cancelled instead of waiting.
Generate a Paradime API key with the Bolt schedules admin capability. Use an Account API key (a prdm_cmp_... Bearer token), and note your workspace token and API endpoint; you will add them as CI/CD variables in a later step.
You will need to create GitLab Access Token with API to enable Comments to be generated when opening a Merge Request.Create a group access token (Only available on GitLab Premium Tier or Higher)Navigate to your GitLab project
Go to Settings > Access Tokens in the left sidebar
Enter a name for your token (e.g., “API Comment Access”)
Select the appropriate scopes:
api (for general API access)
Specifically for comments, you’ll need at least api scope, which includes the ability to write comments
Create a GitLab personal access token
If using a GitLab personal access token, we suggest creating a new user, called “Paradime” and create the access token attached to this user.
Log in to your GitLab account
Go to your user profile > Preferences > Access Tokens (or navigate to https://gitlab.com/-/profile/personal_access_tokens)
Enter a name for your token (e.g., “API Comment Access”)
Select the appropriate scopes:
api (for general API access)
Specifically for comments, you’ll need at least api scope, which includes the ability to write comments
Add the API key and Credential in the GitLab variables
Finally you need to add the API key and Credentials generated in the previous step in GitLab CI/CD settings (not in the .gitlab-ci.yml file directly). Set the corresponding values for the following variable names:
PARADIME_WORKSPACE_UID
PARADIME_API_SECRET
PARADIME_API_ENDPOINT
GITLAB_TOKEN
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Paradime","colors":{"primary":"#726AE3","light":"#9291F4","dark":"#5943D6"},"logo":{"light":"https://mintcdn.com/paradime-docs/C-R77mCdstNPsNTv/logo/paradime-logo-light-mode.svg?fit=max\u0026auto=format\u0026n=C-R77mCdstNPsNTv\u0026q=85\u0026s=7a32141c8f01f795c35f0c3c48b2f26a","dark":"https://mintcdn.com/paradime-docs/C-R77mCdstNPsNTv/logo/paradime-logo-dark-mode.svg?fit=max\u0026auto=format\u0026n=C-R77mCdstNPsNTv\u0026q=85\u0026s=e8b1dae8a943bf2a7c4d0088d7cc107b"},"favicon":"https://mintcdn.com/paradime-docs/F1X35JoCsYMKtOFi/favicon.svg?fit=max\u0026auto=format\u0026n=F1X35JoCsYMKtOFi\u0026q=85\u0026s=4ba032ce7ca6b66ccd44805e1e22567a","appearance":{"default":"system"},"background":{"decoration":"gradient"},"navbar":{"links":[{"href":"mailto:support@paradime.io","label":"Support"}],"primary":{"type":"button","label":"Launch Paradime","href":"https://app.paradime.io"}},"footer":{"socials":{"x":"https://x.com/paradimelabs","github":"https://github.com/paradime-io","linkedin":"https://www.linkedin.com/company/paradimelabs"},"links":[{"header":"Resources","items":[{"label":"Paradime Blog","href":"https://www.paradime.io/blog"},{"label":"SQL Resources Hub","href":"https://www.paradime.io/sql"},{"label":"Community","href":"https://paradimers.slack.com/join/shared_invite/zt-1mzax4sb8-jgw~hXRlDHAx~KN0az18bw"}]}]},"fonts":{"family":"Geist"},"icons":{"library":"lucide"},"styling":{"eyebrows":"breadcrumbs","codeblocks":"system","latex":true},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"thumbnails":{"appearance":"light"},"markdown":{"schema":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"paradime-docs","hasAudioNarration":false,"actualSubdomain":"paradime-docs","customDomains":["docs.paradime.io"],"gitSource":{"type":"github","owner":"paradime-io","repo":"paradime-docs-mintlify","deployBranch":"main","contentDirectory":"paradime-docs","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af2fc2339d0955f178103d8","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"default","tag":"Products","count":294},{"language":"default","tag":"Guides","count":183},{"language":"default","tag":"Integrations","count":166},{"language":"default","tag":"Changelog","count":111},{"language":"default","tag":"DinoAI","count":95},{"language":"default","tag":"Bolt","count":83},{"language":"default","tag":"Developers","count":57},{"language":"default","tag":"Orchestrate data pipelines","count":45},{"language":"default","tag":"Schedule Anatomy","count":45},{"language":"default","tag":"Administration","count":45}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"custom.css","content":"#navigation-items>ul.sidebar-group~ul.sidebar-group{margin-top:0}#navigation-items a .rounded-md[style*=\"background\"] svg{background:white!important}div[class*=\"w-[160px]\"] .flex.flex-wrap>span.inline-block.rounded-lg.font-medium{padding:2px 8px;background-color:rgba(114, 106, 227, 0.12);color:#5943D6}#content-area h1,#content-area h2,#content-area h3,#content-area h4{letter-spacing:-0.03em}#content-area #page-title{font-size:2.25rem;line-height:1.1}.nav-logo{height:22px}#background-color::after{content:\"\";position:absolute;inset:0;pointer-events:none;background-image:linear-gradient(to right, rgba(114, 106, 227, 0.13) 1px, transparent 1px),\n linear-gradient(to bottom, rgba(114, 106, 227, 0.13) 1px, transparent 1px);background-size:44px 44px;-webkit-mask-image:radial-gradient(700px circle at 100% 0%, black 12%, transparent 68%),\n radial-gradient(700px circle at 0% 0%, black 12%, transparent 68%);-webkit-mask-composite:source-over;mask-image:radial-gradient(700px circle at 100% 0%, black 12%, transparent 68%),\n radial-gradient(700px circle at 0% 0%, black 12%, transparent 68%);mask-composite:add}#sidebar .sidebar-group-header{color:rgb(113, 113, 122)}#sidebar div:has(>.sidebar-group-header)~div:has(>.sidebar-group-header){border-top:1px solid rgba(128, 128, 140, 0.18);padding-top:1.25rem}img[src*=\"dino-ai\"]{background:transparent!important;filter:brightness(0) invert(0.64)}a[aria-current=\"location\"] img[src*=\"dino-ai\"],a.group:hover img[src*=\"dino-ai\"]{filter:brightness(0) invert(1)}img.sidebar-group-icon[src*=\"slack\"]{filter:brightness(0) invert(0.44)}"}],"page":{"pagePath":"products/bolt/ci-cd/lineage-diff/gitlab","slug":"/products/bolt/ci-cd/lineage-diff/gitlab","pageMetadata":{"title":"Column-Level Lineage Diff on GitLab","sidebarTitle":"GitLab","description":"Set up Paradime Column-Level Lineage Diff on GitLab merge requests, with the GitLab connection or a pipeline, to post column-impact reports as MR notes for dbt™ changes.","href":"/products/bolt/ci-cd/lineage-diff/gitlab"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Set up Paradime Column-Level Lineage Diff on GitLab merge requests, with the GitLab connection or a pipeline, to post column-impact reports as MR notes for dbt™ changes.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const Arcade=({src,title})=>_jsx(`div`,{style:{position:`relative`,paddingBottom:`calc(56.2225% + 41px)`,height:0,width:`100%`},children:_jsx(`iframe`,{src,title,frameBorder:`0`,loading:`lazy`,allow:`clipboard-write`,allowFullScreen:true,style:{position:`absolute`,top:0,left:0,width:`100%`,height:`100%`,colorScheme:`light`}})});function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Card,CodeBlock,Frame,Heading,OptimizedImage,Warning,_MdxComponentBoundary}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Warning)_missingMdxReference(`Warning`,true);if(!_MdxComponentBoundary)_missingMdxReference(`_MdxComponentBoundary`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Set up Column-Level Lineage Diff on GitLab. First complete the shared `,_jsx(_components.a,{href:`/products/bolt/ci-cd/lineage-diff/index`,children:`Lineage Diff prerequisites`}),`. Then choose how it runs:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`With the GitLab connection (recommended):`}),` Paradime runs Lineage Diff after Turbo CI on each merge request. You do not need a pipeline or an access token.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`From a GitLab pipeline:`}),` your `,_jsx(_components.code,{children:`.gitlab-ci.yml`}),` runs Turbo CI, then asks Paradime for the lineage diff report and posts it.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`run-lineage-diff-with-the-gitlab-connection`,children:`Run Lineage Diff with the GitLab connection`}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Prerequisites`})}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/integrations/gitlab`,children:`Connect GitLab`}),` on `,_jsx(_components.a,{href:`/integrations/gitlab/gitlab-com`,children:`gitlab.com`}),` or `,_jsx(_components.a,{href:`/integrations/gitlab/self-managed`,children:`GitLab Self-Managed`}),`, and pick your dbt™ project as one of the connection’s projects.`]}),`\n`,_jsxs(_components.li,{children:[`Set up `,_jsx(_components.a,{href:`/products/bolt/ci-cd/turbo-ci/gitlab#run-turbo-ci-with-the-gitlab-connection`,children:`Turbo CI with the GitLab connection`}),`.`]}),`\n`]})]}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://mintcdn.com/paradime-docs/8Ap_apA6iXxCRLlY/images/bolt-turbo-ci-gitlab-commit-statuses.jpg?fit=max\u0026auto=format\u0026n=8Ap_apA6iXxCRLlY\u0026q=85\u0026s=027622b6013529c367d7545ef7cdfd2b`,alt:`A GitLab pipeline for a merge request commit, with an external stage that holds the Paradime Lineage Diff and Paradime Turbo CI statuses, both passed`,\"data-og-width\":`1600`,width:`1600`,\"data-og-height\":`900`,height:`900`,\"data-path\":`images/bolt-turbo-ci-gitlab-commit-statuses.jpg`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/paradime-docs/8Ap_apA6iXxCRLlY/images/bolt-turbo-ci-gitlab-commit-statuses.jpg?w=280\u0026fit=max\u0026auto=format\u0026n=8Ap_apA6iXxCRLlY\u0026q=85\u0026s=8fb092311829dec289dbe2737843c164 280w, https://mintcdn.com/paradime-docs/8Ap_apA6iXxCRLlY/images/bolt-turbo-ci-gitlab-commit-statuses.jpg?w=560\u0026fit=max\u0026auto=format\u0026n=8Ap_apA6iXxCRLlY\u0026q=85\u0026s=6b4a706e00f6549e748fb512026e8063 560w, https://mintcdn.com/paradime-docs/8Ap_apA6iXxCRLlY/images/bolt-turbo-ci-gitlab-commit-statuses.jpg?w=840\u0026fit=max\u0026auto=format\u0026n=8Ap_apA6iXxCRLlY\u0026q=85\u0026s=d316722eee649ce2d00450e8ef3d0bce 840w, https://mintcdn.com/paradime-docs/8Ap_apA6iXxCRLlY/images/bolt-turbo-ci-gitlab-commit-statuses.jpg?w=1100\u0026fit=max\u0026auto=format\u0026n=8Ap_apA6iXxCRLlY\u0026q=85\u0026s=e0e77f70a3ecd54933c9e36eb23358d7 1100w, https://mintcdn.com/paradime-docs/8Ap_apA6iXxCRLlY/images/bolt-turbo-ci-gitlab-commit-statuses.jpg?w=1650\u0026fit=max\u0026auto=format\u0026n=8Ap_apA6iXxCRLlY\u0026q=85\u0026s=fcdc38145a758e281a50344661cd6dd3 1650w, https://mintcdn.com/paradime-docs/8Ap_apA6iXxCRLlY/images/bolt-turbo-ci-gitlab-commit-statuses.jpg?w=2500\u0026fit=max\u0026auto=format\u0026n=8Ap_apA6iXxCRLlY\u0026q=85\u0026s=1c351b18f854563ec29f279d507fdbd2 2500w`})}),`\n`,_jsxs(_components.p,{children:[`When Turbo CI starts on a merge request commit, the `,_jsx(_components.code,{children:`Paradime Lineage Diff`}),` commit status shows as pending. The first Turbo CI run on that commit that produces a dbt™ manifest computes the diff. If columns changed, Paradime posts one note on the merge request that lists the impacted downstream nodes. On each new commit, Paradime updates the same note instead of adding a new one.`]}),`\n`,_jsxs(_components.p,{children:[`If the Turbo CI run is cancelled, for example by a new push, the commit’s `,_jsx(_components.code,{children:`Paradime Lineage Diff`}),` status shows as cancelled instead of waiting.`]}),`\n`,_jsx(Heading,{level:`2`,id:`run-lineage-diff-from-a-gitlab-pipeline`,children:`Run Lineage Diff from a GitLab pipeline`}),`\n`,_jsx(Frame,{children:_jsx(OptimizedImage,{src:`https://2337193041-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FHET0AD04uHMgdeLAjptq%2Fuploads%2Fl3HYjPJu8jk2PXSiOuv9%2Fimage.png?alt=media\u0026token=1eef3ecf-7218-4125-8205-925f22098123`,alt:``})}),`\n`,_jsx(Heading,{level:`3`,id:`generate-api-keys`,children:`Generate API keys`}),`\n`,_jsxs(_components.p,{children:[`Generate a Paradime `,_jsx(_components.a,{href:`/developers/api-keys`,children:`API key`}),` with the `,_jsx(_components.strong,{children:`Bolt schedules admin`}),` capability. Use an `,_jsx(_components.strong,{children:`Account API key`}),` (a `,_jsx(_components.code,{children:`prdm_cmp_...`}),` Bearer token), and note your `,_jsx(_components.strong,{children:`workspace token`}),` and `,_jsx(_components.strong,{children:`API endpoint`}),`; you will add them as CI/CD variables in a later step.`]}),`\n`,_jsx(Card,{title:`Generate API keys`,href:`/developers/api-keys`,horizontal:true,icon:`arrow-right`}),`\n`,_jsx(Heading,{level:`3`,id:`create-a-pipeline`,children:`Create a Pipeline`}),`\n`,_jsxs(_components.p,{children:[`Now you will need to create a new `,_jsx(_components.code,{children:`.gitlab-ci.yml`}),` file in your dbt™️ repository. Copy the code below.`]}),`\n`,_jsx(_components.p,{children:`This pipeline has two stages:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`paradime_turbo_ci`})}),` — Runs the Turbo CI bolt schedule and exports the `,_jsx(_components.code,{children:`BOLT_RUN_ID`}),` for the next stage.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`lineage_diff_report`})}),` — Uses the `,_jsx(_components.code,{children:`BOLT_RUN_ID`}),` to trigger the lineage diff report and posts the result as a comment on the Merge Request.`]}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`115`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`115`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`stages`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`paradime_turbo_ci`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`lineage_diff_report`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`paradime_turbo_ci`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` stage`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`paradime_turbo_ci`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` image`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`python:3.11`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` rules`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`$CI_PIPELINE_SOURCE == \"merge_request_event\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` when`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`always`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` variables`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` PARADIME_SCHEDULE_SLUG`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"flowing-pachy-wyy4fs\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` before_script`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`pip install paradime-io`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` script`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`echo \"Merge Request Number`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`$CI_MERGE_REQUEST_IID\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`echo \"Commit SHA`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`$CI_COMMIT_SHA\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`|`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` python3 -u \u003c\u003c 'EOF'`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` import os`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` import time`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` from paradime import Paradime`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` from paradime.apis.bolt.types import BoltRunState`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` paradime = Paradime(`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` workspace_uid=os.environ['PARADIME_WORKSPACE_UID'],`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api_secret=os.environ['PARADIME_API_SECRET'],`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api_endpoint=os.environ['PARADIME_API_ENDPOINT']`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` )`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` run_id = paradime.bolt.trigger_run(`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` slug=os.environ['PARADIME_SCHEDULE_SLUG'],`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` branch=os.environ['CI_COMMIT_SHA'],`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pr_number=int(os.environ['CI_MERGE_REQUEST_IID']),`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` )`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` print(f\"Bolt Run ID: {run_id}\")`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` # Poll until the Bolt run reaches a terminal state so the CI job`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` # reflects the actual run result`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` while True:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` run_status = paradime.bolt.get_run_status(run_id)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` print(f\"Status: {run_status}\")`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` if run_status in (`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` BoltRunState.SUCCESS,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` BoltRunState.ERROR,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` BoltRunState.FAILED,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` BoltRunState.CANCELED,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` BoltRunState.SKIPPED,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ):`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` break`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` time.sleep(30)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` with open(\"bolt.env\", \"w\") as f:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` f.write(f\"BOLT_RUN_ID={run_id}\\\\n\")`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` if run_status != BoltRunState.SUCCESS:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` raise SystemExit(f\"Bolt run {run_id} finished with state: {run_status}\")`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` EOF`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` artifacts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` reports`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` dotenv`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`bolt.env`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`60 minutes`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`lineage_diff_report`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` stage`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`lineage_diff_report`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` image`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`python:3.11`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` needs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`job`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`paradime_turbo_ci`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` artifacts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` rules`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`$CI_PIPELINE_SOURCE == \"merge_request_event\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` when`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`always`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` variables`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` GIT_DEPTH`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` before_script`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`pip install paradime-io`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` script`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`echo \"Bolt Run ID`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`$BOLT_RUN_ID\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`echo \"Pull Request Number`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`$CI_MERGE_REQUEST_IID\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`echo \"Pull Request Author Email`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`$GITLAB_USER_EMAIL\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`export CHANGED_FILES=$(git diff --name-only $CI_MERGE_REQUEST_DIFF_BASE_SHA $CI_COMMIT_SHA)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`echo \"Files changed in this MR:\"; echo \"$CHANGED_FILES\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`export REPORT_FILE=\"report_$(openssl rand -hex 12).json\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`python3 -u \u003c\u003cEOF`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` import os`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` import json`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` from pathlib import Path`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` from paradime import Paradime`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` paradime = Paradime(`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` workspace_uid=os.environ['PARADIME_WORKSPACE_UID'],`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api_secret=os.environ['PARADIME_API_SECRET'],`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` api_endpoint=os.environ['PARADIME_API_ENDPOINT']`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` )`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` report = paradime.lineage_diff.trigger_report_and_wait(`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` bolt_run_id=int(os.environ['BOLT_RUN_ID']),`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pull_request_number=int(os.environ['CI_MERGE_REQUEST_IID']),`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` user_email=os.environ['GITLAB_USER_EMAIL'],`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` changed_file_paths=os.environ['CHANGED_FILES'].split('\\\\n'),`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` )`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` print(\"Lineage Diff Report Message:\", report.message)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` if report.result_markdown`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` data = json.dumps({'body'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`report.result_markdown})`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` Path(os.environ['REPORT_FILE']).write_text(data)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` EOF`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`|`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` if [ -f \"$REPORT_FILE\" ]; then`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` COMMENT_BODY=$(cat \"$REPORT_FILE\")`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:' curl --request POST --header \"PRIVATE-TOKEN: ${GITLAB_TOKEN}\" \\\\'})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` --header \"Content-Type: application/json\" \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` --data \"$COMMENT_BODY\" \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:' \"https://gitlab.com/api/v4/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}/notes\"'})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` else`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` echo \"Report file not found, skipping comment.\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` fi`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` timeout`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`60 minutes`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`create-a-gitlab-access-token`,children:`Create a GitLab Access Token`}),`\n`,_jsx(_components.p,{children:`You will need to create GitLab Access Token with API to enable Comments to be generated when opening a Merge Request.`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Create a group access token (Only available on GitLab Premium Tier or Higher)`})}),`\n`,_jsx(_components.p,{children:`Navigate to your GitLab project`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Go to `,_jsx(_components.strong,{children:`Settings > Access Tokens`}),` in the left sidebar`]}),`\n`,_jsx(_components.li,{children:`Enter a name for your token (e.g., “API Comment Access”)`}),`\n`,_jsxs(_components.li,{children:[`Select the appropriate scopes:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`api`}),` (for general API access)`]}),`\n`,_jsxs(_components.li,{children:[`Specifically for comments, you’ll need at least `,_jsx(_components.code,{children:`api`}),` scope, which includes the ability to write comments`]}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Create a GitLab personal access token`})}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`If using a GitLab personal access token, we suggest creating a new user, called “Paradime” and create the access token attached to this user.`})}),`\n`,_jsx(_components.p,{children:`Log in to your GitLab account`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Go to your user profile > Preferences > Access Tokens (or navigate to `,_jsx(_components.code,{children:`https://gitlab.com/-/profile/personal_access_tokens`}),`)`]}),`\n`,_jsx(_components.li,{children:`Enter a name for your token (e.g., “API Comment Access”)`}),`\n`,_jsxs(_components.li,{children:[`Select the appropriate scopes:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`api`}),` (for general API access)`]}),`\n`,_jsxs(_components.li,{children:[`Specifically for comments, you’ll need at least `,_jsx(_components.code,{children:`api`}),` scope, which includes the ability to write comments`]}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`add-the-api-key-and-credential-in-the-gitlab-variables`,children:`Add the API key and Credential in the GitLab variables`}),`\n`,_jsxs(_components.p,{children:[`Finally you need to add the API key and Credentials generated in the previous step in GitLab CI/CD settings (not in the `,_jsx(_components.code,{children:`.gitlab-ci.yml`}),` file directly). Set the corresponding values for the following variable names:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`PARADIME_WORKSPACE_UID`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`PARADIME_API_SECRET`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`PARADIME_API_ENDPOINT`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`GITLAB_TOKEN`})}),`\n`]}),`\n`,_jsx(_MdxComponentBoundary,{name:`Arcade`,children:_jsx(Arcade,{src:`https://demo.arcade.software/UcTn34OhEg5OwXDVOKVu?embed\u0026embed_mobile=tab\u0026embed_desktop=inline\u0026show_copy_link=true`,title:`Column-Level Lineage Diff`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{Arcade,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Column-Level Lineage Diff on GitLab","sidebarTitle":"GitLab","description":"Set up Paradime Column-Level Lineage Diff on GitLab merge requests, with the GitLab connection or a pipeline, to post column-impact reports as MR notes for dbt™ changes.","href":"/products/bolt/ci-cd/lineage-diff/gitlab"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[142,470,")=>null;function _cr"]]},"mdxExtracts":{"tableOfContents":[{"title":"Run Lineage Diff with the GitLab connection","slug":"run-lineage-diff-with-the-gitlab-connection","depth":2,"children":[]},{"title":"Run Lineage Diff from a GitLab pipeline","slug":"run-lineage-diff-from-a-gitlab-pipeline","depth":2,"children":[{"title":"Generate API keys","slug":"generate-api-keys","depth":3,"children":[]},{"title":"Create a Pipeline","slug":"create-a-pipeline","depth":3,"children":[]},{"title":"Create a GitLab Access Token","slug":"create-a-gitlab-access-token","depth":3,"children":[]},{"title":"Add the API key and Credential in the GitLab variables","slug":"add-the-api-key-and-credential-in-the-gitlab-variables","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/paradime-docs/d89c3c6c95bfc95f/snitcher.js"],"subdomain":"paradime-docs","siteName":"Paradime","title":"Column-Level Lineage Diff on GitLab - Paradime","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-06T15:43:22.838Z","originalFileLocation":"products/bolt/ci-cd/lineage-diff/gitlab.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Set up Paradime Column-Level Lineage Diff on GitLab merge requests, with the GitLab connection or a pipeline, to post column-impact reports as MR notes for dbt™ changes.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Paradime\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/paradime-docs/M6Wm7PyWfTcwC_Oc/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/paradime-docs/M6Wm7PyWfTcwC_Oc/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/paradime-docs/M6Wm7PyWfTcwC_Oc/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/paradime-docs/M6Wm7PyWfTcwC_Oc/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/paradime-docs/M6Wm7PyWfTcwC_Oc/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/paradime-docs/M6Wm7PyWfTcwC_Oc/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/paradime-docs/M6Wm7PyWfTcwC_Oc/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/paradime-docs/M6Wm7PyWfTcwC_Oc/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/paradime-docs/M6Wm7PyWfTcwC_Oc/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Column-Level Lineage Diff on GitLab - Paradime\">\u003cmeta data-mint-head property=\"og:description\" content=\"Set up Paradime Column-Level Lineage Diff on GitLab merge requests, with the GitLab connection or a pipeline, to post column-impact reports as MR notes for dbt™ changes.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Paradime\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.paradime.io/products/bolt/ci-cd/lineage-diff/gitlab\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://paradime-docs.mintlify.site/_mintlify/api/og/v2?division=Column-Level+Lineage+Diff\u0026amp;title=Column-Level+Lineage+Diff+on+GitLab\u0026amp;description=Set+up+Paradime+Column-Level+Lineage+Diff+on+GitLab+merge+requests%2C+with+the+GitLab+connection+or+a+pipeline%2C+to+post+column-impact+reports+as+MR+notes+for+dbt%E2%84%A2\u0026amp;theme=e98f82616320db913a88f7c5\u0026amp;signature=e530a18ac495204f4f76758f1f40897710c2323c511ed240e8a5160aeacb4321\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Column-Level Lineage Diff on GitLab - Paradime\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Set up Paradime Column-Level Lineage Diff on GitLab merge requests, with the GitLab connection or a pipeline, to post column-impact reports as MR notes for dbt™ changes.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://paradime-docs.mintlify.site/_mintlify/api/og/v2?division=Column-Level+Lineage+Diff\u0026amp;title=Column-Level+Lineage+Diff+on+GitLab\u0026amp;description=Set+up+Paradime+Column-Level+Lineage+Diff+on+GitLab+merge+requests%2C+with+the+GitLab+connection+or+a+pipeline%2C+to+post+column-impact+reports+as+MR+notes+for+dbt%E2%84%A2\u0026amp;theme=e98f82616320db913a88f7c5\u0026amp;signature=e530a18ac495204f4f76758f1f40897710c2323c511ed240e8a5160aeacb4321\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/paradime-docs/M6Wm7PyWfTcwC_Oc/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Paradime\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#726AE3\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.paradime.io/products/bolt/ci-cd/lineage-diff/gitlab\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/products/bolt/ci-cd/lineage-diff/gitlab.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.paradime.io/#organization\",\"name\":\"Paradime\",\"url\":\"https://docs.paradime.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/paradime-docs/C-R77mCdstNPsNTv/logo/paradime-logo-light-mode.svg?fit=max\u0026auto=format\u0026n=C-R77mCdstNPsNTv\u0026q=85\u0026s=7a32141c8f01f795c35f0c3c48b2f26a\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.paradime.io#website\",\"name\":\"Paradime\",\"url\":\"https://docs.paradime.io\",\"publisher\":{\"@id\":\"https://docs.paradime.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.paradime.io/products/bolt/ci-cd/lineage-diff/gitlab#webpage\",\"url\":\"https://docs.paradime.io/products/bolt/ci-cd/lineage-diff/gitlab\",\"name\":\"Column-Level Lineage Diff on GitLab\",\"description\":\"Set up Paradime Column-Level Lineage Diff on GitLab merge requests, with the GitLab connection or a pipeline, to post column-impact reports as MR notes for dbt™ changes.\",\"dateModified\":\"2026-11-06T15:43:22.838Z\",\"isPartOf\":{\"@id\":\"https://docs.paradime.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.paradime.io/products/bolt/ci-cd/lineage-diff/gitlab#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.paradime.io/products/bolt/ci-cd/lineage-diff/gitlab#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"CI/CD\",\"item\":\"https://docs.paradime.io/products/bolt/ci-cd\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Column-Level Lineage Diff\",\"item\":\"https://docs.paradime.io/products/bolt/ci-cd/lineage-diff\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Column-Level Lineage Diff on GitLab\",\"item\":\"https://docs.paradime.io/products/bolt/ci-cd/lineage-diff/gitlab\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.paradime.io/products/bolt/ci-cd/lineage-diff/gitlab#article\",\"headline\":\"Column-Level Lineage Diff on GitLab\",\"name\":\"Column-Level Lineage Diff on GitLab\",\"description\":\"Set up Paradime Column-Level Lineage Diff on GitLab merge requests, with the GitLab connection or a pipeline, to post column-impact reports as MR notes for dbt™ changes.\",\"url\":\"https://docs.paradime.io/products/bolt/ci-cd/lineage-diff/gitlab\",\"mainEntityOfPage\":{\"@id\":\"https://docs.paradime.io/products/bolt/ci-cd/lineage-diff/gitlab#webpage\"},\"dateModified\":\"2026-11-06T15:43:22.838Z\",\"publisher\":{\"@id\":\"https://docs.paradime.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.paradime.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Paradime\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Paradime\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/products/bolt/ci-cd/lineage-diff/gitlab.md","siteName":"Paradime","nav":{"global":null,"tabs":[{"tab":"Start here","pages":[{"title":"Start here","href":""}]},{"tab":"Guides","pages":[{"title":"Guides","href":"/guides/foundations"}]},{"tab":"Products","anchors":[{"anchor":"DinoAI","icon":"https://mintlify.s3.us-west-1.amazonaws.com/paradime-docs/icons/dino-ai.svg","pages":[{"title":"DinoAI","href":"/products/dino-ai"}]},{"anchor":"Bolt","icon":"zap","pages":[{"title":"Bolt Pipelines","sidebarTitle":"Overview","href":"/products/bolt"},{"group":"Schedule Anatomy","icon":"component","pages":[{"title":"Triggers","href":"/products/bolt/creating-schedules/trigger-types"},{"group":"Commands","root":{"title":"Commands","href":"/products/bolt/creating-schedules/command-settings/index"},"pages":[{"title":"Sync Airbyte Connection","sidebarTitle":"Airbyte","href":"/products/bolt/creating-schedules/command-settings/airbyte-connector-sync"},{"title":"Trigger Airflow DAG","sidebarTitle":"Airflow","href":"/products/bolt/creating-schedules/command-settings/airflow-dag"},{"title":"Run AWS ECS Task","sidebarTitle":"AWS ECS","href":"/products/bolt/creating-schedules/command-settings/aws-ecs-task"},{"title":"Run AWS Glue","sidebarTitle":"AWS Glue","href":"/products/bolt/creating-schedules/command-settings/aws-glue"},{"title":"Invoke AWS Lambda","sidebarTitle":"AWS Lambda","href":"/products/bolt/creating-schedules/command-settings/aws-lambda"},{"title":"Run AWS SageMaker Pipeline","sidebarTitle":"AWS SageMaker","href":"/products/bolt/creating-schedules/command-settings/aws-sagemaker-pipeline"},{"title":"Run AWS Step Functions","sidebarTitle":"AWS Step Functions","href":"/products/bolt/creating-schedules/command-settings/aws-step-functions"},{"title":"Run Azure Data Factory Pipeline","sidebarTitle":"Azure Data Factory","href":"/products/bolt/creating-schedules/command-settings/azure-data-factory-pipeline"},{"title":"Run BigQuery Scheduled Query","sidebarTitle":"BigQuery Scheduled Query","href":"/products/bolt/creating-schedules/command-settings/bigquery-scheduled-query"},{"title":"Toggle Paradime Bolt Schedule","sidebarTitle":"Bolt Schedule Toggle","href":"/products/bolt/creating-schedules/command-settings/paradime-bolt-schedule-toggle-commands"},{"title":"Refresh Paradime Catalog","sidebarTitle":"Catalog Refresh","href":"/products/bolt/creating-schedules/command-settings/paradime-refresh-catalog"},{"title":"Push to DataHub","sidebarTitle":"DataHub","href":"/products/bolt/creating-schedules/command-settings/datahub-sync"},{"title":"Run dbt™ Command","sidebarTitle":"dbt™","href":"/products/bolt/creating-schedules/command-settings/dbt-tm-commands"},{"title":"Run DinoAI Background Agent","sidebarTitle":"DinoAI Agent","href":"/products/bolt/creating-schedules/command-settings/paradime-dinoai-agent-trigger"},{"title":"Run Elementary","sidebarTitle":"Elementary","href":"/products/bolt/creating-schedules/command-settings/elementary-commands"},{"title":"Sync Fivetran Connector","sidebarTitle":"Fivetran","href":"/products/bolt/creating-schedules/command-settings/fivetran-connector-sync"},{"title":"Invoke GCP Cloud Function","sidebarTitle":"GCP Cloud Function","href":"/products/bolt/creating-schedules/command-settings/gcp-cloud-function"},{"title":"Run GCP Cloud Run Job","sidebarTitle":"GCP Cloud Run","href":"/products/bolt/creating-schedules/command-settings/gcp-cloud-run-job"},{"title":"Run GCP Dataflow","sidebarTitle":"GCP Dataflow","href":"/products/bolt/creating-schedules/command-settings/gcp-dataflow"},{"title":"Run GCP Dataproc Job","sidebarTitle":"GCP Dataproc","href":"/products/bolt/creating-schedules/command-settings/gcp-dataproc-job"},{"title":"Control GCP Datastream","sidebarTitle":"GCP Datastream","href":"/products/bolt/creating-schedules/command-settings/gcp-datastream"},{"title":"Trigger GitHub Actions","sidebarTitle":"GitHub Actions","href":"/products/bolt/creating-schedules/command-settings/github-actions"},{"title":"Run Hex Project","sidebarTitle":"Hex","href":"/products/bolt/creating-schedules/command-settings/hex-project"},{"title":"Sync Hightouch","sidebarTitle":"Hightouch","href":"/products/bolt/creating-schedules/command-settings/hightouch-sync"},{"title":"Run Lightdash","sidebarTitle":"Lightdash","href":"/products/bolt/creating-schedules/command-settings/lightdash-commands"},{"title":"Run Matillion Pipeline","sidebarTitle":"Matillion","href":"/products/bolt/creating-schedules/command-settings/matillion-pipeline"},{"title":"Run MonteCarlo CLI","sidebarTitle":"Monte Carlo","href":"/products/bolt/creating-schedules/command-settings/monte-carlo-commands"},{"title":"Refresh PowerBI Dataset","sidebarTitle":"Power BI","href":"/products/bolt/creating-schedules/command-settings/power-bi-dataset-refresh"},{"title":"Run pre-commit","sidebarTitle":"pre-commit","href":"/products/bolt/creating-schedules/command-settings/pre-commit"},{"title":"Run Python Script","sidebarTitle":"Python","href":"/products/bolt/creating-schedules/command-settings/python-scripts"},{"title":"Refresh Tableau Data Source","sidebarTitle":"Tableau Data Source","href":"/products/bolt/creating-schedules/command-settings/tableau-data-source-refresh"},{"title":"Refresh Tableau Workbook","sidebarTitle":"Tableau Workbook","href":"/products/bolt/creating-schedules/command-settings/tableau-workbook-refresh"},{"title":"Trigger Zapier","sidebarTitle":"Zapier","href":"/products/bolt/creating-schedules/command-settings/zapier"}]},{"title":"Schedule Settings","href":"/products/bolt/creating-schedules/schedule-settings"},{"title":"Self-Healing settings for a Bolt schedule","href":"/products/bolt/creating-schedules/self-healing"},{"title":"Notifications","href":"/products/bolt/creating-schedules/notification-settings"},{"title":"Alert Templates","href":"/products/bolt/creating-schedules/alert-templates"},{"group":"Integrations","root":{"title":"Bolt Trigger Integrations","href":"/products/bolt/creating-schedules/trigger-integrations/index"},"pages":[{"title":"Trigger Datadog Incidents","href":"/products/bolt/creating-schedules/trigger-integrations/trigger-datadog-incidents"},{"title":"Trigger incident.io Incidents","href":"/products/bolt/creating-schedules/trigger-integrations/trigger-incident.io-incidents"},{"title":"Trigger PagerDuty Alarms","href":"/products/bolt/creating-schedules/trigger-integrations/trigger-pagerduty-alarms"},{"title":"Trigger New Relic Incidents","href":"/products/bolt/creating-schedules/trigger-integrations/trigger-new-relic-incidents"}]},{"title":"Environment Variable Overrides","href":"/products/bolt/creating-schedules/schedules-environment-variables"},{"title":"Environment Variables in Commands","href":"/products/bolt/creating-schedules/environment-variables-in-commands"},{"title":"Audit Variables","href":"/products/bolt/creating-schedules/audit-variables"}]},{"group":"Deploy Schedules","icon":"cloud-upload","pages":[{"title":"Deploy Schedules","sidebarTitle":"Overview","href":"/products/bolt/creating-schedules/deploy"},{"title":"Deploy from the UI","sidebarTitle":"Deploy from the UI","href":"/products/bolt/creating-schedules/deploy-from-ui"},{"group":"Schedules as Code","root":{"title":"Schedules as Code","href":"/products/bolt/creating-schedules/schedules-as-code/index"},"pages":[{"title":"Configuration Reference","href":"/products/bolt/creating-schedules/schedules-as-code/configuration-reference"},{"title":"The .bolt/ Folder","href":"/products/bolt/creating-schedules/schedules-as-code/modular-schedules-with-the-.bolt-folder"},{"title":"Editing YAML in the UI","href":"/products/bolt/creating-schedules/schedules-as-code/editing-yaml-schedules-from-the-paradime-ui"},{"title":"Deploying from a Custom Branch","href":"/products/bolt/creating-schedules/schedules-as-code/deploying-yaml-schedules-from-a-custom-branch"},{"title":"JSON Schema","href":"/products/bolt/creating-schedules/schedules-as-code/json-schema-bolt-schedules"}]}]},{"group":"Managing Schedules","icon":"refresh-cw","pages":[{"title":"Find, run, and open schedules on the Bolt Schedules page","sidebarTitle":"Overview","href":"/products/bolt/managing-schedules/index"},{"title":"Schedule Details","href":"/products/bolt/managing-schedules/schedule-details"},{"title":"Run Details","href":"/products/bolt/managing-schedules/run-details"},{"title":"Run Logs and Artifacts","href":"/products/bolt/managing-schedules/run-logs-and-artifacts"},{"title":"Retrying a Run","href":"/products/bolt/managing-schedules/retrying-a-run"},{"group":"External Triggers","root":{"title":"Start Bolt schedules from outside Paradime","sidebarTitle":"External Triggers","href":"/products/bolt/external-triggers/index"},"pages":[{"title":"Bolt API","icon":"sparkles","href":"/products/bolt/bolt-api"},{"title":"Incoming webhooks","href":"/products/bolt/external-triggers/incoming-webhooks"},{"title":"Trigger Bolt schedules from Airflow","icon":"https://mintlify.s3.us-west-1.amazonaws.com/paradime-docs/images/integrations/airflow.svg","href":"/products/bolt/external-triggers/airflow"},{"title":"Trigger Bolt schedules from Dagster","icon":"https://mintlify.s3.us-west-1.amazonaws.com/paradime-docs/images/integrations/dagster.svg","href":"/products/bolt/external-triggers/dagster"}]}]},{"group":"CI/CD","icon":"rocket","pages":[{"title":"Bolt CI/CD for dbt™ pull requests and deploys","sidebarTitle":"Overview","href":"/products/bolt/ci-cd/index"},{"group":"Turbo CI","root":{"title":"Turbo CI for dbt™ pull requests","sidebarTitle":"Turbo CI","href":"/products/bolt/ci-cd/turbo-ci/index"},"pages":[{"title":"Turbo CI on Azure DevOps pull requests","sidebarTitle":"Azure DevOps","href":"/products/bolt/ci-cd/turbo-ci/azure-devops"},{"title":"Turbo CI on BitBucket pull requests","sidebarTitle":"BitBucket","href":"/products/bolt/ci-cd/turbo-ci/bitbucket"},{"title":"Turbo CI on GitHub pull requests","sidebarTitle":"GitHub","href":"/products/bolt/ci-cd/turbo-ci/github"},{"title":"Turbo CI on GitLab merge requests","sidebarTitle":"GitLab","href":"/products/bolt/ci-cd/turbo-ci/gitlab"},{"title":"Turbo CI with Snowflake shared databases","sidebarTitle":"Snowflake Shared Databases","href":"/products/bolt/ci-cd/turbo-ci/snowflake-shared-databases"},{"title":"Turbo CI Schema Cleanup macro for dbt™","sidebarTitle":"Schema Cleanup","href":"/products/bolt/ci-cd/turbo-ci/paradime-turbo-ci-schema-cleanup"},{"title":"Turbo CI FAQ","sidebarTitle":"FAQ","href":"/products/bolt/ci-cd/turbo-ci/faq"}]},{"group":"Continuous Deployment","root":{"title":"Continuous Deployment","href":"/products/bolt/ci-cd/continuous-deployment/index"},"pages":[{"title":"Continuous Deployment with GitHub for dbt™","sidebarTitle":"GitHub","href":"/products/bolt/ci-cd/continuous-deployment/github"},{"title":"Continuous Deployment with Azure Pipelines","sidebarTitle":"Azure DevOps","href":"/products/bolt/ci-cd/continuous-deployment/azure-devops"},{"title":"Continuous Deployment with BitBucket Pipelines","sidebarTitle":"BitBucket","href":"/products/bolt/ci-cd/continuous-deployment/bitbucket"},{"title":"Continuous Deployment with GitLab","sidebarTitle":"GitLab","href":"/products/bolt/ci-cd/continuous-deployment/gitlab"}]},{"title":"Run Bolt schedules in order on pull requests and merges","sidebarTitle":"Chains","href":"/products/bolt/ci-cd/chains"},{"group":"Column-Level Lineage Diff","root":{"title":"Column-Level Lineage Diff","href":"/products/bolt/ci-cd/lineage-diff/index"},"pages":[{"title":"Column-Level Lineage Diff on GitHub","sidebarTitle":"GitHub","description":"Set up Paradime Column-Level Lineage Diff on GitHub pull requests to post upstream and downstream column-impact reports as PR comments for dbt™ changes.","href":"/products/bolt/ci-cd/lineage-diff/github"},{"title":"Column-Level Lineage Diff on GitLab","sidebarTitle":"GitLab","href":"/products/bolt/ci-cd/lineage-diff/gitlab"},{"title":"Column-Level Lineage Diff on Azure DevOps","sidebarTitle":"Azure DevOps","description":"Set up Paradime Column-Level Lineage Diff on Azure DevOps pull requests to post upstream and downstream column-impact reports as PR comments for dbt™ changes.","href":"/products/bolt/ci-cd/lineage-diff/azure-devops"},{"title":"Column-Level Lineage Diff on BitBucket","sidebarTitle":"BitBucket","href":"/products/bolt/ci-cd/lineage-diff/bitbucket"},{"title":"dbt™ Mesh","href":"/products/bolt/ci-cd/lineage-diff/dbt-mesh"},{"title":"Column-Level Lineage Diff for Looker","sidebarTitle":"Looker","href":"/products/bolt/ci-cd/lineage-diff/looker"},{"title":"Tableau","href":"/products/bolt/ci-cd/lineage-diff/tableau"},{"title":"Column-Level Lineage Diff for ThoughtSpot","sidebarTitle":"ThoughtSpot","href":"/products/bolt/ci-cd/lineage-diff/thoughtspot"}]}]}]},{"anchor":"Radar","icon":"gauge","pages":[{"title":"Radar","href":"/products/radar"}]},{"anchor":"Code IDE","icon":"square-terminal","pages":[{"title":"Code IDE","href":"/products/code-ide"}]},{"anchor":"Catalog","icon":"library","pages":[{"title":"Catalog","href":"/products/data-catalog"}]},{"anchor":"Administration","icon":"settings","pages":[{"title":"Administration","href":"/products/settings"}]}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/integrations"}]},{"tab":"Developers","pages":[{"title":"Developers","href":"/developers"}]},{"tab":"GraphQL Schema (generated - do not remove; powers API Reference pages)","hidden":true,"pages":[{"title":"GraphQL Schema (generated - do not remove; powers API Reference pages)","href":"/graphql-reference/queries/apiKeyIdentity"}]},{"tab":"Help \u0026 Resources","pages":[{"title":"Help \u0026 Resources","href":"/get-help/support"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/overview"}]}]},"basePath":"","title":"Column-Level Lineage Diff on GitLab - Paradime","buildId":"dpl_596ePT575z4qnAFksq1biRW97aLY","deploymentId":"dpl_596ePT575z4qnAFksq1biRW97aLY","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-BXrZabKK.js","DynamicMarkdown-CtasenyM.js","zoom-image-lightbox-C5F0mVLH.js","lightbox-handle-r17bVUz3.js"]}