docs.gitlab.com Open in urlscan Pro
2600:1901:0:7b8a::  Public Scan

URL: https://docs.gitlab.com/runner/install/windows.html
Submission: On August 30 via manual from US — Scanned from US

Form analysis 1 forms found in the DOM

<form class="gl-relative" __bizdiag="0" __biza="WJ__">
  <div class="gl-search-box-by-type"><svg data-testid="search-icon" role="img" aria-hidden="true" class="gl-search-box-by-type-search-icon gl-icon s16 gl-fill-current">
      <use href="/assets/images/icons.svg#search"></use>
    </svg> <input type="search" placeholder="Search GitLab documentation" autocomplete="off" class="gl-form-input form-control gl-search-box-by-type-input-borderless" aria-label="Search" id="__BVID__19"> <!----></div><kbd
    title="Use the shortcut keys<br><kbd>/</kbd> or <kbd>s</kbd> to start a search" class="gl-absolute gl-z-index-1 gl-bg-gray-100 gl-text-gray-700">/</kbd>
</form>

Text Content

Docs
 * 
   /

 * What's new?

v17.4

17.4 (not yet released)

--------------------------------------------------------------------------------

17.3 (recently released)

17.2

17.1

--------------------------------------------------------------------------------

16.11

15.11

--------------------------------------------------------------------------------

Archives

 * Get free trial


Tutorials

Find your way around GitLab

Tutorial: Use the left sidebar to navigate GitLab

Learn Git

Plan and track your work

Build your application

Secure your application

Manage your infrastructure

Extend with GitLab

Find more tutorials

Subscribe

Choose a subscription

GitLab.com

Free user limit

Free push limit

Read-only namespaces

Storage

GitLab self-managed

Activate Enterprise Edition

GitLab Dedicated

Subscription add-ons

Community programs

Customers Portal

Quarterly reconciliation

Compute quota

Features available to Starter and Bronze subscribers

Install

Requirements

PostgreSQL extensions

Installation methods

Linux package (Omnibus)

Architecture

Omnibus packages and images

Package information

Package defaults

Package licensing

Package signatures

PostgreSQL versions

Installation

Deprecation policy

Supported OSes

Install JiHu Edition

Configure

Action Cable

Backups

Configuration options

Custom environment variables

Database

GitLab Mattermost

High availability roles

Logs

Microsoft Graph Mailer

NGINX

Troubleshooting

Gitaly Cluster

Prometheus

Puma

Raspberry Pi

Redis

SMTP

Rake tasks

SSL

Troubleshooting

DNS

Image scaling

Memory-constrained environments

Release process

Maintain

Troubleshooting

Helm chart (Kubernetes)

Install

Verify CNG images

Test the GitLab chart on GKE or EKS

Install prerequisites

Chart versions

Provenance

Secrets

RBAC

Storage

TLS

Set up cloud resources

Azure Kubernetes Service

Amazon EKS

Google Kubernetes Engine

OpenShift Origin

Oracle Container Engine for Kubernetes

Deploy the Helm chart

Deployment options

Configure

Globals

certmanager-issuer chart

GitLab subcharts

Gitaly chart

GitLab Exporter chart

GitLab Pages chart

GitLab Runner chart

GitLab Shell chart

KAS chart

Mailroom chart

Migrations chart

Praefect chart

Sidekiq chart

Spamcheck chart

Toolbox chart

Webservice chart

HAProxy chart

Minio chart

NGINX chart

NGINX chart fork

Registry chart

Metadata database

Traefik chart

Zoekt chart

shared-secrets job

Advanced

Custom Docker images

External database

Set up external PostgreSQL database
External Gitaly

Set up external Gitaly
External GitLab Pages

External Mattermost

External Nginx

External object storage

Configure MinIO Configure Workload Identity Federation Configure Azure MinIO
gateway Configure IAM roles for AWS
External Redis

Set up external Redis
FIPS-compliant images

Geo

Internal TLS between services

Multiple databases

Persistent volumes

Red Hat UBI-based images

Upgrade

Database upgrade

Release notes 8.0

Release notes 7.0

Release notes 6.0

Backup and Restore

Backup

Restore

Migration guides

Migrate from the Linux package

Migrate to the Linux package

Migrate between Helm versions

Migrate to MinIO

Uninstall

Troubleshooting

Operator (Kubernetes)

Install

Backup and restore

Upgrade GitLab

Support for Git over SSH

Upgrade the Operator

Ingress in OpenShift

OpenShift support

RedHat-certified images

Security context constraints

Troubleshooting

Docker

Installation

Configuration

Backup and restore

Upgrade

Troubleshooting

Self-compiled (source)

Install under a relative URL

Cloud providers

Azure

Google Cloud Platform (GCP)

Amazon Web Services (AWS)

Offline GitLab

Offline GitLab installation

Reference architectures

Up to 20 RPS or 1,000 users

Tutorial: Install and secure a single node GitLab instance

Up to 40 RPS or 2,000 users

Up to 60 RPS or 3,000 users

Up to 100 RPS or 5,000 users

Up to 200 RPS or 10,000 users

Up to 500 RPS or 25,000 users

Up to 1,000 RPS or 50,000 users

Steps after installing

Upgrade GitLab

Plan an upgrade

Background migrations

Troubleshooting

Upgrade a Linux package instance

Convert to Linux package (Omnibus)

Convert to Enterprise Edition

Package signatures

Downgrade

Troubleshooting

Upgrade a self-compiled instance

Patch versions

Change from Community Edition to Enterprise Edition

GitLab 17 changes

GitLab 16 changes

GitLab 15 changes

GitLab 14 changes

Zero-downtime upgrades for multi-node instances

Upgrades with downtime for multi-node instances

Change from Enterprise Edition to Community Edition

Releases and maintenance

Deprecations by version

Terminology

What's new

Install GitLab Runner

Linux

Linux manual install

FreeBSD

macOS

Windows

Docker

Helm chart

GitLab agent

Operator

Bleeding edge releases

Support policy

Configure GitLab Runner

Advanced configuration

Autoscale configuration

Docker Machine Executor autoscale

Autoscale on AWS EC2

Autoscale on AWS Fargate

Commands

Feature flags

macOS setup

Runner Operator on OpenShift

Running behind a proxy

Rate limited requests

Graphical processing units

Self-signed certificates

System services

Speed up job execution

Tutorial: Configure GitLab Runner to use the Google Kubernetes Engine

Troubleshooting

Administer

Getting started

All feature flags

Enable features behind feature flags

Authentication and authorization

ClickHouse

LDAP

LDAP synchronization

LDAP (Google Secure)

Rake tasks

Troubleshooting

OAuth service provider

OmniAuth

AliCloud

Atlassian

Atlassian Crowd (deprecated)

Auth0

AWS Cognito

Azure

Bitbucket Cloud

Generic OAuth2

GitHub

GitLab.com

Google

JWT

Kerberos

Troubleshooting

OpenID Connect OmniAuth

Salesforce

SAML

Configure SCIM

Shibboleth

OpenID Connect identity

Smartcard

Test OIDC/OAuth in GitLab

Vault

Configure your installation

Admin Area

Application cache interval

Compliance

Audit events administration

Audit event streaming for instances

CI/CD

Secure files

External pipeline validation

ClickHouse for analytics

Consul

Cron

Custom HTML header tags

Environment variables

File hooks

Geo sites

Git LFS administration

Git protocol v2

Health Check

Incoming email

Rake tasks

Instance limits

Instance review

Log system

Parse logs with jq

Trace logs based on correlation ID

Merge request approvals

PostgreSQL

