assay.gitlab
GitLab REST API v4 client. Projects, repositories, commits, merge requests, pipelines, jobs, issues, releases, groups, container registry, webhooks, environments, and deploy tokens.
Supports both private access token (PRIVATE-TOKEN header) and OAuth2 bearer authentication.
local gitlab = require("assay.gitlab")
local c = gitlab.client("https://gitlab.example.com", { token = "glpat-xxxx" })
c.projects
c.projects:list(opts?)->[project]— List projects. Options:search,order_by,sort,per_page,pagec.projects:get(id)->project|nil— Get project by numeric ID or"namespace/name"path
c.files
c.files:get(project, path, opts?)->table|nil— Get file metadata (base64-encoded content). Options:ref(default:"main")c.files:raw(project, path, opts?)->string|nil— Get raw file content as string. Options:ref(default:"main")c.files:create(project, path, opts)->table— Create file. Options:branch,content,commit_messagec.files:update(project, path, opts)->table— Update file. Options:branch,content,commit_messagec.files:delete(project, path, opts)->nil— Delete file. Options:branch,commit_message
c.repository
c.repository:tree(project, opts?)->[entry]— List repository tree. Options:path,ref,recursive,per_pagec.repository:compare(project, from, to)->{commits, diffs}— Compare branches, tags, or commits
c.commits
c.commits:list(project, opts?)->[commit]— List commits. Options:ref_name,since,until,path,per_pagec.commits:get(project, sha)->commit|nil— Get single commit by SHAc.commits:create(project, opts)->commit— Atomic multi-file commit. Options:branch,commit_message,actions(array of{action, file_path, content})c.commits:cherry_pick(project, sha, opts)->commit— Cherry-pick commit. Options:branch
c.branches
c.branches:list(project, opts?)->[branch]— List branches. Options:search,per_pagec.branches:get(project, name)->branch|nil— Get branch by namec.branches:create(project, opts)->branch— Create branch. Options:branch,refc.branches:delete(project, name)->nil— Delete branch
c.tags
c.tags:list(project, opts?)->[tag]— List tags. Options:search,order_by,sortc.tags:get(project, name)->tag|nil— Get tag by namec.tags:create(project, opts)->tag— Create tag. Options:tag_name,ref,messagec.tags:delete(project, name)->nil— Delete tag
c.merge_requests
c.merge_requests:list(project, opts?)->[mr]— List MRs. Options:state,order_by,sort,labels,per_pagec.merge_requests:get(project, iid)->mr|nil— Get MR by IIDc.merge_requests:create(project, opts)->mr— Create MR. Options:source_branch,target_branch,title,descriptionc.merge_requests:update(project, iid, opts)->mr— Update MR. Options:title,description,state_event,labelsc.merge_requests:merge(project, iid, opts?)->mr— Accept (merge) MR. Options:squash,merge_commit_message,should_remove_source_branchc.merge_requests:approve(project, iid)->table— Approve MRc.merge_requests:changes(project, iid)->mr— Get MR with diff changesc.merge_requests:notes(project, iid, opts?)->[note]— List MR commentsc.merge_requests:create_note(project, iid, body)->note— Add comment to MR
c.pipelines
c.pipelines:list(project, opts?)->[pipeline]— List pipelines. Options:ref,status,per_pagec.pipelines:get(project, id)->pipeline|nil— Get pipeline by IDc.pipelines:create(project, opts)->pipeline— Trigger pipeline. Options:ref,variablesc.pipelines:cancel(project, id)->pipeline— Cancel running pipelinec.pipelines:retry(project, id)->pipeline— Retry failed pipelinec.pipelines:delete(project, id)->nil— Delete pipelinec.pipelines:jobs(project, pipeline_id, opts?)->[job]— List jobs for a pipeline
c.jobs
c.jobs:list(project, opts?)->[job]— List all project jobs. Options:scope(array of statuses)c.jobs:get(project, id)->job|nil— Get job by IDc.jobs:retry(project, id)->job— Retry a jobc.jobs:cancel(project, id)->job— Cancel a jobc.jobs:log(project, id)->string|nil— Get job trace/log output as raw text
c.releases
c.releases:list(project, opts?)->[release]— List releases. Options:per_pagec.releases:get(project, tag_name)->release|nil— Get release by tag namec.releases:create(project, opts)->release— Create release. Options:tag_name,name,descriptionc.releases:update(project, tag_name, opts)->release— Update releasec.releases:delete(project, tag_name)->nil— Delete release
c.issues
c.issues:list(project, opts?)->[issue]— List issues. Passnilas project for global issues. Options:state,labels,search,per_pagec.issues:get(project, iid)->issue|nil— Get issue by IIDc.issues:create(project, opts)->issue— Create issue. Options:title,description,labels,assignee_idsc.issues:update(project, iid, opts)->issue— Update issue. Options:title,description,state_event,labelsc.issues:notes(project, iid, opts?)->[note]— List issue commentsc.issues:create_note(project, iid, body)->note— Add comment to issue
c.groups
c.groups:list(opts?)->[group]— List groups. Options:search,per_pagec.groups:get(id)->group|nil— Get group by numeric ID or"path"namec.groups:projects(id, opts?)->[project]— List projects in a group
c.registry
c.registry:repositories(project)->[repo]— List container registry repositoriesc.registry:tags(project, repo_id)->[tag]— List tags for a registry repositoryc.registry:tag(project, repo_id, tag_name)->tag|nil— Get single registry tag (with digest, size)c.registry:delete_tag(project, repo_id, tag_name)->nil— Delete a registry tag
c.hooks
c.hooks:list(project)->[hook]— List project hooksc.hooks:get(project, id)->hook|nil— Get hook by IDc.hooks:create(project, opts)->hook— Create hook. Options:url,push_events,merge_requests_events, etc.c.hooks:update(project, id, opts)->hook— Update hookc.hooks:delete(project, id)->nil— Delete hook
c.users
c.users:current()->user— Get authenticated userc.users:list(opts?)->[user]— Search users. Options:username,search,per_page
c.environments
c.environments:list(project, opts?)->[env]— List environments. Options:searchc.environments:get(project, id)->env|nil— Get environment by ID
c.deploy_tokens
c.deploy_tokens:list(project)->[token]— List deploy tokensc.deploy_tokens:create(project, opts)->token— Create token. Options:name,scopes,expires_atc.deploy_tokens:delete(project, id)->nil— Delete token
Example: Atomic Multi-File Commit
local gitlab = require("assay.gitlab")
local c = gitlab.client("https://gitlab.example.com", { token = env.get("GITLAB_TOKEN") })
local result = c.commits:create(42, {
branch = "main",
commit_message = "Update config for v2.0",
actions = {
{ action = "update", file_path = "config/app.yaml", content = "version: 2.0\n" },
{ action = "update", file_path = "config/db.yaml", content = "pool_size: 20\n" },
},
})
log.info("Committed: " .. result.short_id)
Example: Create and Merge an MR
local gitlab = require("assay.gitlab")
local c = gitlab.client("https://gitlab.example.com", { token = env.get("GITLAB_TOKEN") })
-- Create branch
c.branches:create(42, { branch = "feat/update", ref = "main" })
-- Commit changes
c.commits:create(42, {
branch = "feat/update",
commit_message = "Update dependencies",
actions = {
{ action = "update", file_path = "package.json", content = '{"version": "2.0.0"}' },
},
})
-- Open MR
local mr = c.merge_requests:create(42, {
source_branch = "feat/update",
target_branch = "main",
title = "Update dependencies to v2.0",
})
-- Approve and merge
c.merge_requests:approve(42, mr.iid)
c.merge_requests:merge(42, mr.iid, { squash = true, should_remove_source_branch = true })