<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: sai krishna chowdary</title>
    <description>The latest articles on DEV Community by sai krishna chowdary (@kittu181707).</description>
    <link>https://dev.to/kittu181707</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4033818%2Ff82ac926-b61f-4908-a282-923514502b85.jpg</url>
      <title>DEV Community: sai krishna chowdary</title>
      <link>https://dev.to/kittu181707</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kittu181707"/>
    <language>en</language>
    <item>
      <title>Navigating GitLab CI/CD on Forks: Lessons from Real Contributions</title>
      <dc:creator>sai krishna chowdary</dc:creator>
      <pubDate>Sun, 11 Oct 2026 07:43:59 +0000</pubDate>
      <link>https://dev.to/kittu181707/navigating-gitlab-cicd-on-forks-lessons-from-real-contributions-1c4a</link>
      <guid>https://dev.to/kittu181707/navigating-gitlab-cicd-on-forks-lessons-from-real-contributions-1c4a</guid>
      <description>&lt;p&gt;In my previous post, &lt;a href="https://dev.to/kittu181707/my-first-gitlab-open-source-contribution-from-issue-to-merge-request-1k14"&gt;My First GitLab Open Source Contribution: From Issue to Merge Request&lt;/a&gt;, I shared my journey of opening and merging a database fix in the core &lt;a href="https://gitlab.com/gitlab-org/gitlab" rel="noopener noreferrer"&gt;&lt;code&gt;gitlab-org/gitlab&lt;/code&gt;&lt;/a&gt; monolith.&lt;/p&gt;

&lt;p&gt;Since having my first contributions merged—such as fixing the &lt;a href="https://gitlab.com/gitlab-org/gitlab/-/merge_requests/260196" rel="noopener noreferrer"&gt;Contributor Analytics sidebar permission check (!260196)&lt;/a&gt;—I expanded my focus into GitLab's wider ecosystem. Over the past week, I actively authored contributions across satellite repositories, including the &lt;strong&gt;GitLab Development Kit (GDK)&lt;/strong&gt;, &lt;strong&gt;GitLab Shell&lt;/strong&gt;, &lt;strong&gt;GitLab CLI (&lt;code&gt;glab&lt;/code&gt;)&lt;/strong&gt;, &lt;strong&gt;GitLab Elasticsearch Indexer&lt;/strong&gt;, &lt;strong&gt;Terraform Provider&lt;/strong&gt;, and &lt;strong&gt;Dangerfiles&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Working across multiple distinct repositories quickly revealed a common hurdle for open-source contributors: &lt;strong&gt;writing the code fix is only half the process; understanding pipeline governance, fork isolation, and automated tooling is where real contributions succeed or stall.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are four real-world lessons and pipeline behaviors I encountered while submitting merge requests across the ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Fork Security Boundary
&lt;/h2&gt;

&lt;p&gt;When contributing from a personal fork (&lt;code&gt;your-username/project&lt;/code&gt;) targeting an upstream repository (&lt;code&gt;gitlab-org/project&lt;/code&gt;), GitLab CI/CD runs within an intentional security boundary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Contributor Fork:&lt;/strong&gt; Runs on personal shared runners. For security, community fork pipelines cannot access upstream protected CI/CD variables or secrets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review Hand-Off:&lt;/strong&gt; Assigning maintainers via &lt;code&gt;@gitlab-bot ready&lt;/code&gt; queues the merge request for upstream review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upstream Project:&lt;/strong&gt; Upstream runners execute the full compliance suite with access to internal bot tokens and maintainer approval gates.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Masked Token Behavior
&lt;/h3&gt;

&lt;p&gt;Several repositories use &lt;a href="https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles" rel="noopener noreferrer"&gt;Dangerbot&lt;/a&gt; (&lt;code&gt;danger-review&lt;/code&gt;) or automated labelers (&lt;code&gt;autolabels&lt;/code&gt;). These utilities require GitLab API tokens (such as &lt;code&gt;DANGER_GITLAB_API_TOKEN&lt;/code&gt;) to post automated comments.&lt;/p&gt;

