This document provides a step-by-step guide for setting up Continuous Integration and Continuous Deployment (CI/CD) for the sourcegraph/zoekt project. As of now, it appears that a complete CI/CD pipeline is not yet set up. Below are recommended next steps to implement CI/CD for this project.

CI/CD Overview

Currently, there are no defined configurations for CI/CD in the sourcegraph/zoekt repository. Implementing a CI/CD pipeline can improve the development process by automating builds, tests, and deployments.

Recommended Next Steps

  1. Choose a CI/CD Service: Select a CI/CD service based on the team’s requirements. Popular choices include GitHub Actions, Jenkins, GitLab CI, and Travis CI.

  2. Set Up Repository Configuration: Create a configuration file specific to the selected CI/CD service. Below are examples for GitHub Actions and GitLab CI.

GitHub Actions

Create a file named .github/workflows/ci.yml at the root of the repository. Below is a sample configuration:

name: CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      
      - name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: '1.22.2'
      
      - name: Cache Go modules
        uses: actions/cache@v2
        with:
          path: ~/.cache/go-build
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.mod') }}
          restore-keys: |
            ${{ runner.os }}-go-
      
      - name: Install dependencies
        run: go mod download
      
      - name: Build the project
        run: |
          VERSION=latest go install -ldflags "-X github.com/sourcegraph/zoekt.Version=latest" ./cmd/...

      - name: Run tests
        run: go test ./...

GitLab CI

For GitLab CI, create a file named .gitlab-ci.yml at the root of the repository:

stages:
  - build
  - test

build:
  stage: build
  image: golang:1.22.2-alpine3.19
  script:
    - apk add --no-cache ca-certificates
    - mkdir -p /go/src/github.com/sourcegraph/zoekt
    - cp -r . /go/src/github.com/sourcegraph/zoekt
    - cd /go/src/github.com/sourcegraph/zoekt
    - go mod download
    - VERSION=latest go install -ldflags "-X github.com/sourcegraph/zoekt.Version=latest" ./cmd/...

test:
  stage: test
  image: golang:1.22.2-alpine3.19
  script:
    - apk add --no-cache ca-certificates
    - mkdir -p /go/src/github.com/sourcegraph/zoekt
    - cp -r . /go/src/github.com/sourcegraph/zoekt
    - cd /go/src/github.com/sourcegraph/zoekt
    - go mod download
    - go test ./...
  1. Add a Docker Build Process: Since the project relies on a Dockerfile, integrating a Docker build step into the CI/CD process is essential. Below is an example of how to incorporate Docker build steps in both GitHub Actions and GitLab CI:

Docker Build Step for GitHub Actions

      - name: Build Docker image
        run: |
          docker build -t sourcegraph/zoekt:latest .

Docker Build Step for GitLab CI

build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t sourcegraph/zoekt:latest .
  1. Implement Testing: Define tests in Go and ensure they are run in the CI process. This is critical to maintain code quality and ensure new changes do not introduce bugs.

  2. Deployment Configuration: Depending on your infrastructure, define deployment strategies. For instance, you may want to deploy to a Docker registry or another service. You can add a deployment step in your CI configuration to handle this.

Conclusion

Implementing CI/CD for the sourcegraph/zoekt project involves setting up a CI/CD service, defining a configuration file, and ensuring that builds, tests, and Docker images are properly handled. By following the steps outlined, the project can gain significant improvements in automation and quality control.

Sources:

  • Dockerfile content provided in the project from Docker implementation.