Skip to content

Using MSYS2 in CI

Assuming you use GitHub this is the easiest way to get going. We provide a GitHub Action which handles everything from installing the latest MSYS2, updating it and installing all the packages you need. All you have to do is to provide a BASH script that runs your code in the MSYS2 environment.

1) Create a workflow file, see the GitHub docs for details

2) Paste the following into your workflow file:

name: Hello World
on: [push, pull_request]

jobs:
  build:
    runs-on: windows-latest
    defaults:
      run:
        shell: msys2 {0}
    steps:
      - uses: actions/checkout@v2
      - uses: msys2/setup-msys2@v2
        with:
          msystem: MINGW64
          update: true
          install: git mingw-w64-x86_64-toolchain
      - name: CI-Build
        run: |
          echo 'Running in MSYS2!'
          ./ci-build.sh

For more details on the 'msys2/setup-msys2' action and all the available options see https://github.com/marketplace/actions/setup-msys2

Appveyor

Appveyor provides a MSYS2 installation on all their images under C:\msys64, see https://www.appveyor.com/docs/windows-images-software/

In case you want to update the MSYS2 installation and install packages you need to update MSYS2 first. For this you need to run the following commands:

# Update MSYS2
C:\msys64\usr\bin\bash -lc "pacman --noconfirm -Syuu"  # Core update (in case any core packages are outdated)
C:\msys64\usr\bin\bash -lc "pacman --noconfirm -Syuu"  # Normal update

# Then run your code
$env:CHERE_INVOKING = 'yes'  # Preserve the current working directory
$env:MSYSTEM = 'MINGW64'  # Start a 64 bit Mingw environment
C:\msys64\usr\bin\bash -lc "./ci-build.sh"

Docker

Install MSYS2 under C:\msys64 into a Windows based Docker image:

# select as base image matching your host to get process isolation
FROM mcr.microsoft.com/windows/servercore:2004

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

RUN [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; \
  Invoke-WebRequest -UseBasicParsing -uri "https://github.com/msys2/msys2-installer/releases/download/nightly-x86_64/msys2-base-x86_64-latest.sfx.exe" -OutFile msys2.exe; \
  .\msys2.exe -y -oC:\; \
  Remove-Item msys2.exe ; \
  function msys() { C:\msys64\usr\bin\bash.exe @('-lc') + @Args; } \
  msys ' '; \
  msys 'pacman --noconfirm -Syuu'; \
  msys 'pacman --noconfirm -Syuu'; \
  msys 'pacman --noconfirm -Scc';

Other Systems

On systems that don't provide MSYS2 integration you need to install and update MSYS2 yourself.

1) Download and install MSYS2. For CI systems we provide a self extracting archive, so you don't need any additional tools.

# Download the archive
(New-Object System.Net.WebClient).DownloadFile('https://github.com/msys2/msys2-installer/releases/download/nightly-x86_64/msys2-base-x86_64-latest.sfx.exe', 'msys2.exe')
.\msys2.exe -y -oC:\  # Extract to C:\msys64
Remove-Item msys2.exe  # Delete the archive again

2) Run MSYS2 for the first time and update it

# Run for the first time
C:\msys64\usr\bin\bash -lc ' '
# Update MSYS2
C:\msys64\usr\bin\bash -lc 'pacman --noconfirm -Syuu'  # Core update (in case any core packages are outdated)
C:\msys64\usr\bin\bash -lc 'pacman --noconfirm -Syuu'  # Normal update

3) Run your code (ci-build.sh in this case)

$env:CHERE_INVOKING = 'yes'  # Preserve the current working directory
$env:MSYSTEM = 'MINGW64'  # Start a 64 bit Mingw environment
C:\msys64\usr\bin\bash -lc './ci-build.sh'

4) End all processes that might have been started by the MSYS2 update/setup

In some cases CI systems will wait until all processes you have started have also ended, but the MSYS2 setup and update might spawn processes for gnupg etc. that will stay around in the background forever. To end them all you can run:

taskkill /F /FI "MODULES eq msys-2.0.dll"