&lt;p&gt;Because forks do not inherit protected secrets, these jobs will fail on your fork runner. However, repositories configure these specific jobs with &lt;code&gt;allow_failure: true&lt;/code&gt;. Recognizing that this failure is expected security isolation prevents unnecessary troubleshooting when your functional tests have already passed.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Reading the "Checks" Dashboard: Green Check vs. Orange Warning
&lt;/h2&gt;

&lt;p&gt;In GitLab's merge request view, the &lt;strong&gt;Checks&lt;/strong&gt; column displays status badges that often confuse first-time contributors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Approval Count (&lt;code&gt;0/1&lt;/code&gt;):&lt;/strong&gt; Indicates human review status. Seeing &lt;code&gt;0/1&lt;/code&gt; simply means the MR is waiting in the review queue for a project maintainer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Green Checkmark &lt;code&gt;(✓)&lt;/code&gt;:&lt;/strong&gt; Every pipeline job passed cleanly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orange Exclamation &lt;code&gt;(!)&lt;/code&gt; ("Passed with warnings"):&lt;/strong&gt; All compilation, build, unit test, and linting jobs &lt;strong&gt;passed&lt;/strong&gt;, but an optional job marked &lt;code&gt;allow_failure: true&lt;/code&gt; completed with a non-blocking warning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Red Cross &lt;code&gt;(✗)&lt;/code&gt;:&lt;/strong&gt; A mandatory blocking test, linter, or build failed and requires an update.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaway:&lt;/strong&gt; An orange &lt;code&gt;(!)&lt;/code&gt; warning does not block merging. Once maintainers review and approve your code, they can merge the MR directly.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Real Engineering Quirks Encountered
&lt;/h2&gt;

&lt;h3&gt;
  
  
  A. The Scoped Label Permission Barrier
&lt;/h3&gt;

&lt;p&gt;While contributing to &lt;a href="https://gitlab.com/gitlab-org/terraform-provider-gitlab/-/merge_requests/3324" rel="noopener noreferrer"&gt;&lt;code&gt;gitlab-org/terraform-provider-gitlab&lt;/code&gt; (!3324)&lt;/a&gt;, the pipeline failed on a label validation script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// CI Job: validate:mr-labels
Checking MR for required type::* label...
ERROR: Merge Request must have at least one type::* label
       (e.g. type::maintenance, type::feature)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Attempting to apply the label via the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;glab mr update 3324 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--add-label&lt;/span&gt; &lt;span class="s2"&gt;"type::maintenance"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under GitLab's &lt;a href="https://docs.gitlab.com/user/project/labels/#scoped-labels" rel="noopener noreferrer"&gt;scoped labels architecture&lt;/a&gt;, modifying &lt;code&gt;type::*&lt;/code&gt; labels requires &lt;strong&gt;Reporter+ project permissions&lt;/strong&gt;. For community contributors, the API silently ignores the scoped label update.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Do not try to force project permissions. Trigger Reviewer Roulette with &lt;code&gt;@gitlab-bot ready&lt;/code&gt;, and leave a clear triage comment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Hi &lt;a class="mentioned-user" href="https://dev.to/reviewer"&gt;@reviewer&lt;/a&gt;! Community contributors cannot apply scoped group labels. Could you please apply &lt;code&gt;~type::maintenance&lt;/code&gt; and trigger the review pipeline? Thanks!"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  B. Schema-Generated Documentation Mismatches
&lt;/h3&gt;

&lt;p&gt;When updating documentation links in provider codebases, editing only the &lt;code&gt;.md&lt;/code&gt; documentation file often causes the CI pipeline to fail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=== RUN   TestGeneratedDocsUpToDate
    provider_test.go:42: documentation out of sync with schema
