-
Notifications
You must be signed in to change notification settings - Fork 28
/
.appveyor.yml
173 lines (160 loc) · 11.1 KB
/
.appveyor.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# .appveyor.yml (for Perl distributions)
# * (APIv1) for usage instructions, see <https://github.com/rivy/CI.AppVeyor.helpers-perl/blob/stable.APIv1/README.mkd>
# ref: <https://www.appveyor.com/docs/appveyor-yml>[`@`](https://archive.is/OUJHS)
# * "appveyor.yml" validation tool @ <https://ci.appveyor.com/tools/validate-yaml>
version: "{build} ~ {branch}"
branches:
except:
- gh-pages
skip_tags: true ## do not build on tags
matrix:
allow_failures:
- AUTHOR_TESTING: 1
- TEST_SIGNATURE: 1
- CI_HELPER_BRANCH: canary
- Perl_VERSION: "5.8.8" ## allow perl v5.8.8 failures; (v5.8.8 is problematic for many projects)
environment:
matrix:
- Perl_VERSION: "latest"
COVERAGE: "Codecov Coveralls" ## note: case sensitive!
AUTHOR_TESTING: 1
RELEASE_TESTING: 1
- Perl_VERSION: "5.28"
- Perl_VERSION: "5.26"
- Perl_VERSION: "5.24"
- Perl_VERSION: "5.22"
- Perl_VERSION: "5.20"
- Perl_VERSION: "5.16"
- Perl_VERSION: "5.14"
- Perl_VERSION: "5.12"
- Perl_VERSION: "5.10"
- Perl_VERSION: "5.8.9"
- Perl_VERSION: "5.8.8"
- Perl_VERSION: "latest"
CI_HELPER_BRANCH: "canary"
TEST_SIGNATURE: 1
global:
AUTOMATED_TESTING: 1
CI_CACHE_DIR: "C:\\cache"
#
# debug?
# CI_DEBUG: 1 ## [ "" == false, <non-empty> == true ]; "true" enables detailed output for the helper scripts
#
## configuration (CI/network-side settings and then ".appveyor_init.{BAT,PS1}" [if present], may override these values [by design])
## ---
# * standard perl distribution test configuration signals
AUTHOR_TESTING: ""
RELEASE_TESTING: ""
# * .appveyor.yml configuration variables
CI_HELPER_API_VERSION: "1" ## * API version (the expected/requested helper API version)
CI_HELPER_BRANCH: "" ## "" => auto-set, valid alternates are [ "stable" (the default), "canary", BRANCH, or TAG ]
CI_HELPER_REPO: "" ## "" => auto-set; allows easier use of alternate helper scripts (ie, alternate forks)
DEVEL_COVER_OPTIONS: "" ## "" => auto-set, value determined by DIST_TOOLING; quoted whitespace (eg, " ") is an empty/neutral setting which also blocks auto-set
DIST_EXTRA_DEPS: "" ## additional required/requested dependencies for build and/or testing
DIST_SUPPRESS_DEPS: "" ## [ "" == false, <non-empty> == true ]; "true" can be useful for CORE modules, suppressing discovery and installation of dependencies, unless otherwise required (by COVERAGE or DIST_EXTRA_DEPS)
DIST_TOOLING: "" ## [ "build", "make" ]; "" => auto-set based on existence of "Build.PL" and/or "Makefile.PL"
TEST_METHOD: "" ## "" => auto-set based on DIST_TOOLING (`perl Build test`, `%make% test`, or `prove -bl`)
TEST_FILES: "" ## "" => auto-set to "" for build/make distributions, otherwise "t" or "t xt" depending on AUTHOR_TESTING and/or RELEASE_TESTING and directory existence
## ---
cache:
# note: unused, because, unfortunately, the available cache is too small to be helpful (unshared; 1GB across all projects)
# - '%CI_CACHE_DIR% -> .appveyor.yml'
install:
- ps: ; write-host $("[{0:HH:mm:ss}].install" -f $($mark = get-date; $mark)) -f darkgray
# ensure CWD is project main directory
- cd "%APPVEYOR_BUILD_FOLDER%"
# perform any special preparation (optional; distribution specific)
# * note: optional external file(s), global scope => allows ".appveyor.yml" to remain more stable and similar [or the same] between different distributions [eg, for automated distribution of ".appveyor.yml" changes]
- if EXIST ".appveyor_init.BAT" ( call .appveyor_init.BAT )
- ps: if ( test-path ".appveyor_init.PS1" ) { . ".\.appveyor_init.PS1" }
# save current-point-in-time environment (for later logging of environment variable overrides)
- ps: $baseline_env = @(get-childitem env:)
# create a working area
- ps: if ( ! $env:CI_TEMP_DIR ) { $env:CI_TEMP_DIR = "${env:TEMP}\${env:APPVEYOR_JOB_ID}" ; mkdir -force $env:CI_TEMP_DIR | out-null }
# create cache area, if missing
- if NOT DEFINED CI_CACHE_DIR ( set "CI_CACHE_DIR=%CI_TEMP_DIR%\cache" )
- if NOT EXIST "%CI_CACHE_DIR%" ( mkdir "%CI_CACHE_DIR%" )
# finalize HELPER repository location
- if NOT DEFINED CI_HELPER_API_VERSION ( set "CI_HELPER_API_VERSION=1" )
- if NOT DEFINED CI_HELPER_REPO ( set "CI_HELPER_REPO=https://github.com/rivy/CI.AppVeyor.helpers-perl.git" )
- if NOT DEFINED CI_HELPER_BRANCH ( set "CI_HELPER_BRANCH=stable" )
- if /i "%CI_HELPER_BRANCH%"=="canary" ( set "CI_HELPER_BRANCH=canary.APIv%CI_HELPER_API_VERSION%" )
- if /i "%CI_HELPER_BRANCH%"=="stable" ( set "CI_HELPER_BRANCH=stable.APIv%CI_HELPER_API_VERSION%" )
# find / download helpers
- ps: ; write-host $("[{0:HH:mm:ss}].install (helpers)" -f $($mark_sub = get-date; $mark_sub)) -f darkgray
# * use "vendored" copy if present
- ps: if ( ! $env:CI_HELPERS -and (test-path ".appveyor_bin") ) { $env:CI_HELPERS=[IO.Path]::GetFullPath(".appveyor_bin") ; ${env:CI_HELPER_REPO} = ${env:APPVEYOR_REPO_NAME} ; ${env:CI_HELPER_BRANCH_DESC} = ${env:APPVEYOR_REPO_COMMIT} ; }
# * clone/download helpers from HELPER repo (via `git`) if needed
- ps: if ( ! $env:CI_HELPERS ) { $repo_path = $( mkdir "${env:CI_TEMP_DIR}\helpers" ).Fullname ; $git_cmd = "git clone ${env:CI_HELPER_REPO} `"${repo_path}`" -b ${env:CI_HELPER_BRANCH} 2>&1" ; write-host "[``${git_cmd}``]" ; & 'CMD' @( '/c', $git_cmd ) ; $err = $LASTEXITCODE ; $env:CI_HELPERS = "${repo_path}\.appveyor_bin" ; if ($err -ne 0) { exit $err } ; }
- ps: if ( ! $env:CI_HELPER_BRANCH_DESC ) { ${env:CI_HELPER_BRANCH_DESC} = $( pushd "${env:CI_HELPERS}" ; & 'git' @( 'describe', '--always' ) 2>&1 ; popd ) ; }
- ps: ; write-host $("[{0:HH:mm:ss}].install (helpers) ... (${env:CI_HELPER_REPO}@${env:CI_HELPER_BRANCH_DESC})")
# resolve requested coverage with needed configuration
- ps: . "${env:CI_HELPERS}\#install.determine-coverage.PS1"
##
# highlight any overrides within baseline environment
- ps: $baseline_env | & "${env:CI_HELPERS}\log.env-overrides.PS1"
##
# move "C:\mingw" to avoid cross library linking (a problem with older perl versions, breaking dll compilation with "/mingw/lib/dllcrt2.o:(.text+0xd1): undefined reference to `__dyn_tls_init_callback'")
# * only truly needed for modules containing XS compilation, but ok for all modules
- move c:\mingw c:\mingw.o >NUL
# force branch checkout (if knowable), then reset to the specific commit ## (needed for accurate code coverage info)
# * this allows later apps to see the branch name using standard `git branch` operations, yet always builds the correct specific commit
# * ref: <https://github.com/appveyor/ci/issues/1606>[`@`](https://archive.is/RVpnF)
- if DEFINED APPVEYOR_REPO_BRANCH if /i "%APPVEYOR_REPO_SCM%"=="git" ( git checkout "%APPVEYOR_REPO_BRANCH%" >NUL & git reset --hard "%APPVEYOR_REPO_COMMIT%" )
# install perl (strawberry variant) + version verification
- ps: ; write-host $("[{0:HH:mm:ss}].install (perl)" -f $($mark_sub = get-date; $mark_sub)) -f darkgray
- ps: . "${env:CI_HELPERS}\#install.install-perl.PS1"
- perl -V
- ps: ; write-host $("[{0:HH:mm:ss}].install (perl) ... done ({1:0.0}s)" -f $(get-date; $($(get-date) - $mark_sub).totalseconds)) -f gray
# determine build tooling
- ps: . "${env:CI_HELPERS}\#install.determine-tooling.PS1"
# setup DEVEL_COVER_OPTIONS, if needed
- ps: if (! $env:DEVEL_COVER_OPTIONS) { . "${env:CI_HELPERS}\#install.setup-cover_options.PS1" }
# setup testing method/options and test files
- ps: . "${env:CI_HELPERS}\#install.setup-testing.PS1"
# distribution prep prior to the build/make process (ie, build dependencies and OS_unsupported check)
- ps: ; write-host $("[{0:HH:mm:ss}].install (distribution requirements and recommendations)" -f $($mark_sub = get-date; $mark_sub)) -f darkgray
- ps: . "${env:CI_HELPERS}\#install.setup-dist.PS1"
- ps: ; write-host $("[{0:HH:mm:ss}].install (distribution requirements and recommendations) ... done ({1:0.0}s)" -f $(get-date; $($(get-date) - $mark_sub).totalseconds)) -f gray
# coverage prep
- ps: ; write-host $("[{0:HH:mm:ss}].install (coverage requirements)" -f $($mark_sub = get-date; $mark_sub)) -f darkgray
- ps: . "${env:CI_HELPERS}\#install.setup-coverage.PS1"
- ps: ; write-host $("[{0:HH:mm:ss}].install (coverage requirements) ... done ({1:0.0}s)" -f $(get-date; $($(get-date) - $mark_sub).totalseconds)) -f gray
#
- ps: ; write-host $("[{0:HH:mm:ss}].install ... done ({1:0.0}s)" -f $(get-date; $($(get-date) - $mark).totalseconds)) -f green
before_build:
- ps: ; write-host $("[{0:HH:mm:ss}].build.before_build" -f $($mark = get-date; $mark)) -f darkgray
# ensure CWD is project main directory
- cd "%APPVEYOR_BUILD_FOLDER%"
# * for non-COVERAGE builds, enable parallel processing (COVERAGE builds need sequential, correctly interleaved, output to avoid warnings)
- if NOT DEFINED COVERAGE (set "HARNESS_OPTIONS=j")
- set HARNESS_TIMER=1
# * for COVERAGE builds, enable coverage for `prove` testing
- if DEFINED COVERAGE (set HARNESS_PERL_SWITCHES=-MDevel::Cover %HARNESS_PERL_SWITCHES%)
# * for COVERAGE builds, preload JSON:PP to avoid JSON::PP::Boolean redefine warning (see <https://github.com/rurban/Cpanel-JSON-XS/issues/65#issuecomment-219352754>)
- if DEFINED COVERAGE (set HARNESS_PERL_SWITCHES=-MJSON::PP %HARNESS_PERL_SWITCHES%)
#
- ps: . "${env:CI_HELPERS}\#build-before_build.PS1"
# show final build-related environment variables
- ps: . "${env:CI_HELPERS}\log.env.PS1"
#
- ps: ; write-host $("[{0:HH:mm:ss}].build.before_build ... done ({1:0.0}s)" -f $(get-date; $($(get-date) - $mark).totalseconds)) -f green
build_script:
- ps: ; write-host $("[{0:HH:mm:ss}].build.build_script" -f $($mark = get-date; $mark)) -f darkgray
- ps: . "${env:CI_HELPERS}\#build-build_script.PS1"
- ps: ; write-host $("[{0:HH:mm:ss}].build.build_script ... done ({1:0.0}s)" -f $(get-date; $($(get-date) - $mark).totalseconds)) -f green
test_script:
- ps: ; write-host $("[{0:HH:mm:ss}].test.test_script" -f $($mark = get-date; $mark)) -f darkgray
- ps: . "${env:CI_HELPERS}\#test-test_script.PS1"
- ps: ; write-host $("[{0:HH:mm:ss}].test.test_script ... done ({1:0.0}s)" -f $(get-date; $($(get-date) - $mark).totalseconds)) -f green
after_test:
- ps: ; write-host $("[{0:HH:mm:ss}].test.after_test" -f $($mark = get-date; $mark)) -f darkgray
# reporting
# * report any code coverage information
- ps: if (-not $env:OS_unsupported -and $env:COVERAGE) { $env:COVERAGE.split() | foreach { & 'CMD' @( '/c', "cover -report $_ 2>&1" ) } }
- ps: ; write-host $("[{0:HH:mm:ss}].test.after_test ... done ({1:0.0}s)" -f $(get-date; $($(get-date) - $mark).totalseconds)) -f green
# end with any informational or warning messages, if needed
- ps: if ($env:CI_SKIP) { write-host -f magenta "info:` CI_SKIP enabled" ; Add-AppveyorMessage -Message "CI_SKIP enabled" -Category Info }
- ps: if ($env:CI_SKIP_TEST) { write-host -f magenta "info:` CI_SKIP_TEST enabled" ; Add-AppveyorMessage -Message "CI_SKIP_TEST enabled" -Category Info }
# * prominent "unsupported" warning
- ps: if ($env:OS_unsupported) { write-host -f magenta "WARN:` OS unsupported" ; Add-AppveyorMessage -Message "OS unsupported" -Category Warning }