Difference between revisions of "Continuous Integration"
m |
(Update appveyor recipe to download stable version of DMD and LDC. Also, now can use 32bit and 64 bit versions of DMD and DUB, on fuction of if arch is settup to x64 or x86 . Tested on Pegged respository.) |
||
Line 78: | Line 78: | ||
environment: | environment: | ||
matrix: | matrix: | ||
− | + | - DC: dmd | |
− | + | DVersion: stable | |
− | + | arch: x64 | |
− | + | - DC: dmd | |
− | + | DVersion: stable | |
− | + | arch: x86 | |
− | + | - DC: ldc | |
− | + | DVersion: stable | |
− | + | arch: x86 | |
− | + | - DC: ldc | |
− | + | DVersion: stable | |
− | + | arch: x64 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
skip_tags: true | skip_tags: true | ||
Line 104: | Line 98: | ||
install: | install: | ||
− | - ps: function | + | - ps: function ResolveLatestDMD |
{ | { | ||
$version = $env:DVersion; | $version = $env:DVersion; | ||
if($version -eq "stable") { | if($version -eq "stable") { | ||
$latest = (Invoke-WebRequest "http://downloads.dlang.org/releases/LATEST").toString(); | $latest = (Invoke-WebRequest "http://downloads.dlang.org/releases/LATEST").toString(); | ||
− | $ | + | $url = "http://downloads.dlang.org/releases/2.x/$($latest)/dmd.$($latest).windows.7z"; |
}elseif($version -eq "beta") { | }elseif($version -eq "beta") { | ||
$latest = (Invoke-WebRequest "http://downloads.dlang.org/pre-releases/LATEST").toString(); | $latest = (Invoke-WebRequest "http://downloads.dlang.org/pre-releases/LATEST").toString(); | ||
$latestVersion = $latest.split("-")[0].split("~")[0]; | $latestVersion = $latest.split("-")[0].split("~")[0]; | ||
− | $ | + | $url = "http://downloads.dlang.org/pre-releases/2.x/$($latestVersion)/dmd.$($latest).windows.7z"; |
− | |||
− | |||
}else { | }else { | ||
− | $ | + | $url = "http://downloads.dlang.org/releases/2.x/$($version)/dmd.$($version).windows.7z"; |
+ | } | ||
+ | if($env:arch -eq "x64"){ | ||
+ | $env:PATH += ";C:\dmd2\windows\bin64;"; | ||
} | } | ||
$env:PATH += ";C:\dmd2\windows\bin;"; | $env:PATH += ";C:\dmd2\windows\bin;"; | ||
− | return $ | + | return $url; |
} | } | ||
− | - ps: function | + | - ps: function ResolveLatestLDC |
{ | { | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
$version = $env:DVersion; | $version = $env:DVersion; | ||
$arch = $env:arch; | $arch = $env:arch; | ||
if($version -eq "stable") { | if($version -eq "stable") { | ||
$latest = (Invoke-WebRequest "https://ldc-developers.github.io/LATEST").toString().replace("`n","").replace("`r",""); | $latest = (Invoke-WebRequest "https://ldc-developers.github.io/LATEST").toString().replace("`n","").replace("`r",""); | ||
− | $ | + | $url = "https://github.com/ldc-developers/ldc/releases/download/v$($latest)/ldc2-$($latest)-windows-$($arch).7z"; |
}elseif($version -eq "beta") { | }elseif($version -eq "beta") { | ||
$latest = (Invoke-WebRequest "https://ldc-developers.github.io/LATEST_BETA").toString().replace("`n","").replace("`r",""); | $latest = (Invoke-WebRequest "https://ldc-developers.github.io/LATEST_BETA").toString().replace("`n","").replace("`r",""); | ||
− | $ | + | $url = "https://github.com/ldc-developers/ldc/releases/download/v$($latest)/ldc2-$($latest)-windows-$($arch).7z"; |
} else { | } else { | ||
$latest = $version; | $latest = $version; | ||
− | $ | + | $url = "https://github.com/ldc-developers/ldc/releases/download/v$($version)/ldc2-$($version)-windows-$($arch).7z"; |
− | |||
} | } | ||
− | $env:PATH += ";C:\ldc2-$($latest)-windows-$($arch) | + | $env:PATH += ";C:\ldc2-$($latest)-windows-$($arch)\bin"; |
$env:DC = "ldc2"; | $env:DC = "ldc2"; | ||
− | return $ | + | return $url; |
} | } | ||
- ps: function SetUpDCompiler | - ps: function SetUpDCompiler | ||
Line 151: | Line 139: | ||
$env:toolchain = "msvc"; | $env:toolchain = "msvc"; | ||
if($env:DC -eq "dmd"){ | if($env:DC -eq "dmd"){ | ||
− | + | echo "downloading ..."; | |
− | + | $url = ResolveLatestDMD; | |
+ | echo $url; | ||
+ | Invoke-WebRequest $url -OutFile "c:\dmd.7z"; | ||
+ | echo "finished."; | ||
+ | pushd c:\\; | ||
+ | 7z x dmd.7z > $null; | ||
+ | popd; | ||
} | } | ||
elseif($env:DC -eq "ldc"){ | elseif($env:DC -eq "ldc"){ | ||
− | + | echo "downloading ..."; | |
− | + | $url = ResolveLatestLDC; | |
− | + | echo $url; | |
− | + | Invoke-WebRequest $url -OutFile "c:\ldc.zip"; | |
− | + | echo "finished."; | |
− | + | pushd c:\\; | |
− | + | 7z x ldc.zip > $null; | |
− | + | popd; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
- ps: SetUpDCompiler | - ps: SetUpDCompiler | ||
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
before_build: | before_build: | ||
+ | |||
- ps: if($env:arch -eq "x86"){ | - ps: if($env:arch -eq "x86"){ | ||
$env:compilersetupargs = "x86"; | $env:compilersetupargs = "x86"; | ||
Line 221: | Line 185: | ||
- echo %DMD% | - echo %DMD% | ||
- echo %PATH% | - echo %PATH% | ||
+ | - dub --version | ||
- '%DC% --help' | - '%DC% --help' | ||
- dub test --arch=%Darch% --compiler=%DC% | - dub test --arch=%Darch% --compiler=%DC% | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | Like in Travis, you can use a specify version, setting '''DVersion''', and you can choose between the 32bit or 64bit compiler with '''arch''' : | ||
+ | |||
+ | <syntaxhighlight lang="yaml"> | ||
+ | matrix: | ||
+ | - DC: dmd | ||
+ | DVersion: 2.087.1 | ||
+ | arch: x86 | ||
+ | </syntaxhighlight> | ||
If you have troubles with a specific version or compiler on Windows, you might want to allow failure in your build matrix until you get them fixed. For example to allow failure with ldc, you would add the following: | If you have troubles with a specific version or compiler on Windows, you might want to allow failure in your build matrix until you get them fixed. For example to allow failure with ldc, you would add the following: |
Revision as of 16:45, 6 May 2020
Continuously testing your project is ensures a conflict-free shipping. For all the listed Continuous Integration providers, you will need a free account to enable building.
Travis
Travis has built-in support for D and building your project with D is as easy as
adding to your .travis.yml
file, the compilers to be tested :
# latest dmd, gdc and ldc
d:
- dmd
- gdc
- ldc
You can also choose specific versions:
d:
- dmd-2.071.0
- ldc-1.0.0
A full list of supported compiler versions along with the corresponding DMD frontend versions is available at https://semitwist.com/travis-d-compilers.
Travis also offers OS X build environment, which you can enable by adding:
os:
- linux
- osx
More information is also available at Travis's documentation.
Testing 32-bit
All Travis containers use 64-bit, so if you want to test 32-bit is a bit tricky. One common trick is to use Travis build matrix feature to individually toggle extra builds as Mac OS X is x86-64 only since 10.7.
env:
- ARCH="x86_64"
matrix:
include:
- {os: linux, d: dmd-2.071.0, env: ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}}
- {os: linux, d: ldc-1.0.0, env: ARCH="x86", addons: {apt: {packages: [[gcc-multilib]]}}}
script:
- dub test --arch "$ARCH"
CircleCi
CircleCi doesn't support D out-of-the-box yet, but it is easy to install dmd
and
dub
with a single line in your `circle.yml`:
dependencies:
override:
- source "$(curl -fsS --retry 3 https://dlang.org/install.sh | bash -s dmd --activate)"
test:
override:
- dub test
AppVeyor (Windows)
Testing your project on Windows is currently a bit more complicated, but we are working on simplifying this integration. At the moment the best way to go is to extend your setup from this `appveyor.yml`:
platform: x64
environment:
matrix:
- DC: dmd
DVersion: stable
arch: x64
- DC: dmd
DVersion: stable
arch: x86
- DC: ldc
DVersion: stable
arch: x86
- DC: ldc
DVersion: stable
arch: x64
skip_tags: true
branches:
only:
- master
- stable
install:
- ps: function ResolveLatestDMD
{
$version = $env:DVersion;
if($version -eq "stable") {
$latest = (Invoke-WebRequest "http://downloads.dlang.org/releases/LATEST").toString();
$url = "http://downloads.dlang.org/releases/2.x/$($latest)/dmd.$($latest).windows.7z";
}elseif($version -eq "beta") {
$latest = (Invoke-WebRequest "http://downloads.dlang.org/pre-releases/LATEST").toString();
$latestVersion = $latest.split("-")[0].split("~")[0];
$url = "http://downloads.dlang.org/pre-releases/2.x/$($latestVersion)/dmd.$($latest).windows.7z";
}else {
$url = "http://downloads.dlang.org/releases/2.x/$($version)/dmd.$($version).windows.7z";
}
if($env:arch -eq "x64"){
$env:PATH += ";C:\dmd2\windows\bin64;";
}
$env:PATH += ";C:\dmd2\windows\bin;";
return $url;
}
- ps: function ResolveLatestLDC
{
$version = $env:DVersion;
$arch = $env:arch;
if($version -eq "stable") {
$latest = (Invoke-WebRequest "https://ldc-developers.github.io/LATEST").toString().replace("`n","").replace("`r","");
$url = "https://github.com/ldc-developers/ldc/releases/download/v$($latest)/ldc2-$($latest)-windows-$($arch).7z";
}elseif($version -eq "beta") {
$latest = (Invoke-WebRequest "https://ldc-developers.github.io/LATEST_BETA").toString().replace("`n","").replace("`r","");
$url = "https://github.com/ldc-developers/ldc/releases/download/v$($latest)/ldc2-$($latest)-windows-$($arch).7z";
} else {
$latest = $version;
$url = "https://github.com/ldc-developers/ldc/releases/download/v$($version)/ldc2-$($version)-windows-$($arch).7z";
}
$env:PATH += ";C:\ldc2-$($latest)-windows-$($arch)\bin";
$env:DC = "ldc2";
return $url;
}
- ps: function SetUpDCompiler
{
$env:toolchain = "msvc";
if($env:DC -eq "dmd"){
echo "downloading ...";
$url = ResolveLatestDMD;
echo $url;
Invoke-WebRequest $url -OutFile "c:\dmd.7z";
echo "finished.";
pushd c:\\;
7z x dmd.7z > $null;
popd;
}
elseif($env:DC -eq "ldc"){
echo "downloading ...";
$url = ResolveLatestLDC;
echo $url;
Invoke-WebRequest $url -OutFile "c:\ldc.zip";
echo "finished.";
pushd c:\\;
7z x ldc.zip > $null;
popd;
}
}
- ps: SetUpDCompiler
before_build:
- ps: if($env:arch -eq "x86"){
$env:compilersetupargs = "x86";
$env:Darch = "x86";
$env:DConf = "m32";
}elseif($env:arch -eq "x64"){
$env:compilersetupargs = "amd64";
$env:Darch = "x86_64";
$env:DConf = "m64";
}
- ps: $env:compilersetup = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall";
- '"%compilersetup%" %compilersetupargs%'
build_script:
- echo dummy build script - dont remove me
test_script:
- echo %PLATFORM%
- echo %Darch%
- echo %DC%
- echo %DMD%
- echo %PATH%
- dub --version
- '%DC% --help'
- dub test --arch=%Darch% --compiler=%DC%
Like in Travis, you can use a specify version, setting DVersion, and you can choose between the 32bit or 64bit compiler with arch :
matrix:
- DC: dmd
DVersion: 2.087.1
arch: x86
If you have troubles with a specific version or compiler on Windows, you might want to allow failure in your build matrix until you get them fixed. For example to allow failure with ldc, you would add the following:
matrix:
allow_failures:
- DC: ldc
For a up-to-date AppVeyor setup, you can also always head to AppVeyor-D, or DUB or Mir.
Gitlab CI
Gitlab own CI service requires to use a docker image to test D your project. See minimal example