--- FAIL: TestGeneratedDocsUpToDate (0.12s)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this happens:&lt;/strong&gt; In provider codebases like &lt;a href="https://gitlab.com/gitlab-org/terraform-provider-gitlab/-/merge_requests/3327" rel="noopener noreferrer"&gt;&lt;code&gt;terraform-provider-gitlab&lt;/code&gt; (!3327)&lt;/a&gt;, markdown documentation is generated from Go struct tags via &lt;a href="https://github.com/hashicorp/terraform-plugin-docs" rel="noopener noreferrer"&gt;&lt;code&gt;tfplugindocs&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// internal/provider/datasource_gitlab_security_policy_document.go&lt;/span&gt;
&lt;span class="s"&gt;"security_policy"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StringAttribute&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;MarkdownDescription&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Learn more at "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
      &lt;span class="s"&gt;"https://docs.gitlab.com/user/application_security/policies/scan_execution_policies/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you edit the generated markdown file without updating the Go source definition, the test detects the mismatch and fails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt; Always search the repository for occurrences of the string and update both the Go schema &lt;code&gt;MarkdownDescription&lt;/code&gt; and the markdown file together.&lt;/p&gt;




&lt;h3&gt;
  
  
  C. Catching Silent 404s and Auth Redirects
&lt;/h3&gt;