Database load balancing

External database service

Monitor external databases

Move instances

Multiple databases

PgBouncer

Replication and failover

Troubleshooting

Standalone packaged database

Upgrade external database

Upgrading operating systems for PostgreSQL

Labels

Load balancer

NFS

Postfix

Redis

Configure the bundled Redis for replication

Configure your own Redis for replication

Standalone Redis configuration

Troubleshooting

Reply by email

Sidekiq

Multiple Sidekiq processes

Processing specific job classes

Sidekiq MemoryKiller

Sidekiq health check

Sidekiq job migration

Sidekiq job size limits

Troubleshooting

S/MIME signing

Repository storage

Gitaly and Geo capabilities

Gitaly and Gitaly Cluster

Configure Gitaly

Concurrency limiting

Timeouts

TLS support

Repository consistency checks

Configure Gitaly Cluster

Gitaly on Kubernetes

Bundle URIs

Example configuration files

Monitoring

Recovery options

Troubleshooting Gitaly

Troubleshooting Gitaly Cluster

Praefect Rake tasks

Object storage

Merge request diffs storage

Static objects external storage

Geo

Setting up Geo

Set up Geo for multiple nodes

Database replication

External PostgreSQL instances

Set up Geo for two single-node sites

Set up Geo for two single-node sites (with external PostgreSQL services)

Configuration

Using a Geo site

Secondary proxying

Secondary runners

Selective synchronization

Upgrading Geo sites

Using object storage

Container registry for a secondary site

Geo security review

Location-aware Git remote URLs

Single Sign On (SSO)

Tuning Geo

Rake tasks

Disable Geo

Removing a Geo site

Supported data types

Frequently asked questions

Troubleshooting

Common errors

Client and HTTP response code errors

Replication errors

Synchronization errors

Validation tests

Geo Glossary

Disaster recovery (Geo)

Planned failover

Bring primary back

Automatic background verification

Troubleshooting

Agent server for Kubernetes

Server hooks

Terraform state

Terraform limits

Timezone

Uploads

Uploads migration Rake tasks

Uploads sanitization Rake tasks

Packages

Container registry

Container registry metadata database

Dependency Proxy

Web terminals

Wikis

Invalidate Markdown cache

Issue closing pattern

Snippets

Host the product documentation

Update your settings

Account and limit settings

Appearance

CI/CD

Custom instance-level project templates

Diff limits

Email

External authorization

Federated Learning of Cohorts (FLoC)

GitLab for Jira Cloud app

Troubleshooting

GitLab for Slack app

GitLab Pages

GitLab Pages for source installations

Troubleshooting

Import and export settings

Instance template repository

IP address restrictions

Job artifacts

Troubleshooting

Job logs

Localization

Maintenance Mode

Polling interval multiplier

Project integrations

Protected paths

Public security contact information

Push event activities limit

Repository checks

Security and Compliance

Sign-in and help page text

Sign-in restrictions

Sign-up restrictions

Spamcheck

System Hooks

Terms of service and privacy policy

Third-party offers

Visibility and access controls

Maintain your installation

Housekeeping

Clean up with Rake tasks

Maintenance Rake tasks

Integrity check Rake task

Access token Rake tasks

Activate GitLab EE with license

Import and export large projects

Troubleshooting

Fast SSH key lookup

Filesystem benchmarking

gitlab-sshd

Rails console

Use SSH certificates

Enable encrypted configuration

Rake tasks

Backup and restore

Back up GitLab

Backup archive process

Back up and restore large reference architectures

Troubleshooting

Restore GitLab

Migrate to a new server

Inactive project deletion

Move repositories

Silent mode

Read-only state

Restart GitLab

Troubleshooting

Apps for a testing environment

Diagnostics tools

GitLab Rails console cheat sheet

Linux cheat sheet

PostgreSQL

Monitor your installation

Performance monitoring

Prometheus

Configure Grafana

Performance bar

GitHub imports

GitLab exporter

GitLab Prometheus metrics

IP allowlist endpoints

Node exporter

PGBouncer exporter

PostgreSQL server exporter

Redis exporter

Registry exporter

Usage statistics

Web exporter

Secure your installation

Limits on SSH keys

Rate limits

Deprecated API

Git HTTP

Git LFS

Git SSH operations

Git abuse

Import and export

Incident management

Issue creation

Note creation

Package registry

Pipeline creation

Projects API

Raw endpoints

Repository files API

User and IP

Groups API

Members API

Users API

Filtering outbound requests

Information exclusivity

Manage the CRIME vulnerability

Enforce two-factor authentication (2FA)

Identity verification

Account email verification

Make new users confirm email

Runners

Proxying assets

Token overview

Troubleshooting

Rotate secrets of third-party integrations

Respond to security incidents

Hardening

General concepts

Application recommendations

CI/CD recommendations

Configuration recommendations

Operating system recommendations

NIST 800-53 compliance

Administer users

Reset user password

Unlock a user

Review abuse reports

Review spam logs

User file uploads

Password storage

Credentials inventory

Custom password length limits

Generated passwords and integrated authentication

Global user settings

Moderate users

Auditor users

External users

Guest users

Internal users

Configure the Libravatar service

Broadcast messages

Email from GitLab

User cohorts

Rake tasks

GitLab Dedicated

Create your GitLab Dedicated instance

Configure your GitLab Dedicated instance

Hosted runners for GitLab Dedicated

Self-hosted large language model

Configure your GitLab Duo features

Troubleshooting your self-managed GitLab Duo setup

Set up your self-hosted model deployment infrastructure

Set up a self-hosted large language model with LiteLLM

Use GitLab

Manage your organization

Tutorial: Set up your organization

Namespaces

Members

Organization

Groups

Manage groups

Group access and permissions

Manage group SSH certificates

Moderate users

Custom group-level project templates

Group access tokens

SAML Group Sync

SAML SSO for GitLab.com groups

Configure SCIM

Troubleshooting

Example group SAML and SCIM configurations

Troubleshooting

Subgroups

Tutorial: Move a personal project to a group

Tutorial: Convert a personal namespace into a group

Git abuse rate limit

Troubleshooting

Sharing projects and groups

Compliance

Audit events

Audit event types

Audit event schema

Audit event streaming for top-level groups

Compliance frameworks

Compliance pipelines

Tutorial: Create a compliance pipeline

Compliance center

Compliance standards adherence dashboard

Compliance violations report

Chain of custody report

Compliance frameworks report

Compliance projects report

License scanning of CycloneDX files

License approval policies

SPDX license list import

Enterprise users

Service accounts

User account options

Active sessions

Comment templates

Contributions calendar

Achievements

Permissions and roles

Custom roles

Available custom permissions

Personal access tokens

Profile preferences

Notification emails

User passwords

Two-factor authentication

Troubleshooting

Report abuse

Delete account

SSH keys

Troubleshooting

GitLab.com settings

Organize work with projects

Getting started

Create a project

Manage projects

Project visibility

Project settings

Description templates

Project access tokens

Deploy keys

Deploy tokens

Share projects

Reserved project and group names

Search

Advanced search

Exact code search

Command palette

Badges

Project topics

Code intelligence

Import and migrate

Bitbucket Cloud

Bitbucket Server

ClearCase

CVS

FogBugz

Gitea

GitHub

GitHub import Rake task

Troubleshooting

GitLab (direct transfer)

Migrate groups and projects

Migrated items

Troubleshooting

GitLab (file export)

Troubleshooting

Jira

Jira migration options

Perforce Helix

Repo by manifest file

Repo by URL

TFVC

System notes

Transfer a project to another namespace

