DEV Community

RobustTrueTry
RobustTrueTry

Posted on

Automate Code Review with GLM‑5.3 in Your CI/CD Pipeline

You spend hours reviewing code changes. A model that can spot bugs, enforce style, and flag security issues could cut that time in half. GLM‑5.3 can do that, but you need a solid workflow to make it reliable.

What you’ll learn

  • How to set up GLM‑5.3 in a CI/CD environment.
  • How to write a lightweight Python wrapper for the API.
  • How to build a GitHub Actions workflow that runs automatically on pull requests.

Set Up Your GLM‑5.3 Environment

Create an account on the provider’s portal and copy your API key. Store the key in a secure place; on GitHub you’ll add it as a repository secret named GLM_API_KEY. The key is the only credential the script needs.

Build a Python Wrapper

The wrapper keeps the API call logic in one place and makes it easy to reuse.


## call_glm.py – a minimal wrapper around the GLM‑5.3 endpoint

import os
import json
import requests

API_URL = "https://api.z.ai/v1/chat"
API_KEY = os.getenv("GLM_API_KEY")

if not API_KEY:
    raise RuntimeError("GLM_API_KEY not set")

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}

def review_code(code: str, context: str = "") -> str:
    """Send a code snippet and optional context to GLM‑5.3 and return the review."""
    payload = {
        "model": "glm-5.3",
        "messages": [
            {"role": "system", "content": "You are a senior code reviewer."},
            {"role": "user", "content": f"Context: {context}\nCode:\n{code}"},
        ],
        "max_tokens": 512,
    }
    response = requests.post(API_URL, headers=headers, json=payload)
    response.raise_for_status()
    return response.json()["choices"][0]["message"]["content"]
Enter fullscreen mode Exit fullscreen mode

The script uses the standard requests library and keeps the prompt short. The max_tokens value is set to 512 so the model can return a concise review.

Create a GitHub Actions Workflow

The workflow runs on every pull request and fails the build if the model flags an issue.


## .github/workflows/code_review.yml – run GLM‑5.3 on PRs

name: Code Review with GLM‑5.3
on:
  pull_request:
    branches: [main]
jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: 3.11
      - name: Install dependencies
        run: pip install requests
      - name: Run GLM review
        env:
          GLM_API_KEY: ${{ secrets.GLM_API_KEY }}
        run: |
          python - <<'PY'
          import os, json, pathlib
          from call_glm import review_code

          # Gather all changed files
          changed = os.getenv('GITHUB_EVENT_PATH')
          with open(changed) as f:
              event = json.load(f)
          files = [x['filename'] for x in event['pull_request']['changed_files']]

          issues = []
          for file in files:
              if file.endswith('.py'):
                  code = pathlib.Path(file).read_text()
                  review = review_code(code)
                  if "issue" in review.lower():
                      issues.append((file, review))

          if issues:
              print("GLM flagged issues:")
              for f, r in issues:
                  print(f"{f}: {r}")
              raise SystemExit(1)
          else:
              print("No issues found by GLM.")
          PY
Enter fullscreen mode Exit fullscreen mode

The script reads the pull request event, pulls the changed Python files, and sends each to the wrapper. If the model returns a string containing the word "issue", the job fails.

Prompt Engineering for Code Review

A good prompt reduces hallucinations. Keep the system message short and ask the model to list problems, not to rewrite code. Example:

You are a senior code reviewer. List any bugs, style violations, or security concerns in the following code. Do not suggest fixes.
Enter fullscreen mode Exit fullscreen mode

Adding a brief context line (e.g., the repository name or a short description) helps the model understand the domain.

Handling Token Limits and Long Contexts

Large files exceed the model’s token limit. Split the file into 200‑line chunks and review each separately. If you need a global view, generate a concise summary of the file first and feed that to the model.

Tradeoffs and Failure Modes

Approach Strength Weakness When to Use
GLM‑5.3 Fast, good for Python, low cost Can hallucinate, limited context Quick PR checks, low‑risk projects
GPT‑4 Strong reasoning, broader language support Higher cost, slower Complex multi‑language repos
Static linters Deterministic, fast Misses logical bugs Baseline safety checks

GLM‑5.3 is cheaper than GPT‑4, but it may miss subtle bugs or misinterpret context. It also requires careful prompt design to avoid false positives.

What to Do When the Model Misses

If the model flags nothing but you suspect a problem, run a static analysis tool like ruff or bandit in parallel. If the model flags something that is a false positive, add a rule to the prompt to ignore that pattern.

Key Takeaways

  • Store the GLM‑5.3 API key as a GitHub secret.
  • Use a lightweight Python wrapper to keep API logic isolated.
  • Run the review in a GitHub Actions job that fails on flagged issues.
  • Craft a concise prompt that asks for problems, not fixes.
  • Combine the model with static linters for best coverage.

Source

GLM‑5.3: Frontier coding with emergent cyber capabilities – I added a step‑by‑step CI/CD integration, code examples, and a trade‑off table not covered in the original.

Top comments (0)