&lt;p&gt;Documentation maintenance often requires navigating platform migrations. While updating references in the &lt;a href="https://gitlab.com/gitlab-org/gitlab-development-kit/-/merge_requests/6249" rel="noopener noreferrer"&gt;GitLab Development Kit (!6249)&lt;/a&gt;, legacy links to individual tracing and metrics guides redirected unexpectedly to internal sign-in pages (&lt;code&gt;HTTP 403&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;GitLab had consolidated standalone observability topics into a single &lt;a href="https://docs.gitlab.com/operations/observability/observability/" rel="noopener noreferrer"&gt;GitLab Observability documentation guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Lesson:&lt;/strong&gt; Never assume an updated link works based on the path structure alone. Verify link health programmatically before pushing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// Verify the target URL returns HTTP 200
curl &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://docs.gitlab.com/operations/observability/observability/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Open Source Contributor Checklist
&lt;/h2&gt;

&lt;p&gt;Here is the checklist I follow before marking any merge request ready for review:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[x] &lt;strong&gt;DCO Signed-off-by:&lt;/strong&gt; Ensure commits include &lt;code&gt;Signed-off-by: Name &amp;lt;email&amp;gt;&lt;/code&gt; (&lt;code&gt;git commit -s&lt;/code&gt;) to satisfy the &lt;a href="https://developercertificate.org/" rel="noopener noreferrer"&gt;Developer Certificate of Origin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;Link Health Verification:&lt;/strong&gt; Test modified URLs with &lt;code&gt;curl&lt;/code&gt; to confirm they return &lt;code&gt;HTTP 200&lt;/code&gt; without hitting authentication redirects.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;Atomic Commits:&lt;/strong&gt; Keep changes focused on a single concern.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;Summon Reviewers:&lt;/strong&gt; Use &lt;code&gt;@gitlab-bot ready&lt;/code&gt; to engage Reviewer Roulette and notify the assigned maintainer.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;Clear Context:&lt;/strong&gt; Summarize the change and explain why it improves the codebase.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Contributing to open source across multiple repositories provides firsthand insight into the automated workflows and governance that protect large-scale platforms like GitLab.&lt;/p&gt;

&lt;p&gt;Every failed check, missing label, and schema mismatch is a practical lesson in how modern distributed codebases are validated, reviewed, and maintained.&lt;/p&gt;

&lt;p&gt;Keep reading pipeline logs, keep asking questions in the review threads, and happy contributing! 🚀&lt;/p&gt;

</description>
      <category>gitlab</category>
      <category>opensource</category>
      <category>cicd</category>
      <category>devops</category>
    </item>
    <item>
      <title>My First GitLab Open Source Contribution: From Issue to Merge Request</title>
      <dc:creator>sai krishna chowdary</dc:creator>
      <pubDate>Wed, 07 Oct 2026 01:49:59 +0000</pubDate>
      <link>https://dev.to/kittu181707/my-first-gitlab-open-source-contribution-from-issue-to-merge-request-1k14</link>
      <guid>https://dev.to/kittu181707/my-first-gitlab-open-source-contribution-from-issue-to-merge-request-1k14</guid>
      <description>&lt;h2&gt;
  
  
  My First GitLab Open Source Contribution: From Issue to Merge Request
&lt;/h2&gt;

&lt;p&gt;Contributing to a large open-source project can feel intimidating when you are seeing the codebase for the first time. GitLab is a particularly interesting project to contribute to because it combines a large Ruby on Rails application with databases, CI/CD, frontend code, and many other components.&lt;/p&gt;

&lt;p&gt;For my first GitLab contribution, I decided to work on a database-related issue involving PostgreSQL table storage and HOT updates.&lt;/p&gt;

&lt;p&gt;This post describes what I learned while going from an issue to an actual merge request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding a Contribution
&lt;/h2&gt;

&lt;p&gt;I started by looking through GitLab issues that were suitable for a community contribution.&lt;/p&gt;

&lt;p&gt;The issue I selected was #629994, "Lower fillfactor on the vulnerability identifier tables."&lt;/p&gt;

&lt;p&gt;The issue concerned two tables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vulnerability_identifiers&lt;/li&gt;
&lt;li&gt;vulnerability_occurrence_identifiers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The issue included measurements showing relatively low HOT-update fractions for these tables. That made it a good opportunity to understand how PostgreSQL storage parameters can affect update behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding PostgreSQL Fillfactor
&lt;/h2&gt;

&lt;p&gt;PostgreSQL stores table rows inside data pages. The fillfactor storage parameter controls how much of a table page PostgreSQL aims to fill when creating or rewriting the table.&lt;/p&gt;

&lt;p&gt;For tables that are frequently updated, leaving some free space on a page can be useful because it gives PostgreSQL more room to place a new row version on the same page.&lt;/p&gt;

&lt;p&gt;For this contribution, the requested target was a fillfactor of 90.&lt;/p&gt;

&lt;p&gt;The migration therefore changes the storage parameter on both vulnerability identifier tables to fillfactor=90.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why HOT Updates Matter
&lt;/h2&gt;

&lt;p&gt;PostgreSQL supports Heap-Only Tuple (HOT) updates.&lt;/p&gt;

&lt;p&gt;A HOT update can avoid creating new index entries when the updated row can remain on the same heap page and the indexed columns do not require new index entries.&lt;/p&gt;

&lt;p&gt;This can reduce index-related work during updates.&lt;/p&gt;

&lt;p&gt;The issue reported measured HOT-update fractions of approximately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;32.0% for vulnerability_identifiers&lt;/li&gt;
&lt;li&gt;64.2% for vulnerability_occurrence_identifiers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These measurements provided the motivation for increasing the available free space on the pages by using a lower fillfactor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing the Change
&lt;/h2&gt;

&lt;p&gt;The implementation was intentionally small.&lt;/p&gt;

&lt;p&gt;I created a post-deployment database migration.&lt;/p&gt;

&lt;p&gt;The migration uses GitLab's database migration framework and applies a fillfactor of 90 to both tables:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# frozen_string_literal: true

class LowerFillfactorOnVulnerabilityTables &amp;lt; Gitlab::Database::Migration[2.3]
  milestone '19.5'

  def up
    execute('ALTER TABLE vulnerability_identifiers SET (fillfactor=90)')
    execute('ALTER TABLE vulnerability_occurrence_identifiers SET (fillfactor=90)')
  end

  def down
    execute('ALTER TABLE vulnerability_identifiers RESET (fillfactor)')
    execute('ALTER TABLE vulnerability_occurrence_identifiers RESET (fillfactor)')
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The migration includes both up and down methods so that the setting can be applied and reverted.&lt;/p&gt;

&lt;p&gt;One thing I learned from this contribution is that a small code change can still require understanding the surrounding database architecture and migration conventions of a large project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working With the GitLab Community Fork
&lt;/h2&gt;

&lt;p&gt;Another part of the process was learning how GitLab handles contributions from external contributors.&lt;/p&gt;

&lt;p&gt;GitLab provides a Community Fork workflow for contributors. I created my contribution branch:&lt;/p&gt;

&lt;p&gt;629994-lower-fillfactor-on-vulnerability-identifiers&lt;/p&gt;

&lt;p&gt;and pushed the branch to the GitLab Community Fork.&lt;/p&gt;

&lt;p&gt;This was an important part of the experience because contributing to a large open-source repository is not only about writing code. Understanding the project's contribution workflow is equally important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the Merge Request
&lt;/h2&gt;

&lt;p&gt;After pushing the branch, I opened a merge request against GitLab's main repository.&lt;/p&gt;

&lt;p&gt;The merge request was:&lt;/p&gt;

&lt;p&gt;!260121 — db: lower fillfactor on vulnerability identifier tables to 90&lt;/p&gt;

&lt;p&gt;I linked the merge request to issue #629994 so that the relationship between the implementation and the original issue was clear.&lt;/p&gt;

&lt;p&gt;The merge request also included instructions for validating the migration.&lt;/p&gt;

&lt;p&gt;For example, the migration can be executed with:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bin/rake db:migrate:up VERSION=20261006165253
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The resulting PostgreSQL table options can then be inspected to verify that the fillfactor has been set correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CI Experience
&lt;/h2&gt;

&lt;p&gt;One of the biggest lessons came after opening the merge request.&lt;/p&gt;

&lt;p&gt;GitLab automatically started CI pipelines to validate the contribution.&lt;/p&gt;

&lt;p&gt;The initial pipeline contained failures across several different jobs. An important part of the investigation was that multiple unrelated jobs showed the same shell error:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pop_var_context: head of shell_variables not a function context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The error appeared in database setup and migration-validation jobs as well as other CI jobs.&lt;/p&gt;

&lt;p&gt;The available logs did not show a PostgreSQL error related specifically to the migration, the two vulnerability tables, or the fillfactor setting.&lt;/p&gt;

&lt;p&gt;This was a useful reminder that a failed CI pipeline does not automatically mean that the code being contributed is wrong.&lt;/p&gt;

&lt;p&gt;The appropriate response was to investigate the actual failure rather than immediately changing working code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;This first contribution taught me several things that I would not have learned from simply solving coding problems locally.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Read the issue before writing code
&lt;/h3&gt;

&lt;p&gt;The issue often contains important context about why a change is required.&lt;/p&gt;

&lt;p&gt;In this case, the HOT-update measurements helped explain why changing the fillfactor was being considered.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Understand the technology behind the change
&lt;/h3&gt;

&lt;p&gt;The migration itself was only a few lines of Ruby.&lt;/p&gt;

&lt;p&gt;However, understanding PostgreSQL pages, fillfactor, and HOT updates made the change much easier to reason about.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Large open-source projects have established workflows
&lt;/h3&gt;

&lt;p&gt;Branching, community forks, merge requests, labels, approvals, CI pipelines, and contribution rules are all part of the process.&lt;/p&gt;

&lt;p&gt;Knowing the workflow is just as important as knowing Git.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. CI failures need investigation
&lt;/h3&gt;

&lt;p&gt;A red pipeline is not automatically proof of a bad implementation.&lt;/p&gt;

&lt;p&gt;Looking at the actual failure messages and determining whether they are related to the changed code is an important part of software engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Small changes can still require careful reasoning
&lt;/h3&gt;

&lt;p&gt;The final migration is small, but database storage behavior can have performance implications at scale.&lt;/p&gt;

&lt;p&gt;That is one of the things I find interesting about contributing to mature open-source projects: even a small change can require careful investigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;At the time of writing, the merge request is going through the normal GitLab review and CI process.&lt;/p&gt;

&lt;p&gt;Regardless of the final outcome, the contribution has already given me practical experience with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitLab's contribution workflow&lt;/li&gt;
&lt;li&gt;PostgreSQL storage parameters&lt;/li&gt;
&lt;li&gt;Database migrations&lt;/li&gt;
&lt;li&gt;HOT updates&lt;/li&gt;
&lt;li&gt;Git branches and forks&lt;/li&gt;
&lt;li&gt;Merge requests&lt;/li&gt;
&lt;li&gt;CI troubleshooting&lt;/li&gt;
&lt;li&gt;Open-source collaboration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is my first contribution to the GitLab codebase, and I hope it will be the beginning of many more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;My biggest takeaway is that open-source contribution is not simply about finding a line of code to change.&lt;/p&gt;

&lt;p&gt;It is about understanding the problem, researching the existing implementation, following the project's conventions, testing the change, communicating clearly, and working through review and CI.&lt;/p&gt;

&lt;p&gt;For anyone making their first contribution to a large project, I would recommend starting with a well-defined issue, learning the project's contribution workflow, and not being afraid of a large codebase.&lt;/p&gt;

&lt;p&gt;The first contribution is the hardest part. After that, the process starts becoming much more familiar.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>gitlab</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Self-Hosting SigNoz with Foundry on Windows ARM64 (and the WSL2 wall that almost stopped me)</title>
      <dc:creator>sai krishna chowdary</dc:creator>
      <pubDate>Fri, 17 Jul 2026 12:19:48 +0000</pubDate>
      <link>https://dev.to/kittu181707/self-hosting-signoz-with-foundry-on-windows-arm64-and-the-wsl2-gotcha-that-almost-stopped-me-1bfn</link>
      <guid>https://dev.to/kittu181707/self-hosting-signoz-with-foundry-on-windows-arm64-and-the-wsl2-gotcha-that-almost-stopped-me-1bfn</guid>
      <description>&lt;p&gt;My laptop is a Windows ARM64 machine. Most self-hosted observability tooling assumes you're on Linux, macOS, or at worst regular x86 Windows — so when I sat down to self-host SigNoz for the Agents of SigNoz hackathon, I genuinely didn't know if it would work at all before I'd tried. An hour later I had a fully healthy stack, an MCP server responding, and one very specific error message that taught me something the docs don't spell out.&lt;/p&gt;

&lt;p&gt;Why self-host, and why Foundry&lt;/p&gt;

&lt;p&gt;I'm building an autonomous incident-response agent for this hackathon, and my first instinct was to reach for SigNoz Cloud — no infrastructure to babysit, one less thing to break mid-week. But the hackathon's own field requirements are specific: install via Foundry, and include the resulting casting.yaml/casting.yaml.lock in your repo so judges can reproduce the deployment. That's a self-hosted-only requirement — Foundry doesn't target Cloud at all. So before committing to that architecture for the real project, I wanted to know: does this actually work cleanly on my hardware, or am I about to spend Day 1 fighting Docker instead of building?&lt;/p&gt;

&lt;p&gt;Getting Foundry running&lt;/p&gt;

&lt;p&gt;Foundry is SigNoz's newer install path — it replaced the old install script, and the whole idea is config-as-code: one file describes your deployment, one command stands it up. The minimal casting.yaml is small enough to read in full:&lt;/p&gt;

&lt;p&gt;yamlapiVersion: v1alpha1&lt;br&gt;
kind: Installation&lt;br&gt;
metadata:&lt;br&gt;
  name: signoz&lt;br&gt;
spec:&lt;br&gt;
  deployment:&lt;br&gt;
    flavor: compose&lt;br&gt;
    mode: docker&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;bashfoundryctl cast -f casting.yaml&lt;/p&gt;

&lt;p&gt;That single command checks your environment, generates the actual Compose files, and brings up ClickHouse, ClickHouse Keeper, Postgres, the OTel collector, and the SigNoz UI. Watching everything land on Healthy in one pass, on an ARM64 machine I half-expected to fight with, was a genuinely good moment.&lt;/p&gt;

&lt;p&gt;The wall: "docker: command not found"&lt;/p&gt;

&lt;p&gt;Everything worked — until I stopped the containers to test a clean restart, and came back to this:&lt;/p&gt;

&lt;p&gt;The command 'docker' could not be found in this WSL 2 distro.&lt;br&gt;
We recommend to activate the WSL integration in Docker Desktop settings.&lt;/p&gt;

&lt;p&gt;This confused me for longer than I'd like to admit, because Docker had just worked, in the same terminal, minutes earlier. The actual cause: Docker Desktop's WSL integration isn't a single global switch — it's enabled per distro, individually, and I hadn't noticed my specific distro (Dicky) had its own toggle sitting separately in Docker Desktop → Settings → Resources → WSL Integration. Flipping that on and hitting Apply &amp;amp; Restart fixed it immediately.&lt;/p&gt;

&lt;p&gt;The lesson that's easy to miss from the docs alone: "enable WSL integration" doesn't mean "flip it on once." If you're running multiple WSL distros, or reinstalled/renamed yours, check that your specific distro is checked, not just that integration is on in general.&lt;/p&gt;

&lt;p&gt;Turning on the MCP server&lt;/p&gt;

&lt;p&gt;The feature I actually wanted to test was SigNoz's own MCP (Model Context Protocol) server — since my hackathon project is an agent that needs to query telemetry programmatically, and SigNoz shipping this as a first-class, one-flag addition to Foundry is directly relevant. Adding it meant one small edit to casting.yaml:&lt;/p&gt;

&lt;p&gt;yamlspec:&lt;br&gt;
  mcp:&lt;br&gt;
    spec:&lt;br&gt;
      enabled: true&lt;/p&gt;

&lt;p&gt;Re-running foundryctl cast added the signoz-mcp container without disturbing anything already running — no downtime for the rest of the stack, which I wasn't expecting from a config-as-code tool on a first try. A health check confirmed it:&lt;/p&gt;

&lt;p&gt;bashcurl -fsS localhost:8000/livez &amp;amp;&amp;amp; echo " OK"&lt;/p&gt;

&lt;h1&gt;
  
  
  ok OK
&lt;/h1&gt;

&lt;p&gt;That means any MCP-compatible client — Claude Code, Cursor, or the custom agent I'm building — can query real traces, logs, and metrics using the same schema a human sees in the UI, without a separate integration project. For a hackathon track built specifically around agent-native observability, that's a meaningfully lower barrier than I expected.&lt;/p&gt;

&lt;p&gt;Setting up API access&lt;/p&gt;

&lt;p&gt;Last piece: a Service Account, created under Settings → Identity &amp;amp; Access → Service Accounts (not the account dropdown at the top, which is just your personal profile — took me a minute to find the right menu). Generating a key from its Keys tab gave me the credential both the MCP server and SigNoz's regular query API use for programmatic access.&lt;/p&gt;

&lt;p&gt;What I'd tell someone else trying this&lt;/p&gt;

&lt;p&gt;If you're on Windows, check Docker Desktop's WSL integration toggle is on for your specific distro, not just enabled generally — this cost me the most confusion for the least actual problem.&lt;br&gt;
The MCP flag costs nothing to enable up front, even if you're not sure yet whether you'll use it.&lt;br&gt;
Foundry's pitch — one config file, one command, reproducible via casting.yaml.lock — held up under a genuinely awkward hardware combination (Windows, ARM64, WSL2). Total time from zero to a fully healthy stack, WSL hiccup included: under an hour.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;Self-hosting SigNoz via Foundry on Windows ARM64 works, and works cleanly, once you know where the one Windows-specific gotcha is hiding. Next up: instrumenting real services with OpenTelemetry and building the actual incident-response agent this was all in service of.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>devchallenge</category>
      <category>mcp</category>
      <category>monitoring</category>
    </item>
  </channel>
</rss>