Use a project as a Go package

Tutorial: Build a protected workflow for your project

Troubleshooting

Plan and track work

Getting started

Tutorial: Use GitLab for Scrum

Stand-ups, retrospectives, and velocity

Tutorial: Use GitLab for Kanban

Labels

Iterations

Tutorial: Use GitLab to run an Agile iteration

Milestones

Burndown and burnup charts

Issues

Create issues

Manage issues

Confidential issues

Crosslinking issues

CSV export

CSV import

Design management

Due dates

Emoji reactions

Tutorial: Set up a project for issue triage

Tutorial: Set up a project for idea management

Multiple assignees

Linked issues

Service Desk

Configure Service Desk

Use Service Desk

External participants

Rake tasks

Sorting and ordering issue lists

Weight

Zoom meetings in issues

Issue boards

Tutorial: Set up issue boards for team hand-off

Comments and threads

Tasks

Requirements

Time tracking

Customer relations (CRM)

Wikis

Group wikis

Epics

Manage epics

Linked epics

Epic boards

Test a new look for epics

Roadmaps

Planning hierarchies

Objectives and key results (OKR)

Keyboard shortcuts

Quick actions

Autocomplete characters

Markdown

AsciiDoc

Rich text editor

To-Do List

Learn Git

Getting started

Install Git

Tutorial: Create your first commit

Clone a repository to your local machine

Create a branch for your changes

Add files to your branch

Stash changes for later

Stage, commit, and push changes

Tutorial: Update Git commit messages

Undo changes

Rebase to address merge conflicts

Common Git commands

Tutorial: Update Git remote URLs

Troubleshooting

Manage your code

Getting started

Repositories

Code owners

Syntax and errors

Troubleshooting

Branches

Default branch

Protected branches

File management

CSV files

Explain code

File Blame

File History

GeoJSON files

Git attributes

Jupyter notebook files

Syntax highlighting

Forks

Mirroring

Bidirectional mirroring

Pull mirroring

Push mirroring

Troubleshooting

Managing monorepos

Observability

Troubleshooting

Git LFS

Troubleshooting

Reduce repository size

Tags

Protected tags

Changelogs

Snippets

Locked files

Machine learning model experiments

Model registry

Push rules

Signed commits

Sign commits with GPG

Sign commits with SSH keys

Sign commits and tags with X.509

Signed commits from the GitLab UI

X.509 signatures Rake task

Web Editor

Merge requests

Commits

Commit message templates

Changes

Create merge requests

Draft merge requests

Confidential merge requests

Merge request dependencies

Reviewing and managing merge requests

Merge request widgets

External status checks

Suggestions

GitLab Duo in merge requests

Suggested Reviewers data usage

Approvals

Approval rules

Approval settings

Versions

Manage merge requests

Tutorial: Review a merge request

Workflows

Merge methods

Squash and merge

Auto-merge

Collaborate across forks

Merge conflicts

Cherry pick changes

Reverting changes

Stacked diffs

Export merge requests to CSV

Troubleshooting

Remote development

Web IDE

Workspaces

Workspace configuration

GitLab agent configuration

Tutorial: Set up the GitLab agent

Tutorial: Set up the GitLab workspaces proxy

Tutorial: Create a custom workspace image that supports arbitrary user IDs

Use CI/CD to build your application

Getting started

Tutorial: Your first pipeline

Tutorial: A complex pipeline

Plan a migration to GitLab CI/CD

Migrate from Bamboo

Migrate from CircleCI

Migrate from GitHub actions

Migrate from Jenkins

Migrate a Maven build from Jenkins

Migrate from TeamCity

CI/CD examples

Deployment with Dpl

End-to-end testing

NPM with semantic-release

PHP with PHPunit and atoum

PHP with NPM and SCP

PHP with Laravel and Envoy

CI/CD YAML syntax reference

Optimize your YAML files

Validate syntax

Debug pipelines

Pipeline editor

Artifacts reports

Include examples

Inputs

Workflow examples

Log timestamps

Steps

Tutorial: Set up CI/CD steps

Runners

Tutorial: Create, register, and run your own project runner

Tutorial: Automate runner creation and registration

GitLab-hosted runners

Linux

GPU

macOS

Windows

Manage runners

Register a runner

Migrate to the new runner registration workflow

Runner executors

Custom

libvirt

LXD

Docker

Docker Machine

Docker Autoscaler

Instance

Kubernetes

Troubleshooting

Shell

Supported shells

SSH

Parallels

VirtualBox

Configure runners

Monitor runner performance

Long polling

Scale a fleet of runners

Fleeting library

Runner fleet dashboard

Runner fleet dashboard for groups

Pipelines

Types of pipelines

Merge request pipelines

Troubleshooting

Merged results pipelines

Merge trains

Scheduled pipelines

Trigger a pipeline

Customize pipeline configuration

Pipeline architectures

Pipeline efficiency

Pipeline resource groups

Directed acyclic graph (DAG)

Downstream pipelines

Troubleshooting

Jobs

Control how jobs run

Specify when jobs run with rules

Troubleshooting

Access a terminal for a running job

Format scripts and job logs

Git submodules

Cache and artifacts

Job artifacts

Troubleshooting

Docker

Run CI/CD jobs in Docker containers

Use Docker to build Docker images

Authenticate with registry

Docker Layer Caching

Use kaniko to build Docker images

Tutorial: Use Buildah in a rootless container on OpenShift

CI/CD components

CI/CD component examples

Variables

Predefined CI/CD variables

Where variables can be used

Pipeline security

CI/CD job token

External secrets

ID token authentication

Secure Files

Use Azure Key Vault secrets in GitLab CI/CD

Use GCP Secret Manager secrets in GitLab CI/CD

Tutorial: Use Fortanix Data Security Manager (DSM) with GitLab

Use Sigstore for keyless signing

Connect to cloud services

Configure OpenID Connect in AWS

Configure OpenID Connect in Azure

Configure OpenID Connect with Google Cloud

Authenticating with HashiCorp Vault

Tutorial: Update HashiCorp Vault configuration to use ID Tokens

Services

MySQL service

PostgreSQL service

Redis service

GitLab as a service

Auto DevOps

Requirements

Stages

Customize

CI/CD variables

Multiple Kubernetes clusters

Canary deployments

Upgrade PostgreSQL

Prepare for deployment

Upgrade Auto Deploy dependencies

Deploy to GKE

Deploy to EKS

Deploy to ECS

Deploy to EC2

Troubleshooting

Testing

Accessibility testing

Browser performance testing

Code coverage

Code quality

Troubleshooting

Fail fast testing

Load performance testing

Metrics reports

Test cases

Test coverage visualization

Cobertura Coverage Reports

JaCoCo Coverage Reports

Unit test reports

Unit test report examples

SSH keys

ChatOps

Mobile DevOps

Google Cloud integration

Google IAM

Google Artifact Management

Provisioning runners

Tutorial: Set up the Google Cloud integration

Tutorial: Create a GitLab pipeline to push to Google Artifact Registry

Tutorial: Create and deploy a web service with the Google Cloud Run component

External repository integrations

Bitbucket Cloud

GitHub

Secure your application

Getting started

Application security

Troubleshooting

Security Configuration

Container Scanning

Tutorial: Scan a Docker container for vulnerabilities

Dependency Scanning

Tutorial: Set up dependency scanning

Troubleshooting

Comparison: Dependency Scanning and Container Scanning

Dependency List

Tutorial: Export dependency list

Continuous Vulnerability Scanning

Static Application Security Testing

SAST rules

Customize rulesets

SAST analyzers

