Jekyll2024-03-11T18:02:51+00:00https://www.appveyor.com/AppVeyor#1 Continuous Delivery service for WindowsVisual Studio 2022 image is now available2021-11-10T00:00:00+00:002021-11-10T00:00:00+00:00https://www.appveyor.com/blog/2021/11/10/visual-studio-2022-image<p>A new <code class="highlighter-rouge">Visual Studio 2022</code> image with Visual Studio 2022 and .NET 6 RTM is now available to all AppVeyor accounts:</p>
<ul>
<li>The image is based on Windows Server 2019.</li>
<li>The <a href="https://www.appveyor.com/docs/windows-images-software/">software on the image</a> is mostly identical to the one installed on “Visual Studio 2019” image.</li>
<li>WiX toolset is not installed on the image (<a href="https://github.com/wixtoolset/issues/issues/6493">related issue</a>).</li>
<li>Visual Studio 2022 is now 64-bit with installation location at <code class="highlighter-rouge">C:\Program Files\Microsoft Visual Studio\2022\Community</code>.</li>
<li>Python 3.10 is now default in <code class="highlighter-rouge">PATH</code>.</li>
<li>Ruby 3.0 is now default in <code class="highlighter-rouge">PATH</code>.</li>
</ul>
<h2 id="new-and-updated-software">New and updated software</h2>
<ul>
<li>Visual Studio 2022 Community Edition</li>
<li>.NET Core 3.1.415, 5.0.403, 6.0.100</li>
<li>Git 2.33.1</li>
<li>Git LFS 3.0.2</li>
<li>JDK 16.0.1, JDK 17.0.1</li>
<li>PowerShell Core 7.2.0</li>
</ul>
<p>Give <code class="highlighter-rouge">Visual Studio 2022</code> image a try and let us know how it worked for you!</p>
<p>Best regards,<br />
AppVeyor team</p>{"twitter"=>"appveyor"}A new Visual Studio 2022 image with Visual Studio 2022 and .NET 6 RTM is now available to all AppVeyor accounts:Azure DevOps (VSTS) integration update2021-05-07T00:00:00+00:002021-05-07T00:00:00+00:00https://www.appveyor.com/blog/2021/05/07/azure-devops-vsts-integration-update<p>AppVeyor uses <a href="https://docs.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops">OAuth to access Azure DevOps</a> resources.
Azure DevOps removed obsolete authorization scopes from OAuth flow which broke the integration with AppVeyor. As a result some AppVeyor customers were unable to login with VSTS button or start new builds with VSTS repositories.</p>
<p>We deployed a fix and the customers should be able to re-authorize Azure DevOps on either “New project” or “Account > Authorization” pages. Unfortunately, we were unable to keep original OAuth app registration and had to create a new one, because scopes of existing app registration cannot be updated.</p>
<p>Best regards,<br />
AppVeyor team</p>
<p>Follow us on Twitter: <a href="https://twitter.com/appveyor">@appveyor</a></p>{"twitter"=>"appveyor"}AppVeyor uses OAuth to access Azure DevOps resources. Azure DevOps removed obsolete authorization scopes from OAuth flow which broke the integration with AppVeyor. As a result some AppVeyor customers were unable to login with VSTS button or start new builds with VSTS repositories.Artifacts retention policy update2021-03-30T00:00:00+00:002021-03-30T00:00:00+00:00https://www.appveyor.com/blog/2021/03/30/artifacts-retention-policy-update<p>To reduce AppVeyor hosting costs and eliminate any unnecessary waste of cloud resources back in 2018 we introduced artifacts retention policy.</p>
<p>The original policy was keeping paid account artifacts for 6 months and free account artifacts for 3 months. NuGet packages are kept intact.</p>
<p>Based on the feedback from our community we are changing artifacts retention period for paid accounts to 3 months and free accounts to 1 month. NuGet packages are kept intact.</p>
<p>This policy will take effect on April 5, 2021.</p>
<p>If you have custom requirements please let us know and we’ll discuss your needs.</p>
<p>Best regards,<br />
AppVeyor team</p>
<p>Follow us on Twitter: <a href="https://twitter.com/appveyor">@appveyor</a></p>{"twitter"=>"appveyor"}To reduce AppVeyor hosting costs and eliminate any unnecessary waste of cloud resources back in 2018 we introduced artifacts retention policy..NET 5 and .NET Core SDK version pinning2020-11-14T00:00:00+00:002020-11-14T00:00:00+00:00https://www.appveyor.com/blog/2020/11/14/dotnet-5-and-dotnet-core-sdk-version-pinning<p>With the <a href="/updates/2020/11/14/">recent update of Visual Studio 2019 image</a> .NET 5 is now part of Visual Studio 2019 16.8 installation. Despite there is no more “Core” in “.NET 5”, technically .NET 5 is the next <strong>major</strong> release of .NET Core.</p>
<p>If your project does not have <a href="https://docs.microsoft.com/en-us/dotnet/core/tools/global-json?tabs=netcore3x">global.json</a> then the latest .NET Core SDK is used which is now .NET 5. In theory, always using the latest version of .NET Core SDK should work, but if your build was broken or you are in the process of migrating to .NET 5 you may need to stick to a previous .NET Core SDK.</p>
<p>To build your projects with the latest .NET Core 3.1 add <code class="highlighter-rouge">global.json</code> to the root of project repository (or working folder from which <code class="highlighter-rouge">dotnet</code> or <code class="highlighter-rouge">msbuild</code> commands are run) with the following contents:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="s2">"sdk"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="s2">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"3.1.102"</span><span class="p">,</span><span class="w">
</span><span class="s2">"rollForward"</span><span class="p">:</span><span class="w"> </span><span class="s2">"latestFeature"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>And remember, there is <code class="highlighter-rouge">Previous Visual Studio 2019</code> image with Visual Studio 2019 version 16.7.6 and without .NET 5. You can use it in case of any issues with the current image:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">image</span><span class="pi">:</span> <span class="s">Previous Visual Studio 2019</span>
</code></pre></div></div>{"twitter"=>"appveyor"}With the recent update of Visual Studio 2019 image .NET 5 is now part of Visual Studio 2019 16.8 installation. Despite there is no more “Core” in “.NET 5”, technically .NET 5 is the next major release of .NET Core.Visual Studio 2019 Preview with .NET 5.02020-09-29T00:00:00+00:002020-09-29T00:00:00+00:00https://www.appveyor.com/blog/2020/09/29/visual-studio-2019-preview-net-5<p>.NET 5.0 has <a href="https://devblogs.microsoft.com/dotnet/announcing-net-5-0-rc-1/">reached “RC” stage</a> which means no more features will be added
and it’s time to start testing your projects with .NET 5.0!</p>
<p>To help you start with .NET 5.0 development, we’ve baked the <code class="highlighter-rouge">Visual Studio 2019 Preview</code> image with the latest Visual Studio 2019 Preview and .NET 5.0.<br />
In addition to VS 2019 Preview, it has the same software as on <a href="https://www.appveyor.com/docs/windows-images-software/">Visual Studio 2019 image</a>.</p>
<p>You can select <code class="highlighter-rouge">Visual Studio 2019 Preview</code> image in “Build worker image” dropdown on Environment tab of project settings (if project configured on UI) or configure in <code class="highlighter-rouge">appveyor.yml</code>:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">image</span><span class="pi">:</span> <span class="s">Visual Studio 2019 Preview</span>
</code></pre></div></div>
<p>Enjoy!</p>{"twitter"=>"appveyor"}.NET 5.0 has reached “RC” stage which means no more features will be added and it’s time to start testing your projects with .NET 5.0!Important AppVeyor Server 7.0.2915 update2020-08-18T00:00:00+00:002020-08-18T00:00:00+00:00https://www.appveyor.com/blog/2020/08/18/important-server-update<p>A vulnerability was found in self-hosted AppVeyor Server 7.0.2546 for Linux.</p>
<p>We encourage all users of self-hosted AppVeyor Server to <strong>upgrade their installations to the latest AppVeyor Server 7.0.2915 as soon as possible</strong>.</p>
<p><a href="https://www.appveyor.com/docs/server/maintenance/#upgrading-appveyor-server">Follow this guide</a> to upgrade your AppVeyor Server installation to the latest version. Before performing any upgrade please make sure to <a href="https://www.appveyor.com/docs/server/maintenance/#backuprestore-appveyor-server">backup your current installation of AppVeyor Server</a>!</p>
<p>Vulnerability details are scheduled to be published on <strong>August 25th</strong>.</p>
<p>Best regards,<br />
AppVeyor team</p>{"twitter"=>"appveyor"}A vulnerability was found in self-hosted AppVeyor Server 7.0.2546 for Linux.Global YAML - configure actions and variables for all projects2020-05-07T00:00:00+00:002020-05-07T00:00:00+00:00https://www.appveyor.com/blog/2020/05/07/global-yaml-configure-actions-and-variables-for-all-projects<p>AppVeyor customers have been asking about an ability to configure environment variables that are common for all projects under account. These could be a secure variable with SSH key for accessing the repo, a password for signing certificate or some other value you don’t want to include into every project’s <code class="highlighter-rouge">appveyor.yml</code>.</p>
<p>We’ve finally got a solution for that! Global YAML is a configuration in <a href="/docs/appveyor-yml">appveyor.yml</a> format which is “injected” into all projects under the account. It can be edited on <strong>Account → Global YAML</strong> page. The idea of using the same <code class="highlighter-rouge">appveyor.yml</code> syntax for global configuration worked so good and natural that it gone beyond just environment variables - you can “globalize” pretty much everything:</p>
<ul>
<li>Clone script overriding built-in cloning commands;</li>
<li>Environment variables, <code class="highlighter-rouge">/etc/hosts</code> and <code class="highlighter-rouge">cache</code> entries;</li>
<li><code class="highlighter-rouge">init</code>, <code class="highlighter-rouge">install</code> actions;</li>
<li>Before/after scripts for build, test and deploy phases;</li>
<li>Artifacts;</li>
<li>Deployment steps;</li>
<li>Notifications;</li>
<li>Build finalizers: <code class="highlighter-rouge">on_success</code>, <code class="highlighter-rouge">on_failure</code> and <code class="highlighter-rouge">on_finish</code>.</li>
</ul>
<p>Consider this global configuration for example:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">environment</span><span class="pi">:</span>
<span class="na">MY_SECRET_ACCOUNT</span><span class="pi">:</span>
<span class="na">secure</span><span class="pi">:</span> <span class="s">AAAAABBBBEEEEE22==</span>
<span class="na">MY_SECRET_KEY</span><span class="pi">:</span>
<span class="na">secure</span><span class="pi">:</span> <span class="s">AABBCC11==</span>
<span class="na">init</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">ps</span><span class="pi">:</span> <span class="s">gcim Win32_Processor | % { "$($_.NumberOfLogicalProcessors) logical CPUs" }</span>
<span class="pi">-</span> <span class="na">ps</span><span class="pi">:</span> <span class="s">gcim Win32_OperatingSystem | % { "$([int]($_.TotalVisibleMemorySize/1mb)) Gb" }</span>
<span class="na">notifications</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">provider</span><span class="pi">:</span> <span class="s">Slack</span>
<span class="na">incoming_webhook</span><span class="pi">:</span>
<span class="na">secure</span><span class="pi">:</span> <span class="s">AAABBB+CCC+DDD==</span>
<span class="na">channel</span><span class="pi">:</span> <span class="s1">'</span><span class="s">#ci'</span>
<span class="na">on_build_failure</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>
<p>The configuration above defines two secure variables <code class="highlighter-rouge">MY_SECRET_ACCOUNT</code> and <code class="highlighter-rouge">MY_SECRET_KEY</code> that will be available in all builds under your account, outputs VM configuration (you can display any instrumental data relevant to your projects) in the beginning of each build and, finally, sends notification to a Slack channel on every build’s failure.</p>
<p><a href="/docs/global-yml/">Read more</a> about what sections are supported and how they are merged into the projects.</p>
<p>Enjoy!</p>{"twitter"=>"appveyor"}AppVeyor customers have been asking about an ability to configure environment variables that are common for all projects under account. These could be a secure variable with SSH key for accessing the repo, a password for signing certificate or some other value you don’t want to include into every project’s appveyor.yml.Introducing job workflows - sequential flows, fan-in, fan-out and cancellable jobs2020-03-23T00:00:00+00:002020-03-23T00:00:00+00:00https://www.appveyor.com/blog/2020/03/23/job-workflows<p>AppVeyor can run <a href="/docs/build-configuration/#build-matrix">“matrix” builds</a> where you specify “dimensions” like <code class="highlighter-rouge">image</code>, <code class="highlighter-rouge">platform</code>, <code class="highlighter-rouge">configuration</code>, etc. and AppVeyor creates a build with multiple jobs testing all combinations of configured dimensions. All matrix build jobs are running in parallel (provided your account allows multiple concurrent jobs).</p>
<p>However, there could be more advanced CI/CD workflow requirements that cannot be implemented in a single build job or parallel matrix, for example:</p>
<ul>
<li>Building the project/tests once and then run multiple tests in parallel for the same build output;</li>
<li>Deploy once all tests running in parallel are finished;</li>
<li>Deploy to staging, run tests on staging, deploy to production, run tests on production.</li>
</ul>
<p>AppVeyor allows to configure explicit jobs and their groups with dependencies between them which enables developer to run build jobs in <strong>sequence</strong>, implement <strong>fan-out/fan-in</strong> pipelines and spawn independent <strong>cancellable</strong> jobs.</p>
<p class="text-center">
<img src="/assets/img/docs/workflows/example-workflow.png" alt="Example workflow" width="922" height="252" />
</p>
<h2 id="configuring-job-workflows">Configuring job workflows</h2>
<p>A general template for defining job workflows in <code class="highlighter-rouge">appveyor.yml</code>:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Job definitions, sections in [] are optional</span>
<span class="na">environment</span><span class="pi">:</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s"><job name 1></span>
<span class="pi">[</span><span class="nv">- job_group</span><span class="pi">:</span> <span class="nv"><group name></span><span class="pi">]</span>
<span class="pi">[</span><span class="nv">- jobs_per_group</span><span class="pi">:</span> <span class="nv">N</span><span class="pi">]</span>
<span class="pi">[</span><span class="nv">- job_depends_on</span><span class="pi">:</span> <span class="nv"><job or group name></span><span class="pi">]</span>
<span class="pi">[</span><span class="nv">- job_allow_cancellation</span><span class="pi">:</span> <span class="nv">true</span><span class="pi">]</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s"><job name 2></span>
<span class="pi">[</span><span class="nv">- job_group</span><span class="pi">:</span> <span class="nv"><group name></span><span class="pi">]</span>
<span class="pi">[</span><span class="nv">- jobs_per_group</span><span class="pi">:</span> <span class="nv">N</span><span class="pi">]</span>
<span class="pi">[</span><span class="nv">- job_depends_on</span><span class="pi">:</span> <span class="nv"><job or group name></span><span class="pi">]</span>
<span class="pi">[</span><span class="nv">- job_allow_cancellation</span><span class="pi">:</span> <span class="nv">true</span><span class="pi">]</span>
<span class="s">...</span>
<span class="c1"># the first failed job cancels other jobs and fails entire build</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="na">fast_finish</span><span class="pi">:</span> <span class="no">true</span>
<span class="c1"># configuration common for all jobs</span>
<span class="na">init</span><span class="pi">:</span>
<span class="pi">-</span> <span class="s">appveyor version</span>
<span class="pi">-</span> <span class="s">echo Some common logic here...</span>
<span class="c1"># job-specific configurations</span>
<span class="na">for</span><span class="pi">:</span>
<span class="pi">-</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="na">only</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s"><job name 1></span>
<span class="pi">[</span><span class="nv">- job_group</span><span class="pi">:</span> <span class="nv"><job name 1></span><span class="pi">]</span> <span class="c1"># optionally, you can define the configuration for the entire group</span>
<span class="na">build_script</span><span class="pi">:</span>
<span class="pi">-</span> <span class="s">echo Job 1</span>
<span class="pi">-</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="na">only</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s"><job name 2></span>
<span class="na">build_script</span><span class="pi">:</span>
<span class="pi">-</span> <span class="s">echo Job 2</span>
<span class="s">...</span>
</code></pre></div></div>
<p>The following example creates a build with 2 jobs building solution in parallel on Windows and Linux images:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">environment</span><span class="pi">:</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Windows build</span>
<span class="na">appveyor_build_worker_image</span><span class="pi">:</span> <span class="s">Visual Studio 2019</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Linux build</span>
<span class="na">appveyor_build_worker_image</span><span class="pi">:</span> <span class="s">Ubuntu</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="na">fast_finish</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">init</span><span class="pi">:</span>
<span class="pi">-</span> <span class="s">appveyor version</span>
<span class="c1"># job-specific configurations</span>
<span class="na">for</span><span class="pi">:</span>
<span class="pi">-</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="na">only</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Windows build</span>
<span class="na">build_script</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">cmd</span><span class="pi">:</span> <span class="s">echo This is Windows-specific build script</span>
<span class="pi">-</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="na">only</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Linux build</span>
<span class="na">build_script</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">sh</span><span class="pi">:</span> <span class="s">echo This is Linux-specific build script</span>
</code></pre></div></div>
<h2 id="sequential-flow">Sequential flow</h2>
<p>Build can be configured to run jobs one-by-one, for example build solution, deploy to staging, run tests on staging, deploy to production, run tests on production.</p>
<p class="text-center">
<img src="/assets/img/docs/workflows/sequential-flow.png" alt="Sequential flow" width="162" height="272" />
</p>
<p>We use <code class="highlighter-rouge">job_depends_on</code> to implement sequential flow:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">environment</span><span class="pi">:</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Job A</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Job B</span>
<span class="na">job_depends_on</span><span class="pi">:</span> <span class="s">Job A</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Job C</span>
<span class="na">job_depends_on</span><span class="pi">:</span> <span class="s">Job B</span>
<span class="nn">...</span>
</code></pre></div></div>
<h2 id="fan-in-fan-out">Fan-in, fan-out</h2>
<p>Fan-out flow is when multiple jobs are spawned in parallel once a single job or a group is completed. Fan-in flow is when a single job or a group waits for a muliple jobs to complete:</p>
<p class="text-center">
<img src="/assets/img/docs/workflows/fan-in-fan-out-groups.png" alt="Fan-in, fan-out flows" width="462" height="322" />
</p>
<p>The is <code class="highlighter-rouge">appveyor.yml</code> for the scenario presented on the figure above:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">environment</span><span class="pi">:</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Build</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Tests A</span>
<span class="na">job_group</span><span class="pi">:</span> <span class="s">Tests</span>
<span class="na">job_depends_on</span><span class="pi">:</span> <span class="s">Build</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Tests B</span>
<span class="na">job_group</span><span class="pi">:</span> <span class="s">Tests</span>
<span class="na">job_depends_on</span><span class="pi">:</span> <span class="s">Build</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Tests C</span>
<span class="na">job_group</span><span class="pi">:</span> <span class="s">Tests</span>
<span class="na">job_depends_on</span><span class="pi">:</span> <span class="s">Build</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Deploy</span>
<span class="na">job_depends_on</span><span class="pi">:</span> <span class="s">Tests</span>
<span class="nn">...</span>
</code></pre></div></div>
<h2 id="cancellable-jobs">Cancellable jobs</h2>
<p>You can have jobs which are automatically cancelled when the entire build is complete (succeded or failed - doesn’t matter). These jobs could be some sort of “monitors” or services/dependencies (such as container with Redis or database) in Docker builds.</p>
<p class="text-center">
<img src="/assets/img/docs/workflows/cancellable-jobs.png" alt="Cancellable jobs" width="322" height="192" />
</p>
<p>An example of cancellable job doing some work in a loop while the build is working:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">environment</span><span class="pi">:</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Main work</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Monitor</span>
<span class="na">job_allow_cancellation</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">for</span><span class="pi">:</span>
<span class="pi">-</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="na">only</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Main work</span>
<span class="na">build_script</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">cmd</span><span class="pi">:</span> <span class="s">echo This is the main job</span>
<span class="pi">-</span>
<span class="na">matrix</span><span class="pi">:</span>
<span class="na">only</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">job_name</span><span class="pi">:</span> <span class="s">Monitor</span>
<span class="na">build_script</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">ps</span><span class="pi">:</span> <span class="s">while($true) { Write-Host 'Do some checks'; Start-Sleep -s 1; }</span>
</code></pre></div></div>{"twitter"=>"appveyor"}AppVeyor can run “matrix” builds where you specify “dimensions” like image, platform, configuration, etc. and AppVeyor creates a build with multiple jobs testing all combinations of configured dimensions. All matrix build jobs are running in parallel (provided your account allows multiple concurrent jobs).Customizable build images and faster builds with AppVeyor2020-02-06T00:00:00+00:002020-02-06T00:00:00+00:00https://www.appveyor.com/blog/2020/02/06/customizable-build-images-and-faster-builds-with-appveyor<p>Hosted CI/CD service is all about the right software provided on the base images. We are continuously working on upgrading images with the latest software releases and security updates making sure you are on the cutting edge of technology. It works great for most of the teams, but not for all.</p>
<p>If you had ever found the images are updated too fast or too slow or you need some specific software on them, now we’ve got a solution for you!</p>
<h2 id="customizable-images">Customizable images</h2>
<p>With customizable images you can install your own software and build dependencies on top of AppVeyor-provided base images (Windows, Linux) and then use the resulting image for further builds.</p>
<p>Custom images enable new use cases that were not possible before in a hosted CI/CD:</p>
<ul>
<li>update image software at your own pace - pin specific versions or be on a cutting edge;</li>
<li>speed up builds drastically by preserving VM state between builds - next-gen build cache;</li>
<li>securely store certificates and other secrets within the image;</li>
<li>migrate on-premise CI workflows with proprietary, licensed, manually-installed, legacy software to a hosted CI.</li>
</ul>
<p><a href="/docs/custom-build-images/">Check this guide</a> to see how easy it is to build your custom image!</p>
<h2 id="faster-builds">Faster builds</h2>
<p>Not only customizable images can speed up your builds. You can now run your builds in a personalized cloud environment with more powerful VMs than in our own in-house cloud.</p>
<p>Out tests show that by using “Medium” instances on Google Cloud you can get 2-3 times faster builds!</p>
<p><a href="https://ci.appveyor.com/pricing">Request your trial for custom images and faster VMs now</a>.</p>
<p>Best regards,<br />
AppVeyor team</p>{"twitter"=>"appveyor"}Hosted CI/CD service is all about the right software provided on the base images. We are continuously working on upgrading images with the latest software releases and security updates making sure you are on the cutting edge of technology. It works great for most of the teams, but not for all.Build macOS projects with AppVeyor2019-11-20T00:00:00+00:002019-11-20T00:00:00+00:00https://www.appveyor.com/blog/2019/11/20/build-macos-projects-with-appveyor<p>Today we are adding macOS to our hosted CI/CD environment. Now you can consolidate all your multi-platform projects and run Windows, Linux and macOS builds with AppVeyor.</p>
<p>As with our Windows and Linux environments, we are committed to provide you with the most recent software and complete toolset for macOS. You can choose from two macOS images:</p>
<ul>
<li><code class="highlighter-rouge">macos</code> - macOS 10.15 “Catalina”</li>
<li><code class="highlighter-rouge">macos-mojave</code> - macOS 10.14 “Mojave”</li>
</ul>
<p>Both images have the latest XCode 11.2.1 pre-installed, all the latest versions of Node.js, Go, Java, .NET Core, Ruby, Python and compilers. You can find the full list of pre-installed software on <a href="/docs/macos-images-software/">this page</a>.</p>
<p>macOS builds are available to everyone by request - <a href="mailto:team@appveyor.com?subject=macOS%20builds">send us an email</a>.</p>
<p>Best regards,<br />
AppVeyor team</p>{"twitter"=>"appveyor"}Today we are adding macOS to our hosted CI/CD environment. Now you can consolidate all your multi-platform projects and run Windows, Linux and macOS builds with AppVeyor.