{"generator":"Jekyll","link":[{"@attributes":{"href":"https:\/\/www.appveyor.com\/feed.xml","rel":"self","type":"application\/atom+xml"}},{"@attributes":{"href":"https:\/\/www.appveyor.com\/","rel":"alternate","type":"text\/html","hreflang":"en"}}],"updated":"2026-02-19T19:47:46+00:00","id":"https:\/\/www.appveyor.com\/","title":"AppVeyor","subtitle":"#1 Continuous Delivery service for Windows","entry":[{"title":"Visual Studio 2022 image is now available","link":{"@attributes":{"href":"https:\/\/www.appveyor.com\/blog\/2021\/11\/10\/visual-studio-2022-image\/","rel":"alternate","type":"text\/html","title":"Visual Studio 2022 image is now available"}},"published":"2021-11-10T00:00:00+00:00","updated":"2021-11-10T00:00:00+00:00","id":"https:\/\/www.appveyor.com\/blog\/2021\/11\/10\/visual-studio-2022-image","content":"<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>\n\n<ul>\n  <li>The image is based on Windows Server 2019.<\/li>\n  <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 \u201cVisual Studio 2019\u201d image.<\/li>\n  <li>WiX toolset is not installed on the image (<a href=\"https:\/\/github.com\/wixtoolset\/issues\/issues\/6493\">related issue<\/a>).<\/li>\n  <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>\n  <li>Python 3.10 is now default in <code class=\"highlighter-rouge\">PATH<\/code>.<\/li>\n  <li>Ruby 3.0 is now default in <code class=\"highlighter-rouge\">PATH<\/code>.<\/li>\n<\/ul>\n\n<h2 id=\"new-and-updated-software\">New and updated software<\/h2>\n\n<ul>\n  <li>Visual Studio 2022 Community Edition<\/li>\n  <li>.NET Core 3.1.415, 5.0.403, 6.0.100<\/li>\n  <li>Git 2.33.1<\/li>\n  <li>Git LFS 3.0.2<\/li>\n  <li>JDK 16.0.1, JDK 17.0.1<\/li>\n  <li>PowerShell Core 7.2.0<\/li>\n<\/ul>\n\n<p>Give <code class=\"highlighter-rouge\">Visual Studio 2022<\/code> image a try and let us know how it worked for you!<\/p>\n\n<p>Best regards,<br \/>\nAppVeyor team<\/p>","author":{"name":"{\"twitter\"=>\"appveyor\"}"},"summary":"A new Visual Studio 2022 image with Visual Studio 2022 and .NET 6 RTM is now available to all AppVeyor accounts:"},{"title":"Azure DevOps (VSTS) integration update","link":{"@attributes":{"href":"https:\/\/www.appveyor.com\/blog\/2021\/05\/07\/azure-devops-vsts-integration-update\/","rel":"alternate","type":"text\/html","title":"Azure DevOps (VSTS) integration update"}},"published":"2021-05-07T00:00:00+00:00","updated":"2021-05-07T00:00:00+00:00","id":"https:\/\/www.appveyor.com\/blog\/2021\/05\/07\/azure-devops-vsts-integration-update","content":"<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.\nAzure 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>\n\n<p>We deployed a fix and the customers should be able to re-authorize Azure DevOps on either \u201cNew project\u201d or \u201cAccount &gt; Authorization\u201d 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>\n\n<p>Best regards,<br \/>\nAppVeyor team<\/p>\n\n<p>Follow us on Twitter: <a href=\"https:\/\/twitter.com\/appveyor\">@appveyor<\/a><\/p>","author":{"name":"{\"twitter\"=>\"appveyor\"}"},"summary":"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."},{"title":"Artifacts retention policy update","link":{"@attributes":{"href":"https:\/\/www.appveyor.com\/blog\/2021\/03\/30\/artifacts-retention-policy-update\/","rel":"alternate","type":"text\/html","title":"Artifacts retention policy update"}},"published":"2021-03-30T00:00:00+00:00","updated":"2021-03-30T00:00:00+00:00","id":"https:\/\/www.appveyor.com\/blog\/2021\/03\/30\/artifacts-retention-policy-update","content":"<p>To reduce AppVeyor hosting costs and eliminate any unnecessary waste of cloud resources back in 2018 we introduced artifacts retention policy.<\/p>\n\n<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>\n\n<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>\n\n<p>This policy will take effect on April 5, 2021.<\/p>\n\n<p>If you have custom requirements please let us know and we\u2019ll discuss your needs.<\/p>\n\n<p>Best regards,<br \/>\nAppVeyor team<\/p>\n\n<p>Follow us on Twitter: <a href=\"https:\/\/twitter.com\/appveyor\">@appveyor<\/a><\/p>","author":{"name":"{\"twitter\"=>\"appveyor\"}"},"summary":"To reduce AppVeyor hosting costs and eliminate any unnecessary waste of cloud resources back in 2018 we introduced artifacts retention policy."},{"title":".NET 5 and .NET Core SDK version pinning","link":{"@attributes":{"href":"https:\/\/www.appveyor.com\/blog\/2020\/11\/14\/dotnet-5-and-dotnet-core-sdk-version-pinning\/","rel":"alternate","type":"text\/html","title":".NET 5 and .NET Core SDK version pinning"}},"published":"2020-11-14T00:00:00+00:00","updated":"2020-11-14T00:00:00+00:00","id":"https:\/\/www.appveyor.com\/blog\/2020\/11\/14\/dotnet-5-and-dotnet-core-sdk-version-pinning","content":"<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 \u201cCore\u201d in \u201c.NET 5\u201d, technically .NET 5 is the next <strong>major<\/strong> release of .NET Core.<\/p>\n\n<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>\n\n<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>\n\n<div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"s2\">\"sdk\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n    <\/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\">\n    <\/span><span class=\"s2\">\"rollForward\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"latestFeature\"<\/span><span class=\"w\">\n  <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre><\/div><\/div>\n\n<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>\n\n<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>\n<\/code><\/pre><\/div><\/div>","author":{"name":"{\"twitter\"=>\"appveyor\"}"},"summary":"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 \u201cCore\u201d in \u201c.NET 5\u201d, technically .NET 5 is the next major release of .NET Core."},{"title":"Visual Studio 2019 Preview with .NET 5.0","link":{"@attributes":{"href":"https:\/\/www.appveyor.com\/blog\/2020\/09\/29\/visual-studio-2019-preview-net-5\/","rel":"alternate","type":"text\/html","title":"Visual Studio 2019 Preview with .NET 5.0"}},"published":"2020-09-29T00:00:00+00:00","updated":"2020-09-29T00:00:00+00:00","id":"https:\/\/www.appveyor.com\/blog\/2020\/09\/29\/visual-studio-2019-preview-net-5","content":"<p>.NET 5.0 has <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/announcing-net-5-0-rc-1\/\">reached \u201cRC\u201d stage<\/a> which means no more features will be added\nand it\u2019s time to start testing your projects with .NET 5.0!<\/p>\n\n<p>To help you start with .NET 5.0 development, we\u2019ve baked the <code class=\"highlighter-rouge\">Visual Studio 2019 Preview<\/code> image with the latest Visual Studio 2019 Preview and .NET 5.0.<br \/>\nIn 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>\n\n<p>You can select <code class=\"highlighter-rouge\">Visual Studio 2019 Preview<\/code> image in \u201cBuild worker image\u201d dropdown on Environment tab of project settings (if project configured on UI) or configure in <code class=\"highlighter-rouge\">appveyor.yml<\/code>:<\/p>\n\n<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>\n<\/code><\/pre><\/div><\/div>\n\n<p>Enjoy!<\/p>","author":{"name":"{\"twitter\"=>\"appveyor\"}"},"summary":".NET 5.0 has reached \u201cRC\u201d stage which means no more features will be added and it\u2019s time to start testing your projects with .NET 5.0!"},{"title":"Important AppVeyor Server 7.0.2915 update","link":{"@attributes":{"href":"https:\/\/www.appveyor.com\/blog\/2020\/08\/18\/important-server-update\/","rel":"alternate","type":"text\/html","title":"Important AppVeyor Server 7.0.2915 update"}},"published":"2020-08-18T00:00:00+00:00","updated":"2020-08-18T00:00:00+00:00","id":"https:\/\/www.appveyor.com\/blog\/2020\/08\/18\/important-server-update","content":"<p>A vulnerability was found in self-hosted AppVeyor Server 7.0.2546 for Linux.<\/p>\n\n<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>\n\n<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>\n\n<p>Vulnerability details are scheduled to be published on <strong>August 25th<\/strong>.<\/p>\n\n<p>Best regards,<br \/>\nAppVeyor team<\/p>","author":{"name":"{\"twitter\"=>\"appveyor\"}"},"summary":"A vulnerability was found in self-hosted AppVeyor Server 7.0.2546 for Linux."},{"title":"Global YAML - configure actions and variables for all projects","link":{"@attributes":{"href":"https:\/\/www.appveyor.com\/blog\/2020\/05\/07\/global-yaml-configure-actions-and-variables-for-all-projects\/","rel":"alternate","type":"text\/html","title":"Global YAML - configure actions and variables for all projects"}},"published":"2020-05-07T00:00:00+00:00","updated":"2020-05-07T00:00:00+00:00","id":"https:\/\/www.appveyor.com\/blog\/2020\/05\/07\/global-yaml-configure-actions-and-variables-for-all-projects","content":"<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\u2019t want to include into every project\u2019s <code class=\"highlighter-rouge\">appveyor.yml<\/code>.<\/p>\n\n<p>We\u2019ve finally got a solution for that! Global YAML is a configuration in <a href=\"\/docs\/appveyor-yml\">appveyor.yml<\/a> format which is \u201cinjected\u201d into all projects under the account. It can be edited on <strong>Account \u2192 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 \u201cglobalize\u201d pretty much everything:<\/p>\n\n<ul>\n  <li>Clone script overriding built-in cloning commands;<\/li>\n  <li>Environment variables, <code class=\"highlighter-rouge\">\/etc\/hosts<\/code> and <code class=\"highlighter-rouge\">cache<\/code> entries;<\/li>\n  <li><code class=\"highlighter-rouge\">init<\/code>, <code class=\"highlighter-rouge\">install<\/code> actions;<\/li>\n  <li>Before\/after scripts for build, test and deploy phases;<\/li>\n  <li>Artifacts;<\/li>\n  <li>Deployment steps;<\/li>\n  <li>Notifications;<\/li>\n  <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>\n<\/ul>\n\n<p>Consider this global configuration for example:<\/p>\n\n<div class=\"language-yaml highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">MY_SECRET_ACCOUNT<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">secure<\/span><span class=\"pi\">:<\/span> <span class=\"s\">AAAAABBBBEEEEE22==<\/span>\n  <span class=\"na\">MY_SECRET_KEY<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">secure<\/span><span class=\"pi\">:<\/span> <span class=\"s\">AABBCC11==<\/span>\n\n<span class=\"na\">init<\/span><span class=\"pi\">:<\/span>\n<span class=\"pi\">-<\/span> <span class=\"na\">ps<\/span><span class=\"pi\">:<\/span> <span class=\"s\">gcim Win32_Processor | % { \"$($_.NumberOfLogicalProcessors) logical CPUs\" }<\/span>\n<span class=\"pi\">-<\/span> <span class=\"na\">ps<\/span><span class=\"pi\">:<\/span> <span class=\"s\">gcim Win32_OperatingSystem | % { \"$([int]($_.TotalVisibleMemorySize\/1mb)) Gb\" }<\/span>\n\n<span class=\"na\">notifications<\/span><span class=\"pi\">:<\/span>\n<span class=\"pi\">-<\/span> <span class=\"na\">provider<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Slack<\/span>\n  <span class=\"na\">incoming_webhook<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">secure<\/span><span class=\"pi\">:<\/span> <span class=\"s\">AAABBB+CCC+DDD==<\/span>\n  <span class=\"na\">channel<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">#ci'<\/span>\n  <span class=\"na\">on_build_failure<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<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\u2019s failure.<\/p>\n\n<p><a href=\"\/docs\/global-yml\/\">Read more<\/a> about what sections are supported and how they are merged into the projects.<\/p>\n\n<p>Enjoy!<\/p>","author":{"name":"{\"twitter\"=>\"appveyor\"}"},"summary":"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\u2019t want to include into every project\u2019s appveyor.yml."},{"title":"Introducing job workflows - sequential flows, fan-in, fan-out and cancellable jobs","link":{"@attributes":{"href":"https:\/\/www.appveyor.com\/blog\/2020\/03\/23\/job-workflows\/","rel":"alternate","type":"text\/html","title":"Introducing job workflows - sequential flows, fan-in, fan-out and cancellable jobs"}},"published":"2020-03-23T00:00:00+00:00","updated":"2020-03-23T00:00:00+00:00","id":"https:\/\/www.appveyor.com\/blog\/2020\/03\/23\/job-workflows","content":"<p>AppVeyor can run <a href=\"\/docs\/build-configuration\/#build-matrix\">\u201cmatrix\u201d builds<\/a> where you specify \u201cdimensions\u201d 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>\n\n<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>\n\n<ul>\n  <li>Building the project\/tests once and then run multiple tests in parallel for the same build output;<\/li>\n  <li>Deploy once all tests running in parallel are finished;<\/li>\n  <li>Deploy to staging, run tests on staging, deploy to production, run tests on production.<\/li>\n<\/ul>\n\n<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>\n\n<p class=\"text-center\">\n    <img src=\"\/assets\/img\/docs\/workflows\/example-workflow.png\" alt=\"Example workflow\" width=\"922\" height=\"252\" \/>\n<\/p>\n\n<h2 id=\"configuring-job-workflows\">Configuring job workflows<\/h2>\n\n<p>A general template for defining job workflows in <code class=\"highlighter-rouge\">appveyor.yml<\/code>:<\/p>\n\n<div class=\"language-yaml highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Job definitions, sections in [] are optional<\/span>\n<span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">&lt;job name 1&gt;<\/span>\n  <span class=\"pi\">[<\/span><span class=\"nv\">- job_group<\/span><span class=\"pi\">:<\/span> <span class=\"nv\">&lt;group name&gt;<\/span><span class=\"pi\">]<\/span>\n  <span class=\"pi\">[<\/span><span class=\"nv\">- jobs_per_group<\/span><span class=\"pi\">:<\/span> <span class=\"nv\">N<\/span><span class=\"pi\">]<\/span>\n  <span class=\"pi\">[<\/span><span class=\"nv\">- job_depends_on<\/span><span class=\"pi\">:<\/span> <span class=\"nv\">&lt;job or group name&gt;<\/span><span class=\"pi\">]<\/span>\n  <span class=\"pi\">[<\/span><span class=\"nv\">- job_allow_cancellation<\/span><span class=\"pi\">:<\/span> <span class=\"nv\">true<\/span><span class=\"pi\">]<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">&lt;job name 2&gt;<\/span>\n  <span class=\"pi\">[<\/span><span class=\"nv\">- job_group<\/span><span class=\"pi\">:<\/span> <span class=\"nv\">&lt;group name&gt;<\/span><span class=\"pi\">]<\/span>\n  <span class=\"pi\">[<\/span><span class=\"nv\">- jobs_per_group<\/span><span class=\"pi\">:<\/span> <span class=\"nv\">N<\/span><span class=\"pi\">]<\/span>\n  <span class=\"pi\">[<\/span><span class=\"nv\">- job_depends_on<\/span><span class=\"pi\">:<\/span> <span class=\"nv\">&lt;job or group name&gt;<\/span><span class=\"pi\">]<\/span>\n  <span class=\"pi\">[<\/span><span class=\"nv\">- job_allow_cancellation<\/span><span class=\"pi\">:<\/span> <span class=\"nv\">true<\/span><span class=\"pi\">]<\/span>\n\n  <span class=\"s\">...<\/span>\n\n<span class=\"c1\"># the first failed job cancels other jobs and fails entire build<\/span>\n<span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">fast_finish<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\n\n<span class=\"c1\"># configuration common for all jobs<\/span>\n<span class=\"na\">init<\/span><span class=\"pi\">:<\/span>\n  <span class=\"pi\">-<\/span> <span class=\"s\">appveyor version<\/span>\n  <span class=\"pi\">-<\/span> <span class=\"s\">echo Some common logic here...<\/span>\n\n<span class=\"c1\"># job-specific configurations<\/span>\n<span class=\"na\">for<\/span><span class=\"pi\">:<\/span>\n\n  <span class=\"pi\">-<\/span>\n    <span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">only<\/span><span class=\"pi\">:<\/span>\n        <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">&lt;job name 1&gt;<\/span>\n        <span class=\"pi\">[<\/span><span class=\"nv\">- job_group<\/span><span class=\"pi\">:<\/span> <span class=\"nv\">&lt;job name 1&gt;<\/span><span class=\"pi\">]<\/span> <span class=\"c1\"># optionally, you can define the configuration for the entire group<\/span>\n\n    <span class=\"na\">build_script<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"s\">echo Job 1<\/span>\n\n  <span class=\"pi\">-<\/span>\n    <span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">only<\/span><span class=\"pi\">:<\/span>\n        <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">&lt;job name 2&gt;<\/span>\n\n    <span class=\"na\">build_script<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"s\">echo Job 2<\/span>\n\n  <span class=\"s\">...<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<p>The following example creates a build with 2 jobs building solution in parallel on Windows and Linux images:<\/p>\n\n<div class=\"language-yaml highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Windows build<\/span>\n    <span class=\"na\">appveyor_build_worker_image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Visual Studio 2019<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Linux build<\/span>\n    <span class=\"na\">appveyor_build_worker_image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Ubuntu<\/span>\n\n<span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">fast_finish<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\n\n<span class=\"na\">init<\/span><span class=\"pi\">:<\/span>\n  <span class=\"pi\">-<\/span> <span class=\"s\">appveyor version<\/span>\n\n<span class=\"c1\"># job-specific configurations<\/span>\n<span class=\"na\">for<\/span><span class=\"pi\">:<\/span>\n\n  <span class=\"pi\">-<\/span>\n    <span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">only<\/span><span class=\"pi\">:<\/span>\n        <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Windows build<\/span>\n\n    <span class=\"na\">build_script<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">cmd<\/span><span class=\"pi\">:<\/span> <span class=\"s\">echo This is Windows-specific build script<\/span>\n\n  <span class=\"pi\">-<\/span>\n    <span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">only<\/span><span class=\"pi\">:<\/span>\n        <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Linux build<\/span>\n\n    <span class=\"na\">build_script<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">sh<\/span><span class=\"pi\">:<\/span> <span class=\"s\">echo This is Linux-specific build script<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"sequential-flow\">Sequential flow<\/h2>\n\n<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>\n\n<p class=\"text-center\">\n    <img src=\"\/assets\/img\/docs\/workflows\/sequential-flow.png\" alt=\"Sequential flow\" width=\"162\" height=\"272\" \/>\n<\/p>\n\n<p>We use <code class=\"highlighter-rouge\">job_depends_on<\/code> to implement sequential flow:<\/p>\n\n<div class=\"language-yaml highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Job A<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Job B<\/span>\n    <span class=\"na\">job_depends_on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Job A<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Job C<\/span>\n    <span class=\"na\">job_depends_on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Job B<\/span>\n\n<span class=\"nn\">...<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"fan-in-fan-out\">Fan-in, fan-out<\/h2>\n\n<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 multiple jobs to complete:<\/p>\n\n<p class=\"text-center\">\n    <img src=\"\/assets\/img\/docs\/workflows\/fan-in-fan-out-groups.png\" alt=\"Fan-in, fan-out flows\" width=\"462\" height=\"322\" \/>\n<\/p>\n\n<p>The is <code class=\"highlighter-rouge\">appveyor.yml<\/code> for the scenario presented on the figure above:<\/p>\n\n<div class=\"language-yaml highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Tests A<\/span>\n    <span class=\"na\">job_group<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Tests<\/span>\n    <span class=\"na\">job_depends_on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Tests B<\/span>\n    <span class=\"na\">job_group<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Tests<\/span>\n    <span class=\"na\">job_depends_on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Tests C<\/span>\n    <span class=\"na\">job_group<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Tests<\/span>\n    <span class=\"na\">job_depends_on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy<\/span>\n    <span class=\"na\">job_depends_on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Tests<\/span>\n\n<span class=\"nn\">...<\/span>\n<\/code><\/pre><\/div><\/div>\n\n<h2 id=\"cancellable-jobs\">Cancellable jobs<\/h2>\n\n<p>You can have jobs which are automatically cancelled when the entire build is complete (succeeded or failed - doesn\u2019t matter). These jobs could be some sort of \u201cmonitors\u201d or services\/dependencies (such as container with Redis or database) in Docker builds.<\/p>\n\n<p class=\"text-center\">\n    <img src=\"\/assets\/img\/docs\/workflows\/cancellable-jobs.png\" alt=\"Cancellable jobs\" width=\"322\" height=\"192\" \/>\n<\/p>\n\n<p>An example of cancellable job doing some work in a loop while the build is working:<\/p>\n\n<div class=\"language-yaml highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"na\">environment<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Main work<\/span>\n\n  <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Monitor<\/span>\n    <span class=\"na\">job_allow_cancellation<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\n\n<span class=\"na\">for<\/span><span class=\"pi\">:<\/span>\n\n  <span class=\"pi\">-<\/span>\n    <span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">only<\/span><span class=\"pi\">:<\/span>\n        <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Main work<\/span>\n\n    <span class=\"na\">build_script<\/span><span class=\"pi\">:<\/span>\n    <span class=\"pi\">-<\/span> <span class=\"na\">cmd<\/span><span class=\"pi\">:<\/span> <span class=\"s\">echo This is the main job<\/span>\n\n  <span class=\"pi\">-<\/span>\n    <span class=\"na\">matrix<\/span><span class=\"pi\">:<\/span>\n      <span class=\"na\">only<\/span><span class=\"pi\">:<\/span>\n        <span class=\"pi\">-<\/span> <span class=\"na\">job_name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Monitor<\/span>\n\n    <span class=\"na\">build_script<\/span><span class=\"pi\">:<\/span>\n    <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>\n<\/code><\/pre><\/div><\/div>","author":{"name":"{\"twitter\"=>\"appveyor\"}"},"summary":"AppVeyor can run \u201cmatrix\u201d builds where you specify \u201cdimensions\u201d 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)."},{"title":"Customizable build images and faster builds with AppVeyor","link":{"@attributes":{"href":"https:\/\/www.appveyor.com\/blog\/2020\/02\/06\/customizable-build-images-and-faster-builds-with-appveyor\/","rel":"alternate","type":"text\/html","title":"Customizable build images and faster builds with AppVeyor"}},"published":"2020-02-06T00:00:00+00:00","updated":"2020-02-06T00:00:00+00:00","id":"https:\/\/www.appveyor.com\/blog\/2020\/02\/06\/customizable-build-images-and-faster-builds-with-appveyor","content":"<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>\n\n<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\u2019ve got a solution for you!<\/p>\n\n<h2 id=\"customizable-images\">Customizable images<\/h2>\n\n<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>\n\n<p>Custom images enable new use cases that were not possible before in a hosted CI\/CD:<\/p>\n\n<ul>\n  <li>update image software at your own pace - pin specific versions or be on a cutting edge;<\/li>\n  <li>speed up builds drastically by preserving VM state between builds - next-gen build cache;<\/li>\n  <li>securely store certificates and other secrets within the image;<\/li>\n  <li>migrate on-premise CI workflows with proprietary, licensed, manually-installed, legacy software to a hosted CI.<\/li>\n<\/ul>\n\n<p><a href=\"\/docs\/custom-build-images\/\">Check this guide<\/a> to see how easy it is to build your custom image!<\/p>\n\n<h2 id=\"faster-builds\">Faster builds<\/h2>\n\n<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>\n\n<p>Out tests show that by using \u201cMedium\u201d instances on Google Cloud you can get 2-3 times faster builds!<\/p>\n\n<p><a href=\"https:\/\/ci.appveyor.com\/pricing\">Request your trial for custom images and faster VMs now<\/a>.<\/p>\n\n<p>Best regards,<br \/>\nAppVeyor team<\/p>","author":{"name":"{\"twitter\"=>\"appveyor\"}"},"summary":"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."},{"title":"Build macOS projects with AppVeyor","link":{"@attributes":{"href":"https:\/\/www.appveyor.com\/blog\/2019\/11\/20\/build-macos-projects-with-appveyor\/","rel":"alternate","type":"text\/html","title":"Build macOS projects with AppVeyor"}},"published":"2019-11-20T00:00:00+00:00","updated":"2019-11-20T00:00:00+00:00","id":"https:\/\/www.appveyor.com\/blog\/2019\/11\/20\/build-macos-projects-with-appveyor","content":"<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>\n\n<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>\n\n<ul>\n  <li><code class=\"highlighter-rouge\">macos<\/code> - macOS 10.15 \u201cCatalina\u201d<\/li>\n  <li><code class=\"highlighter-rouge\">macos-mojave<\/code> - macOS 10.14 \u201cMojave\u201d<\/li>\n<\/ul>\n\n<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>\n\n<p>macOS builds are available to everyone by request - <a href=\"mailto:team@appveyor.com?subject=macOS%20builds\">send us an email<\/a>.<\/p>\n\n<p>Best regards,<br \/>\nAppVeyor team<\/p>","author":{"name":"{\"twitter\"=>\"appveyor\"}"},"summary":"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."}]}