GitLab Advanced SAST analyzer

Troubleshooting

Infrastructure as Code (IaC) Scanning

Secret detection

Pipeline secret detection

Detected secrets

Automatic response to leaked secrets

Custom rulesets schema

Secret push protection

Detected secrets

Client-side secret detection

Detected secrets

Dynamic Application Security Testing (DAST)

DAST browser-based analyzer

Migrating from the DAST version 4 browser-based analyzer to DAST version 5

Migrating from the DAST proxy-based analyzer to DAST version 5

Configuration

Requirements

Enabling the analyzer

Customizing analyzer settings

Overriding analyzer jobs

Available CI/CD variables

Authentication

Offline configuration

Vulnerability checks

Troubleshooting

DAST proxy-based analyzer (deprecated)

Troubleshooting

DAST on-demand scan

Authentication

Troubleshooting

API security testing

Configuration

Requirements

Enabling the analyzer

Customizing analyzer settings

Overriding analyzer jobs

Available CI/CD variables

Offline configuration

Vulnerability checks

Performance

Troubleshooting

Run DAST offline

API Security

API Discovery

Web API Fuzz Testing

Configuration

Requirements

Enabling the analyzer

Customizing analyzer settings

Overriding analyzer jobs

Available CI/CD variables

Offline configuration

HTTP Archive format

Performance

Troubleshooting

Coverage-guided fuzz testing

Tutorial: Perform fuzz testing in GitLab

Security Dashboard

Offline environments

Vulnerability Report

View vulnerabilities in a pipeline

Vulnerability Page

Vulnerability severity levels

GitLab Advisory Database

CVE ID requests

Policies

Scan execution policies

Tutorial: Set up a scan execution policy

Merge request approval policies

Tutorial: Set up a merge request approval policy

Pipeline execution policy

Security scanner integration

Secure and Govern glossary

Deploy and release your application

Getting started

Packages & Registries

Package registry

Supported package managers

Supported functionality

Composer

Conan

Debian

Go Proxy

Helm

Maven

npm

NuGet

PyPI

Ruby gems

Yarn

Generic

Dependency proxy for packages

Store all packages in one project

Monorepo workflows

Reduce package registry storage

Build packages

Protected packages

Container registry

Authenticate

Build and push images

Delete images

Protected container repositories

Reduce container registry storage

Reduce container registry data transfers

Troubleshooting

Harbor registry

Terraform module registry

Dependency Proxy

Reduce Dependency Proxy storage

Environments and deployments

Deploy to AWS

Deploy to Amazon ECS

Deploy to Heroku

External deployment tools

Dashboard for Kubernetes

Environments Dashboard

Operations Dashboard

Review apps

Protected environments

Deployment safety

Deployment approvals

Configure Kubernetes deployments (deprecated)

Releases

Release CI/CD examples

Release CLI tool

Release fields

Release evidence

Roll out an application incrementally

Feature flags

GitLab Pages

Tutorial: Create website from scratch

Tutorial: Build, test, and deploy your Hugo site

Create website from CI/CD template

Create website from forked sample project

Create website from project template

Create deployment for static site

Public folder

Default domain names and URLs

Custom domains

DNS records

SSL/TLS certificates

Let's Encrypt certificates

Access control

Redirects

Settings

Manage your infrastructure

Getting started

Infrastructure as Code

Terraform state

Terraform integration in merge requests

GitLab Terraform helpers

Terraform template recipes

Troubleshooting

Create Kubernetes clusters

Amazon EKS

Azure AKS

Google GKE

Civo

Connect Kubernetes clusters

Use GitOps

Tutorial: Set up Flux for GitOps

Tutorial: Deploy a Git repository using Flux

Tutorial: Deploy an OCI artifact using Flux

Migrate to Flux

Use GitLab CI/CD

Manage cluster applications

Install cert-manager

Install Ingress

Install GitLab Runner

Install Vault

Install the agent for Kubernetes

Manage the agent for Kubernetes instances

Grant users Kubernetes access

Operational container scanning

Troubleshooting

Migrate to the agent for Kubernetes

Runbooks

Monitor your application

Getting started

Tutorial: Use GitLab Observability with a Ruby on Rails application

Tutorial: Use GitLab Observability with a NodeJS application

Tutorial: Use GitLab Observability with a Django application

Tutorial: Use GitLab Observability with a Java Spring application

Tutorial: Use GitLab Observability with a .NET application

Error tracking

Integrated error tracking

Sentry error tracking

Distributed tracing

Metrics

Logs

Incident management

Alerts

Integrations

Incidents

Manage incidents

Timeline events

Linked resources

Incident management for Slack

On-call schedules

Escalation policies

Paging and notifications

Status page

Analyze GitLab usage

Value streams dashboard

Value stream analytics

AI Impact analytics

DevOps adoption by instance

DevOps adoption by group

Instance-level analytics

Usage trends

Insights

Product analytics

Instrumentation

Browser SDK

Analytics dashboards

Issue analytics

Merge request analytics

Productivity analytics

Code review analytics

Contribution analytics

Contributor analytics

Repository analytics for projects

Repository analytics for groups

CI/CD analytics

DORA metrics

Tutorial: Set up an analytics-powered project

Tutorial: Set up product analytics in a GitLab Pages website project

Experiment, beta, and GA support

Find your GitLab version

GitLab Duo

Control GitLab Duo availability

GitLab Duo experiments

GitLab Duo use cases

GitLab Duo data usage

Code Suggestions

Supported extensions and languages

Troubleshooting

Repository X-Ray

GitLab Duo Chat

Ask Duo Chat

Control Duo Chat availability

Duo Chat best practices

Duo Chat troubleshooting

GitLab Duo Workflow

Extend

Getting started

Integrations

Project integrations

Akismet

Apple App Store Connect

Arkose Protect

Asana

Atlassian Bamboo

AWS CodePipeline

Beyond Identity

Datadog

Diagrams.net

Diffblue Cover

Discord Notifications

Elasticsearch

Troubleshooting

Emails on push

External issue trackers

Bugzilla

ClickUp

Custom issue tracker

Engineering Workflow Management (EWM)

Phorge

Redmine

YouTrack

GitGuardian

GitHub

GitLab for Slack app

Troubleshooting

Gitpod

Gmail actions

Google Chat

Google Play

Harbor

irker (IRC gateway)

Jenkins

Jira

Jira issue integration

Jira issue management

Tutorial: Create Jira credentials

Troubleshooting

Jira development panel

GitLab for Jira Cloud app

Jira DVCS connector

Troubleshooting

Kroki

Mailgun

Marketplace partners

Matrix notifications

Mattermost notifications

Mattermost slash commands

Microsoft Teams notifications

MLflow

Mock CI

Pipeline status emails

Pivotal Tracker

PlantUML

Pumble

reCAPTCHA

Slack notifications (deprecated)

Slack slash commands

Snowflake

Sourcegraph

Squash TM

Telegram

Trello Power-Ups

Unify Circuit

Webex Teams

Zoekt

Webhooks

Webhook events

Rake tasks

REST API

REST API resources

.gitignore (templates)

.gitlab-ci.yml (templates)

Access requests

Agent for Kubernetes

Alert Management

Appearance (application)

Applications

Audit events

Avatar

Badges (project)

Badges (group)

Branches

Broadcast messages

Code Suggestions

Commits

Composer

Conan

Container registry

Container registry protection rules

Custom attributes

Database migrations

Debian

Debian group distributions

Debian project distributions

Dependencies

Dependency list export

Dependency Proxy

Deploy keys

Deploy tokens

Deployments

Discussions

