powershell runner is confused by Unicode curly quote marks
Summary
GitLab powershell runners don't escape curly quote marks and so fail if they are in commit messages etc. Note: macOS sometimes 'corrects' quote marks (") to curly quote marks (“”). e.g. commit message Do another “thing”
).
Steps to reproduce
Make a commit with message containing curly quote marks.
.gitlab-ci.yml
powershell:
script: New-Item -Name "folder" -ItemType "directory"
tags:
- shared-windows
- windows
- windows-1809
Actual behavior
See following logs. shell version fails, gitlab.com version prints errors and succeeds.
powershell `shell` locally
Using Shell executor...
00:00
Running on BLAH...
00:01
At C:\Users\gitlab-runner\AppData\Local\Temp\build_script672068980\script.ps1:119 char:33
00:01
+ $CI_COMMIT_MESSAGE="Do another "thing""
+ ~~~~~~~
Unexpected token 'thing""' in expression or statement.
At C:\Users\gitlab-runner\AppData\Local\Temp\build_script672068980\script.ps1:121 char:31
+ $CI_COMMIT_TITLE="Do another "thing""
+ ~~~~~~~
Unexpected token 'thing""' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : UnexpectedToken
At C:\Users\gitlab-runner\AppData\Local\Temp\build_script918938310\script.ps1:119 char:33
00:00
+ $CI_COMMIT_MESSAGE="Do another "thing""
+ ~~~~~~~
Unexpected token 'thing""' in expression or statement.
At C:\Users\gitlab-runner\AppData\Local\Temp\build_script918938310\script.ps1:121 char:31
+ $CI_COMMIT_TITLE="Do another "thing""
+ ~~~~~~~
Unexpected token 'thing""' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : UnexpectedToken
ERROR: Job failed: exit status 1
powershell on GitLab.com shared runner https://gitlab.com/hjmallon/test-powershell/-/jobs/445819922
Running with gitlab-runner 12.7.1 (003fe500)
on windows-shared-runners-manager Hs8mheX5
Using Custom executor with driver autoscaler dev (615ff62)...
02:21
Creating virtual machine for the job...
Virtual machine created!
Running on PACKER-5E2B9549 via
00:17
runner-hs8mhex5-wsrm-b33bae5cdf7f45363126...
At line:1 char:33
00:20
+ $CI_COMMIT_MESSAGE="Do another “thing”"
+ ~~~~~~~
Unexpected token 'thing”"' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
At line:1 char:31
+ $CI_COMMIT_TITLE="Do another “thing”"
+ ~~~~~~~
Unexpected token 'thing”"' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
Fetching changes with git depth set to 50...
Initialized empty Git repository in C:/GitLab-Runner/builds/hjmallon/test-powershell/.git/
Created fresh repository.
Checking out d0d1cc38 as master...
From https://gitlab.com/hjmallon/test-powershell
* [new ref] refs/pipelines/119964357 -> refs/pipelines/119964357
* [new branch] master -> origin/master
git-lfs/2.8.0 (GitHub; windows amd64; go 1.12.2; git 30af66bb)
Skipping Git submodules setup
At line:1 char:33
00:13
+ $CI_COMMIT_MESSAGE="Do another “thing”"
+ ~~~~~~~
Unexpected token 'thing”"' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
At line:1 char:31
+ $CI_COMMIT_TITLE="Do another “thing”"
+ ~~~~~~~
Unexpected token 'thing”"' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
At line:1 char:33
00:12
+ $CI_COMMIT_MESSAGE="Do another “thing”"
+ ~~~~~~~
Unexpected token 'thing”"' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
At line:1 char:31
+ $CI_COMMIT_TITLE="Do another “thing”"
+ ~~~~~~~
Unexpected token 'thing”"' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
$ New-Item -Name "folder" -ItemType "directory"
00:12
Directory: C:\GitLab-Runner\builds\hjmallon\test-powershell
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2/21/2020 1:56 PM folder
At line:1 char:33
+ $CI_COMMIT_MESSAGE="Do another “thing”"
+ ~~~~~~~
Unexpected token 'thing”"' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
At line:1 char:31
+ $CI_COMMIT_TITLE="Do another “thing”"
+ ~~~~~~~
Unexpected token 'thing”"' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
At line:1 char:33
00:12
+ $CI_COMMIT_MESSAGE="Do another “thing”"
+ ~~~~~~~
Unexpected token 'thing”"' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
At line:1 char:31
+ $CI_COMMIT_TITLE="Do another “thing”"
+ ~~~~~~~
Unexpected token 'thing”"' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
At line:1 char:33
00:10
+ $CI_COMMIT_MESSAGE="Do another “thing”"
+ ~~~~~~~
Unexpected token 'thing”"' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
At line:1 char:31
+ $CI_COMMIT_TITLE="Do another “thing”"
+ ~~~~~~~
Unexpected token 'thing”"' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
Job succeeded
Expected behavior
I would expect it to correctly escape the quote marks.
Environment description
Powershell shell runner locally on windows 10 and GitLab.com windows runner.
Used GitLab Runner version
12.7.1. See log output above.
Possible fixes
Work out what powershell's stance on curly quotes is. If I paste one in it seems to change it to straight quotes. Maybe escape them?