Dockerfile (templates)

DORA4 metrics

Emoji reactions

Environments

Epics (deprecated)

Error tracking

Events

Experiments

External status checks

Feature flags

Feature flag user lists

Freeze periods

Geo nodes (deprecated)

Geo sites

GitLab Duo Chat completions

GitLab Pages

Go Proxy

Google Cloud integration

Groups

Access tokens

Activity analytics

Epic boards

Import and export

Issue boards

Iterations

Labels

Migration by direct transfer

Milestones

Protected branches

Protected environments

Relations export

Releases

Repository storage moves

Service accounts

SSH certificates

Variables

Wikis

Helm

Import

Instance-level CI/CD variables

Integrations

Invitations

Issue boards (project)

Issues

Issues (epic)

Issues statistics

Iterations (project)

Jobs

Job artifacts

Job token scopes

Keys

Labels (project)

License

Licenses (templates)

Linked epics

Links (issue)

Links (epic)

Lint .gitlab-ci.yml

Markdown

Marketplace

Maven

Member Roles

Members

Merge request approvals

Merge request context commits

Merge requests

Merge trains

Metadata

Milestones (project)

Model registry

Namespaces

Notes (comments)

Draft notes

Notification settings

npm

NuGet

Packages

Pages domains

Personal access tokens

Pipelines schedules

Pipeline trigger tokens

Pipelines

Plan limits

Product analytics

Project access tokens

Project aliases

Project import/export

Project relations export

Project remote mirrors

Project repository storage moves

Project statistics

Project templates

Project vulnerabilities

Projects

Protected branches

Project-level protected environments

Protected packages

Protected tags

PyPI

Releases

Release links

Repositories

Repository files

Repository submodules

Resource group

Resource iteration events

Resource label events

Resource milestone events

Resource state events

Resource weight events

Ruby gems

Runners

SAML

SCIM

Search

Search migrations

Secure files

Settings (application)

Sidekiq metrics

Sidekiq queues

Snippet repository storage moves

Snippets

Snippets (project)

Statistics (application)

Suggestions

System hooks

Tags

Terraform registry

To-Do lists

Topics

Service Data

Users

Variables (project)

Version

Vulnerabilities

Vulnerability export

Vulnerability Findings

Wikis (project)

Automate storage management

Deprecations and removals

OpenAPI

GraphQL API

Run GraphQL API queries and mutations

GraphQL API resources

Audit event streaming for instances

Audit event streaming for top-level groups

Create audit report (example)

Identify issue boards (example)

List branch rules for project (example)

Query users (example)

Use custom emojis (example)

Removed items

OAuth 2.0 identity provider API

Editor and IDE extensions

Visual Studio Code

JetBrains IDEs

Troubleshooting

Visual Studio

Troubleshooting

Neovim

Troubleshooting

GitLab CLI (glab)

Contribute

Contribute to GitLab

Tutorial: Make a GitLab contribution

Contribute code with the Web IDE

Configure the Gitpod development environment

Contribute code with Gitpod

Configure GDK-in-a-box

Install the GDK development environment

Contribute code with GDK

Create a merge request

Architecture

Adding a new Service Component

Development Rake tasks

Mass insert Rails models

Development processes

AI features

Duo Chat

Embeddings

Working with prompts

Glossary

Serving Models locally

Avoiding required stops

Changelog entries

ChatOps on GitLab.com

Cloud Connector

Architecture

Code review guidelines

Danger bot

Deprecation guidelines

EE features

Emails

Experiments

Implementing experiments

Testing experiments

Experiment code reviews

Experiment rollouts

Feature flags for GitLab development

Controlling feature flags

Feature flags API

FIPS compliance

Framework - DeclarativePolicy

GitLab Dedicated features

Issues workflow

Labels

Merge request concepts

Merge request diffs development guide

Working with diffs

Application and rate limit guidelines

Frontend overview

Mergeability framework

Performance guidelines

Merge request workflow

Reusing Abstractions

Ruby upgrade guidelines

Secure partner onboarding process

Testing standards and styles

Flaky tests

Frontend testing standards and style guidelines

Review apps

Smoke tests

Testing best practices

Testing levels

Testing Rails migrations

Testing Rake tasks

Testing (contract)

Writing consumer tests

Writing provider tests

Testing (end to end)

Beginner's guide to writing end-to-end tests

Best practices when writing end-to-end tests

Dynamic element validation

Flows in GitLab QA

Page objects in GitLab QA

Resource class in GitLab QA

Migrate Capybara to Chemlab

Execution context selection

End-to-end test pipelines

Running tests that require special setup

RSpec metadata for end-to-end tests

Style guide for writing end-to-end tests

Testing with feature flags

Test Infrastructure for Cloud Integrations

Troubleshooting

Translate GitLab

Externalization

Translation

Proofreading

Merging

Development style guides

Advanced search migration style guide

API style guide

Frontend style guides

Gemfile guidelines

Go standards and style guidelines

Dependency management in Go

Managing Go versions

GraphQL API style guide

Shell command guidelines

HTML style guide

JavaScript style guide

Python guidelines

RuboCop rule guidelines

Ruby style guide

SCSS style guide

Secure coding guidelines

Shell scripting standards and style guidelines

TypeScript style guide

Vue style guide

Feature development

ActivityPub

ActivityPub actors

Releases actor

Advanced search

AI

Application Settings

Approval rules

Audit events

Auto DevOps

Built-in project templates

Cells

CI/CD

Documenting keywords

Contribute to the CI/CD schema

CI/CD component development

CI/CD template development

Pipeline Wizard

New partitioned CI/CD tables

Code intelligence

Code Owners

Code Suggestions

Source Code Management

Gitaly touch points

Push Rules development guidelines

Data science

Model registry

Data Seeder

Database

Adding database indexes

Database required stops

Add a foreign key constraint to an existing column

Avoiding downtime in migrations

Batched background migrations

Batch iteration in a tree hierarchy

Case study - filtering by label

Case study - namespaces storage statistics

CI mirrored tables

ClickHouse

ClickHouse within GitLab

GitLab activity data in ClickHouse

Merge request analytics with ClickHouse

Optimizing query execution

Tiered storages in ClickHouse

Database Dictionary

Database Lab and Postgres.ai

Database load balancing

Database migration pipeline

Database review guidelines

Database check-migrations job

Delete existing migrations

Enums

Foreign keys and associations

Introducing a new database migration version

Layout and access patterns

Maintenance operations

Migrations style guide

Multiple databases

Loose Foreign Keys

Migrations for multiple databases

NOT NULL constraints

Ordering table columns

Pagination guidelines

Pagination performance guidelines

Keyset pagination

Efficient IN operator queries

Post-deployment migrations

Query comments with Marginalia

Query count limits

Query performance guidelines

Query Recorder

Single Table Inheritance

SQL guidelines

Strings and the Text data type

Swapping tables

Table partitioning

Date range

Hash

Int range

List

Troubleshooting and debugging

Understanding EXPLAIN plans

Design and UI

Development seed files

Distributed tracing

Frontend development

Accessibility

Best practices

Automated testing

Architecture

Content Editor

Customizable dashboards

Design tokens

Diagrams.net

Merge request widget extensions

Registry architecture

Source editor

Storybook

Widgets

Dark mode

Dependencies

Design patterns

Event tracking

Emojis

FAQ

Guides

Getting started

Migrating from Vuex

Onboarding course

Lesson 1
Vue 3 migration

Icons and SVG illustrations

Keyboard shortcuts

Logging

Sentry

Performance

Security

Tech Stack

Axios

GraphQL

HAML

ViewComponent

Vue

Vuex

Tooling

Troubleshooting

Type hinting

Geo

Geo framework

Geo proxying

Git LFS

Git object deduplication

Gitaly

GitLab Flavored Markdown (GLFM)

Reference processing

GitLab Shell

Features

GitLab-sshd

Processes

GraphQL

GraphQL authorization

GraphQL BatchLoader

GraphQL pagination

GraphQL Pro

GraphQL API merge request checklist

Group-level project templates

Import (Bitbucket Cloud)

Import (Bitbucket Server)

Import (GitHub)

Import (Migration by direct transfer)

Add relations to direct transfer importer

Import (Migration by file export)

Import (test project)

Identity verification

Integrations

Internal analytics

Internal event tracking

Quick start guide

Migrating to internal event tracking

Event definition guide

Metric definition guide

Local setup and debugging

Metrics

Metrics dictionary guide

Metrics instrumentation guide

Metrics lifecycle

Service Ping

Troubleshooting

Review guidelines

Internal API

Internal allowed API

Internal users

Issuable-like Rails models utilities

Issue types

Jenkins in local environments

Jira development environment

JSON guidelines

Kubernetes integration

Logging

Observability for stage groups

Dashboards

Stage group dashboard

Error budget detail

Package

Package settings

Package structure

Support new formats

Cleanup policies

Debian repository

Dependency proxy

Harbor registry

Permissions

Custom roles

Product Qualified Lead (PQL)

Pry debugging

VS Code debugging

Build and deploy real-time view components

Redis

Remote Development developer documentation

Repository storage moves

Sec section

Analyzer development guide

CycloneDX property taxonomy

Gemnasium analyzer data

Security report ingestion

Token Revocation API

Generate test vulnerabilities

Sidekiq

Compatibility across updates

Job idempotency and job deduplication

Limited capacity worker

Logging

Worker attributes

Spam protection and CAPTCHA

Model and services

REST API spam protection

GraphQL API spam protection

Web UI spam protection

Exploratory testing

Uploads

Adding new uploads

Value Stream Analytics

Verify stage

Wikis

Work items and work item types

Workhorse

Adding new features to Workhorse

Configuration

Features that rely on Workhorse

Websocket channel support

Prometheus metrics

Organization

User experience

GitLab Development Kit

GitLab project pipelines

Contribute to GitLab Runner

Review GitLab Runner

Add new Windows version support for Docker executor

Contribute to GitLab Pages

Using dnsmasq to dynamically handle GitLab Pages subdomains

Contribute to GitLab Distribution

Contribute to Omnibus GitLab

Getting started

Build locally

Build Omnibus GitLab package

Build all-in-one Docker image

Information for GitLab team members

Set up a development environment

CI variables

Change package behavior

Change YAML config options

Add deprecation messages

Add new gitlab-ctl commands

Add new services

Add new software definitions

Create patches

Add or remove configuration options

Manage PostgreSQL versions

Omnibus mirror

Version format for the packages and Docker images

Pipelines

Work with public_attributes.json

Upgrade Chef

Handle vulnerabilities

Handle broken master pipelines

Deprecate and remove support for an OS

Contribute to GitLab Helm charts

Architecture of Cloud native GitLab Helm charts

Backup and Restore

Goals

Architecture

Design Decisions

Resource Usage

Environment setup

Style guide

Versioning and release

Troubleshooting

Contribute to GitLab Operator

CI/CD configuration

Dependency on GitLab Charts

Development installation

OpenShift cluster setup

Publish to OperatorHub

Provision and deploy

RedHat certification

RedHat certification full

Versioning and releases

Test OLM

Contribute to GitLab Design System

Contribute to documentation

Style guide

Recommended word list

Product availability details

Feature flags

Experiment and beta features

Deprecations and removals

Metadata

GraphQL

REST API

Topic types

Concepts

Tasks

Reference

Troubleshooting

Top-level

Getting started

Tutorials

Glossaries

Version-specific changes

Workflow

/help

Drawer content

Testing

markdownlint

Vale

Site architecture

Global navigation

Folder structure

Deployment process

Documentation review apps

Automation

Backport documentation changes

Redirects

Solutions

Cloud

AWS Solutions

GitLab partnership qualifications from AWS

GitLab AWS integrations index

GitLab Instances on AWS

Provision GitLab on a single EC2 instance in AWS

SRE considerations for Gitaly on AWS

GitLab and AWS Integration Tutorials

Coding Languages and Frameworks

Solutions Index for Rust

Integrations

ServiceNow

About

Use of generative AI

Collapse sidebar

Help us learn about your current experience with the documentation. Take the
survey!



ON THIS PAGE

ON THIS PAGE

 * Installation
 * Upgrade
 * Uninstall
 * Windows troubleshooting
 * Get runner logs
 * I get a PathTooLongException during my builds on Windows
 * a) Use Git with core.longpaths enabled
 * b) Use NTFSSecurity tools for PowerShell
 * I can’t run Windows BASH scripts; I’m getting The system cannot find the
   batch label specified - buildscript
 * How can I get colored output on the web terminal?
 * The service did not start due to a logon failure error when starting service
 * Job marked as success or failed incorrectly
 * Job marked as success and terminated midway using Kubernetes executor
 * Docker executor: unsupported Windows Version
 * Kubernetes executor: unsupported Windows Version
 * I’m using a mapped network drive and my build cannot find the correct path
 * The build container is unable to connect to service containers
 * The job cannot create a build directory and fails with an error
 * Blank lines for Windows Subsystem for Linux (WSL) STDOUT output in job logs


INSTALL GITLAB RUNNER ON WINDOWS

Tier: Free, Premium, Ultimate
Offering: GitLab.com, Self-managed

To install and run GitLab Runner on Windows you need:

 * Git, which can be installed from the official site
 * A password for your user account, if you want to run it under your user
   account rather than the Built-in System Account.


INSTALLATION

caution
With GitLab Runner 10, the executable was renamed to gitlab-runner.
 1. Create a folder somewhere in your system, ex.: C:\GitLab-Runner.
 2. Download the binary for 64-bit or 32-bit and put it into the folder you
    created. The following assumes you have renamed the binary to
    gitlab-runner.exe (optional). You can download a binary for every available
    version as described in Bleeding Edge - download any other tagged release.
 3. Make sure to restrict the Write permissions on the GitLab Runner directory
    and executable. If you do not set these permissions, regular users can
    replace the executable with their own and run arbitrary code with elevated
    privileges.
 4. Run an elevated command prompt:
 5. Register a runner.

 6. Install GitLab Runner as a service and start it. You can either run the
    service using the Built-in System Account (recommended) or using a user
    account.
    
    Run service using Built-in System Account (under directory created in step
    1. from above, ex.: C:\GitLab-Runner)
    
    cd C:\GitLab-Runner
    .\gitlab-runner.exe install
    .\gitlab-runner.exe start
    
    
    Run service using user account (under directory created in step 1. from
    above, ex.: C:\GitLab-Runner)
    
    You have to enter a valid password for the current user account, because
    it’s required to start the service by Windows:
    
    cd C:\GitLab-Runner
    .\gitlab-runner.exe install --user ENTER-YOUR-USERNAME --password ENTER-YOUR-PASSWORD
    .\gitlab-runner.exe start
    
    
    See the troubleshooting section if you encounter any errors during the
    GitLab Runner installation.

 7. (Optional) Update the runner’s concurrent value in
    C:\GitLab-Runner\config.toml to allow multiple concurrent jobs as detailed
    in advanced configuration details. Additionally, you can use the advanced
    configuration details to update your shell executor to use Bash or
    PowerShell rather than Batch.

Voila! Runner is installed, running, and will start again after each system
reboot. Logs are stored in Windows Event Log.


UPGRADE

 1. Stop the service (you need an elevated command prompt as before):
    
    cd C:\GitLab-Runner
    .\gitlab-runner.exe stop
    

 2. Download the binary for 64-bit or 32-bit and replace runner’s executable.
    You can download a binary for every available version as described in
    Bleeding Edge - download any other tagged release.

 3. Start the service:
    
    .\gitlab-runner.exe start
    


UNINSTALL

From an elevated command prompt:

cd C:\GitLab-Runner
.\gitlab-runner.exe stop
.\gitlab-runner.exe uninstall
cd ..
rmdir /s GitLab-Runner



WINDOWS TROUBLESHOOTING

Make sure that you read the FAQ section which describes some of the most common
problems with GitLab Runner.

If you encounter an error like The account name is invalid, try:

# Add \. before the username
.\gitlab-runner.exe install --user ".\ENTER-YOUR-USERNAME" --password "ENTER-YOUR-PASSWORD"


If you encounter a The service did not start due to a logon failure error while
starting the service, please look in the FAQ to check how to resolve the
problem.

If you don’t have a Windows Password, the GitLab Runner service won’t start but
you can use the Built-in System Account.

If you have issues with the Built-in System Account, please read Configure the
Service to Start Up with the Built-in System Account on Microsoft’s support
website.


GET RUNNER LOGS

When you run .\gitlab-runner.exe install it installs gitlab-runner as a Windows
service. You can find the logs in the Event Viewer with the provider name
gitlab-runner.

If you don’t have access to the GUI, in PowerShell, you can run Get-WinEvent.

PS C:\> Get-WinEvent -ProviderName gitlab-runner

   ProviderName: gitlab-runner

TimeCreated                     Id LevelDisplayName Message
-----------                     -- ---------------- -------
2/4/2021 6:20:14 AM              1 Information      [session_server].listen_address not defined, session endpoints disabled  builds=0...
2/4/2021 6:20:14 AM              1 Information      listen_address not defined, metrics & debug endpoints disabled  builds=0...
2/4/2021 6:20:14 AM              1 Information      Configuration loaded                                builds=0...
2/4/2021 6:20:14 AM              1 Information      Starting multi-runner from C:\config.toml...        builds=0...



I GET A PATHTOOLONGEXCEPTION DURING MY BUILDS ON WINDOWS

This is caused by tools like npm which will sometimes generate directory
structures with paths more than 260 characters in length. There are two possible
fixes you can adopt to solve the problem.

A) USE GIT WITH CORE.LONGPATHS ENABLED

You can avoid the problem by using Git to clean your directory structure, first
run git config --system core.longpaths true from the command line and then set
your project to use git fetch from the GitLab CI project settings page.

B) USE NTFSSECURITY TOOLS FOR POWERSHELL

The NTFSSecurity PowerShell module provides a Remove-Item2 method which supports
long paths. GitLab Runner will detect it if it is available and automatically
make use of it.


I CAN’T RUN WINDOWS BASH SCRIPTS; I’M GETTING THE SYSTEM CANNOT FIND THE BATCH
LABEL SPECIFIED - BUILDSCRIPT

You need to prepend call to your Batch file line in .gitlab-ci.yml so that it
looks like call C:\path\to\test.bat. Here is a more complete example:

before_script:
  - call C:\path\to\test.bat


Additional info can be found under issue #1025.


HOW CAN I GET COLORED OUTPUT ON THE WEB TERMINAL?

Short answer:

Make sure that you have the ANSI color codes in your program’s output. For the
purposes of text formatting, assume that you’re running in a UNIX ANSI terminal
emulator (because that’s what the webUI’s output is).

Long Answer:

The web interface for GitLab CI emulates a UNIX ANSI terminal (at least
partially). The gitlab-runner pipes any output from the build directly to the
web interface. That means that any ANSI color codes that are present will be
honored.

Older versions of Windows’ CMD terminal (before Win10 version 1511) do not
support ANSI color codes - they use win32 (ANSI.SYS) calls instead which are not
present in the string to be displayed. When writing cross-platform programs, a
developer will typically use ANSI color codes by default and convert them to
win32 calls when running on a Windows system (example: Colorama).

If your program is doing the above, then you need to disable that conversion for
the CI builds so that the ANSI codes remain in the string.

See GitLab CI YAML docs for an example using PowerShell and issue #332 for more
information.


THE SERVICE DID NOT START DUE TO A LOGON FAILURE ERROR WHEN STARTING SERVICE

When installing and starting the GitLab Runner service on Windows you can meet
with such error:

gitlab-runner install --password WINDOWS_MACHINE_PASSWORD
gitlab-runner start
FATA[0000] Failed to start GitLab Runner: The service did not start due to a logon failure.


This error can occur when the user used to execute the service doesn’t have the
SeServiceLogonRight permission. In this case, you need to add this permission
for the chosen user and then try to start the service again.

 1. Go to Control Panel > System and Security > Administrative Tools.
 2. Open the Local Security Policy tool.
 3. Choose the Security Settings > Local Policies > User Rights Assignment on
    the list on the left.
 4. Open the Log on as a service on the list on the right.
 5. Click the Add User or Group… button.
 6. Add the user (“by hand” or using Advanced… button) and apply the settings.

According to Microsoft’s documentation this should work for: Windows Vista,
Windows Server 2008, Windows 7, Windows 8.1, Windows Server 2008 R2, Windows
Server 2012 R2, Windows Server 2012, and Windows 8.

The Local Security Policy tool may be not available in some Windows versions -
for example in “Home Edition” variant of each version.

After adding the SeServiceLogonRight for the user used in service configuration,
the command gitlab-runner start should finish without failures and the service
should be started properly.


JOB MARKED AS SUCCESS OR FAILED INCORRECTLY

Most Windows programs output exit code 0 for success. However, some programs
don’t return an exit code or have a different value for success. An example is
the Windows tool robocopy. The following .gitlab-ci.yml fails, even though it
should be successful, due to the exit code output by robocopy:

test:
  stage: test
  script:
    - New-Item -type Directory -Path ./source
    - New-Item -type Directory -Path ./dest
    - Write-Output "Hello World!" > ./source/file.txt
    - robocopy ./source ./dest
  tags:
    - windows


In the case above, you need to manually add an exit code check to the script:.
For example, you can create a PowerShell script:

$exitCodes = 0,1

robocopy ./source ./dest

if ( $exitCodes.Contains($LastExitCode) ) {
    exit 0
} else {
    exit 1
}


And change the .gitlab-ci.yml file to:

test:
  stage: test
  script:
    - New-Item -type Directory -Path ./source
    - New-Item -type Directory -Path ./dest
    - Write-Output "Hello World!" > ./source/file.txt
    - ./robocopyCommand.ps1
  tags:
    - windows


Also, be careful of the difference between return and exit when using PowerShell
functions. While exit 1 will mark a job as failed, return 1 will not.


JOB MARKED AS SUCCESS AND TERMINATED MIDWAY USING KUBERNETES EXECUTOR

Please see Job execution.


DOCKER EXECUTOR: UNSUPPORTED WINDOWS VERSION

GitLab Runner checks the version of Windows Server to verify that it’s
supported.

It does this by running docker info.

If GitLab Runner fails to start with the following error, but with no Windows
Server version specified, then the likely root cause is that the Docker version
is too old.

Preparation failed: detecting base image: unsupported Windows Version: Windows Server Datacenter


The error should contain detailed information about the Windows Server version,
which is then compared with the versions that GitLab Runner supports.

unsupported Windows Version: Windows Server Datacenter Version (OS Build 18363.720)


Docker 17.06.2 on Windows Server returns the following in the output of docker
info.

Operating System: Windows Server Datacenter


The fix in this case is to upgrade the Docker version of similar age, or later,
than the Windows Server release.


KUBERNETES EXECUTOR: UNSUPPORTED WINDOWS VERSION

Kubernetes executor on Windows might fail with the following error:

Using Kubernetes namespace: gitlab-runner
ERROR: Preparation failed: prepare helper image: detecting base image: unsupported Windows Version:
Will be retried in 3s ...
ERROR: Job failed (system failure): prepare helper image: detecting base image: unsupported Windows Version:


To fix it, add node.kubernetes.io/windows-build nodeSelector in the section
[runners.kubernetes.node_selector] of your GitLab Runner config file, For
example:

   [runners.kubernetes.node_selector]
     "kubernetes.io/arch" = "amd64"
     "kubernetes.io/os" = "windows"
     "node.kubernetes.io/windows-build" = "10.0.17763"



I’M USING A MAPPED NETWORK DRIVE AND MY BUILD CANNOT FIND THE CORRECT PATH

If GitLab Runner is not being run under an administrator account and instead is
using a standard user account, mapped network drives cannot be used and you’ll
receive an error stating The system cannot find the path specified. This is
because using a service logon session creates some limitations on accessing
resources for security. Use the UNC path of your drive instead.


THE BUILD CONTAINER IS UNABLE TO CONNECT TO SERVICE CONTAINERS

To use services with Windows containers:

 * Use the networking mode that creates a network for each job.
 * Ensure that the FF_NETWORK_PER_BUILD feature flag is enabled.


THE JOB CANNOT CREATE A BUILD DIRECTORY AND FAILS WITH AN ERROR

When you use the GitLab-Runner with the Docker-Windows executor, a job might
fail with an error like:

fatal: cannot chdir to c:/builds/gitlab/test: Permission denied`


When this error occurs, ensure the user the Docker engine is running as has full
permissions to C:\Program Data\Docker. The Docker engine must be able to write
to this directory for certain actions, and without the correct permissions it
will fail.

Read more about configuring Docker Engine on Windows.


BLANK LINES FOR WINDOWS SUBSYSTEM FOR LINUX (WSL) STDOUT OUTPUT IN JOB LOGS

By default the STDOUT output for the Windows Subsystem for Linux (WSL) is not
UTF8 encoded and displays as blank lines in the job logs. To display the STDOUT
output, you can force UTF8 encoding for WSL by setting the WSL_UTF8 environment
variable.

job:
  variables:
    WSL_UTF8: "1"



HELP & FEEDBACK


DOCS

Edit this page to fix an error or add an improvement in a merge request.
Create an issue to suggest an improvement to this page.



PRODUCT

Create an issue if there's something you don't like about this feature.
Propose functionality by submitting a feature request.
Join First Look to help shape new features.


FEATURE AVAILABILITY AND PRODUCT TRIALS

View pricing to see all GitLab tiers and features, or to upgrade.
Try GitLab for free with access to all features for 30 days.



GET HELP

If you didn't find what you were looking for, search the docs.


If you want help with something specific and could use community support, post
on the GitLab forum.


For problems setting up or using this feature (depending on your GitLab
subscription).


Request support
Sign in to GitLab.com
 * Twitter
 * Facebook
 * YouTube
 * LinkedIn

 * Docs Repo
 * About GitLab
 * Terms
 * Privacy Statement
 * Cookie Preferences
 * Contact

View page source - Edit in Web IDE

 * Twitter
 * Facebook
 * YouTube
 * LinkedIn

ON THIS PAGE

ON THIS PAGE

 * Installation
 * Upgrade
 * Uninstall
 * Windows troubleshooting
 * Get runner logs
 * I get a PathTooLongException during my builds on Windows
 * a) Use Git with core.longpaths enabled
 * b) Use NTFSSecurity tools for PowerShell
 * I can’t run Windows BASH scripts; I’m getting The system cannot find the
   batch label specified - buildscript
 * How can I get colored output on the web terminal?
 * The service did not start due to a logon failure error when starting service
 * Job marked as success or failed incorrectly
 * Job marked as success and terminated midway using Kubernetes executor
 * Docker executor: unsupported Windows Version
 * Kubernetes executor: unsupported Windows Version
 * I’m using a mapped network drive and my build cannot find the correct path
 * The build container is unable to connect to service containers
 * The job cannot create a build directory and fails with an error
 * Blank lines for Windows Subsystem for Linux (WSL) STDOUT output in job logs


PRIVACY PREFERENCE CENTER




 * YOUR PRIVACY


 * STRICTLY NECESSARY COOKIES


 * FUNCTIONALITY COOKIES


 * PERFORMANCE AND ANALYTICS COOKIES


 * TARGETING AND ADVERTISING COOKIES

YOUR PRIVACY

When you visit any website, it may store or retrieve information on your
browser, mostly in the form of cookies. This information might be about you,
your preferences or your device and is mostly used to make the site work as you
expect it to. The information does not usually directly identify you, but it can
give you a more personalized web experience. Because we respect your right to
privacy, you can choose not to allow some types of cookies. Click on the
different category headings to find out more and change our default settings.
However, blocking some types of cookies may impact your experience of the site
and the services we are able to offer.
Cookie Policy

User ID: 23eec010-474d-483a-af7f-494ee21cd226
This User ID will be used as a unique identifier while storing and accessing
your preferences for future.
Timestamp: --



STRICTLY NECESSARY COOKIES

Always Active

These cookies are necessary for the website to function and cannot be switched
off in our systems. They are usually only set in response to actions made by you
which amount to a request for services, such as setting your privacy
preferences, enabling you to securely log into the site, filling in forms, or
using the customer checkout. GitLab processes any personal data collected
through these cookies on the basis of our legitimate interest.

Cookies Details‎

FUNCTIONALITY COOKIES

Functionality Cookies


These cookies enable helpful but non-essential website functions that improve
your website experience. By recognizing you when you return to our website, they
may, for example, allow us to personalize our content for you or remember your
preferences. If you do not allow these cookies then some or all of these
services may not function properly. GitLab processes any personal data collected
through these cookies on the basis of your consent

Cookies Details‎

PERFORMANCE AND ANALYTICS COOKIES

Performance and Analytics Cookies


These cookies allow us and our third-party service providers to recognize and
count the number of visitors on our websites and to see how visitors move around
our websites when they are using it. This helps us improve our products and
ensures that users can easily find what they need on our websites. These cookies
usually generate aggregate statistics that are not associated with an
individual. To the extent any personal data is collected through these cookies,
GitLab processes that data on the basis of your consent.

Cookies Details‎

TARGETING AND ADVERTISING COOKIES

Targeting and Advertising Cookies


These cookies enable different advertising related functions. They may allow us
to record information about your visit to our websites, such as pages visited,
links followed, and videos viewed so we can make our websites and the
advertising displayed on it more relevant to your interests. They may be set
through our website by our advertising partners. They may be used by those
companies to build a profile of your interests and show you relevant
advertisements on other websites. GitLab processes any personal data collected
through these cookies on the basis of your consent.

Cookies Details‎
Back Button


COOKIE LIST

Filter Button
Consent Leg.Interest
checkbox label label
checkbox label label
checkbox label label

Clear
checkbox label label
Apply Cancel
Confirm My Choices
Allow All