<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><atom:link href="https://www.finalbuilder.com/DesktopModules/LiveBlog/API/Syndication/GetRssFeeds?aid=12045&amp;mid=632&amp;PortalId=0&amp;tid=181&amp;ItemCount=20" rel="self" type="application/rss+xml" /><title>VSoft Technologies Blogs</title><description>VSoft Technologies Blogs - posts about our products and software development.</description><link>https://www.finalbuilder.com/resources/blogs</link><item><title>Signotaur 2.1: signing documents, not just code</title><link>https://www.finalbuilder.com/resources/blogs/postid/887/signotaur-21-signing-documents-not-just-code</link><category>.NET,Delphi,Deployment,DevOps,Document Signing,Signotaur</category><pubDate>Thu, 06 Aug 2026 03:19:46 GMT</pubDate><description>&lt;style type="text/css"&gt;div.blog_content h1 { font-size: 1.9rem; margin-bottom: 0.3rem; }
    div.blog_content h2 { font-size: 1.4rem; margin-top: 2.2rem; border-bottom: 1px solid #e0e0e0; padding-bottom: 0.4rem; }
    div.blog_content h3 { font-size: 1.15rem; margin-top: 1.6rem; color: #222;}
    div.blog_content strong {  font-weight: 600;  color: #888;}
    div.blog_content .meta { color: #777; font-size: 0.9rem; margin-bottom: 2rem; }
    div.blog_content code { background: #f4f4f4; padding: 0.15em 0.4em; border-radius: 3px; font-size: 0.92em; }
    div.blog_content pre { background: #f4f4f4; padding: 1rem; border-radius: 5px; overflow-x: auto; }
    div.blog_content pre code { background: none; padding: 0; }
    div.blog_content a { color: #0066cc; }
    div.blog_content img { max-width: 100%; border: 1px solid #ddd; border-radius: 4px; margin: 1rem 0; }
    div.blog_content .note { background: #eef6ff; border-left: 4px solid #0066cc; padding: 0.8rem 1rem; margin: 1.2rem 0; border-radius: 0 4px 4px 0; }
    div.blog_content ol { margin: 1rem 0 1.5rem 1.5rem; padding-left: 0.5rem;}
    div.blog_content ol li {  margin-bottom: 0.7rem;  line-height: 1.6;}
    div.blog_content ol li strong {  font-weight: 600;}
    div.blog_content ul li {  margin-bottom: 0.45rem;}
&lt;/style&gt;
&lt;div class="note"&gt;&lt;strong&gt;In this article:&lt;/strong&gt;
&lt;ul&gt;
	&lt;li&gt;Signing PDF, XML and other documents with Signotaur&lt;/li&gt;
	&lt;li&gt;PAdES, XAdES and CAdES signature formats&lt;/li&gt;
	&lt;li&gt;Baseline, timestamped, long-term and archival signatures&lt;/li&gt;
	&lt;li&gt;Document-signing certificates and trust&lt;/li&gt;
	&lt;li&gt;Other changes in Signotaur 2.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;Until now, Signotaur has concentrated on code signing. Version 2.1 adds document signing, using the same client, server and key-custody model. It can sign PDFs, XML files and other data in the standard formats used by document viewers, business systems and archives. The private key remains on the Signotaur server, hardware token or HSM at all times.&lt;/p&gt;

&lt;p&gt;Document signing is included in the Enterprise edition. Code-signing features remain available under the Standard licence.&lt;/p&gt;

&lt;h2&gt;PAdES, XAdES and CAdES&lt;/h2&gt;

&lt;p&gt;Different document types store signatures in different ways. Signotaur supports three ETSI Advanced Electronic Signature formats:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;PAdES&lt;/strong&gt; is used for PDF files. The signature is added as an incremental update without rewriting the existing PDF content, and the file continues to open normally in PDF readers. Signotaur selects PAdES automatically for &lt;code&gt;.pdf&lt;/code&gt; files.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;XAdES&lt;/strong&gt; is used for XML. By default, the signature is added inside the XML document alongside the content it covers. A detached signature can be written separately when the original XML must remain unchanged. Signotaur selects XAdES automatically for &lt;code&gt;.xml&lt;/code&gt; files.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;CAdES&lt;/strong&gt; can sign other types of content, such as CSV or JSON data, images and archives. Pass &lt;code&gt;--format cades&lt;/code&gt; to create a detached &lt;code&gt;.p7s&lt;/code&gt; signature beside the original file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three are established standards, so signatures created by Signotaur are not tied to Signotaur for verification. They can also be checked by compatible third-party software, including PDF readers that support PAdES.&lt;/p&gt;

&lt;h2&gt;Choosing a signature level&lt;/h2&gt;

&lt;p&gt;A plain signature proves who signed the content and that it has not changed. It does not prove &lt;em&gt;when&lt;/em&gt; it was signed, or that the signing certificate was valid and unrevoked at that moment. Once the certificate expires, a verifier has little to go on. The &lt;code&gt;--level&lt;/code&gt; option chooses how much supporting evidence to include. The same four levels are available across all three formats, and each includes everything from the levels below it:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;&lt;code&gt;baseline&lt;/code&gt;&lt;/strong&gt; includes the signature and signing certificate. This is the default.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;code&gt;timestamped&lt;/code&gt;&lt;/strong&gt; adds an RFC 3161 timestamp from a timestamp authority. This establishes when the signature existed without relying on the signer's computer clock, allowing a verifier to see that it was created within the certificate's validity period.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;code&gt;long-term&lt;/code&gt;&lt;/strong&gt; also embeds the certificate chain and revocation evidence, using OCSP responses or certificate revocation lists (CRLs). This allows the evidence to be checked later without depending on the issuing CA's services still being available.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;code&gt;archival&lt;/code&gt;&lt;/strong&gt; adds another timestamp over the signature and its supporting evidence, recording that the complete package existed intact while its algorithms were still considered secure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Levels above &lt;code&gt;baseline&lt;/code&gt; require a timestamp authority, supplied with &lt;code&gt;--timestamp-server&lt;/code&gt;. For long-term and archival signatures, Signotaur collects revocation evidence while signing. If it cannot retrieve that evidence, it identifies the affected certificate and continues with a warning. The signature remains valid, but may not be verifiable offline or after the certificate expires.&lt;/p&gt;

&lt;h2&gt;Signing a document&lt;/h2&gt;

&lt;p&gt;Document signing uses the existing &lt;code&gt;sign&lt;/code&gt; command. For a PDF, the simplest form looks like this:&lt;/p&gt;

&lt;pre&gt;
&lt;code&gt;SignotaurTool.exe sign -a [APIKey] -s [SignServer] -t [Thumbprint] contract.pdf&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To add a timestamp, select the &lt;code&gt;timestamped&lt;/code&gt; level and provide a timestamp authority:&lt;/p&gt;

&lt;pre&gt;
&lt;code&gt;SignotaurTool.exe sign -a [APIKey] -s [SignServer] -t [Thumbprint] --level timestamped --tr http://timestamp.example.com contract.pdf&lt;/code&gt;&lt;/pre&gt;
&lt;!-- SCREENSHOT: Capture a Command Prompt or Windows Terminal run that signs a sample PDF at the timestamped level. Show the selected format and level, timestamp and successful result. Use a placeholder API key or redact it before capture. --&gt;

&lt;p style="text-align: center;"&gt;&lt;img alt="SignotaurTool signing a PDF with a timestamped PAdES signature." src="https://cdn.finalbuilder.com/blog/daves/signotaur-21-signing-documents-not-just-code/pades-sign-output.png" style="max-width: 100%;" /&gt;&lt;/p&gt;

&lt;p&gt;The signed PDF replaces the input file, so retain the original separately if it is still required.&lt;/p&gt;

&lt;p&gt;PDF signatures are invisible by default: the signature is available through the reader's signature panel, but nothing is drawn on the page. Signotaur can instead add a visible signature containing a reason, location and optional logo. A password-protected PDF can also be signed: supply the password needed to open it and the file stays encrypted afterwards.&lt;/p&gt;
&lt;!-- SCREENSHOT: Open a signed sample PDF in Adobe Acrobat Reader. Show a visible signature on the page together with Acrobat's signature panel or validation banner. Do not use a real customer document. --&gt;

&lt;p style="text-align: center;"&gt;&lt;img alt="A visible PAdES signature and signature details shown in Adobe Acrobat Reader." src="https://cdn.finalbuilder.com/blog/daves/signotaur-21-signing-documents-not-just-code/pades-visible-signature.png" style="max-width: 100%;" /&gt;&lt;/p&gt;

&lt;h2&gt;Verifying document signatures&lt;/h2&gt;

&lt;p&gt;The existing &lt;code&gt;verify&lt;/code&gt; command recognises PAdES, XAdES and CAdES as well as the code-signing formats already supported by Signotaur:&lt;/p&gt;

&lt;pre&gt;
&lt;code&gt;SignotaurTool.exe verify contract.pdf invoice.xml invoice.csv.p7s&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Signotaur detects the signature format, including an XML document accompanied by a detached signature, and reports whether each file's signature was verified.&lt;/p&gt;

&lt;h2&gt;Document-signing certificates&lt;/h2&gt;

&lt;p&gt;Code-signing and document-signing certificates are marked for different purposes. Signotaur checks that marking before a signing run begins, so a code-signing certificate cannot normally be used to sign a document, or vice versa.&lt;/p&gt;

&lt;p&gt;An existing document-signing certificate can be registered from a PFX file, the Windows certificate store, or a hardware token or HSM accessed through PKCS#11. When a hardware device is used, the private key remains on that device and Signotaur asks it to perform the signing operation.&lt;/p&gt;

&lt;p&gt;A document-signing certificate can also be issued through Signotaur's Internal CA or Microsoft AD CS. Select &lt;strong&gt;Document signing&lt;/strong&gt; as the purpose in the Issue dialog. Certificates issued by the Internal CA carry the Microsoft, Adobe and RFC 9336 document-signing usages for compatibility with a broad range of verifiers.&lt;/p&gt;
&lt;!-- SCREENSHOT: Capture the Issue Certificate dialog on the Managed Certificates page with Document signing selected as the purpose. Include the subject, key size and validity fields. --&gt;

&lt;p style="text-align: center;"&gt;&lt;img alt="Issuing a document-signing certificate from the Signotaur administration interface." src="https://cdn.finalbuilder.com/blog/daves/signotaur-21-signing-documents-not-just-code/issue-document-signing-certificate.png" style="max-width: 100%;" /&gt;&lt;/p&gt;

&lt;p&gt;Certificates registered before upgrading to 2.1 remain recorded as code signing. Re-register any certificate that should also be available for document signing.&lt;/p&gt;

&lt;h2&gt;Certificate trust&lt;/h2&gt;

&lt;p&gt;Creating a valid signature does not automatically make its certificate trusted by every recipient. Trust is decided by the software or system performing the verification.&lt;/p&gt;

&lt;p&gt;Adobe Acrobat, for example, trusts a signature when its certificate chains to a root that Acrobat trusts. That may be a public root on the Adobe Approved Trust List, or a private root installed by your organisation. Certificates issued by Signotaur's Internal CA are therefore well suited to documents used within an organisation that distributes and trusts its own root certificate. Documents sent outside that environment may need a certificate from a publicly trusted provider.&lt;/p&gt;

&lt;p&gt;Trust and revocation are separate concerns. If signed documents leave your network, Signotaur 2.1 can publish the Internal CA's revocation list and issuer certificate to an external location. Recipients can then check whether a certificate has been revoked without needing access to your internal network. This does not make the Internal CA publicly trusted; recipients must still trust its root separately.&lt;/p&gt;

&lt;p&gt;A trusted certificate is also not necessarily a &lt;em&gt;qualified&lt;/em&gt; certificate in the eIDAS sense, a distinction covered in the documentation.&lt;/p&gt;

&lt;h2&gt;Using document signing in a pipeline&lt;/h2&gt;

&lt;p&gt;Because document signing uses the existing Signotaur client and API-key authentication, it can be added to the same release and automation processes as code signing. A release can sign its executables and accompanying PDF documentation, while another job might sign generated invoices or XML messages.&lt;/p&gt;

&lt;p&gt;The build machine never receives the private key. Access remains controlled through Signotaur, and successful and failed signing requests are recorded in its audit trail.&lt;/p&gt;

&lt;h2&gt;Also in Signotaur 2.1&lt;/h2&gt;

&lt;p&gt;Document signing is the main addition, but version 2.1 also includes several changes to the Internal CA and certificate management:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Validation Authority.&lt;/strong&gt; The Internal CA can answer OCSP requests and publish CRLs and CA certificates, allowing the status of certificates it issues to be checked.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Multiple Intermediate CAs.&lt;/strong&gt; Intermediates can be scoped to web (TLS), code signing, document signing or all purposes, and managed independently.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Certificate identities and policies.&lt;/strong&gt; Issued certificates can carry structured subjects and identify the certificate policy under which they were issued.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Certificate-management improvements.&lt;/strong&gt; These include a Certificate authorities view, whole-chain downloads and renewal under the Intermediate CA that originally issued the certificate.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Certificate-purpose enforcement.&lt;/strong&gt; If a certificate is unsuitable for any artefact in a batch, the run fails before anything is signed. Pass &lt;code&gt;--warn-wrong-purpose&lt;/code&gt; to warn and sign anyway.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;Signotaur 2.1 brings PDFs, XML and other documents into the same controlled signing process already used for software. It supports the standard PAdES, XAdES and CAdES formats, four levels of signing evidence, visible PDF signatures and certificates issued internally or registered from an existing source.&lt;/p&gt;

&lt;p&gt;The private key remains in its controlled location, whether that is the Signotaur server, a hardware token or an HSM. Existing deployment and automation processes can use the same client and API-key model they already use for code signing.&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;Full details are available in the &lt;a href="https://docs.finalbuilder.com/sn/2.1/"&gt;Signotaur 2.1 documentation&lt;/a&gt;, including &lt;a href="https://docs.finalbuilder.com/sn/2.1/client/signing-documents.html"&gt;Signing Documents&lt;/a&gt;, &lt;a href="https://docs.finalbuilder.com/sn/2.1/document-signing-certificates.html"&gt;Document Signing Certificates&lt;/a&gt; and the &lt;a href="https://docs.finalbuilder.com/sn/2.1/client/commands/sign-command.html"&gt;sign command&lt;/a&gt; reference.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://www.finalbuilder.com/forums/t/signotaur-v2-1-0-198-released/7815"&gt;Signotaur 2.1 release announcement&lt;/a&gt; for the full changelog. To evaluate document signing on an existing installation, request a 14-day Enterprise trial licence from the Licences page in the server administration interface.&lt;/p&gt;
</description><guid isPermaLink="false">887</guid></item><item><title>Signotaur 2.0: managing certificates, not just signing with them</title><link>https://www.finalbuilder.com/resources/blogs/postid/886/signotaur-20-managing-certificates-not-just-signing-with-them</link><category>.NET,Code Signing,DelphiDevOps,Signotaur</category><pubDate>Fri, 26 Jun 2026 01:39:43 GMT</pubDate><description>&lt;style type="text/css"&gt;div.blog_content h1 { font-size: 1.9rem; margin-bottom: 0.3rem; }
    div.blog_content h2 { font-size: 1.4rem; margin-top: 2.2rem; border-bottom: 1px solid #e0e0e0; padding-bottom: 0.4rem; }
    div.blog_content h3 { font-size: 1.15rem; margin-top: 1.6rem; color: #222;}
    div.blog_content strong {  font-weight: 600;  color: #888;}
    div.blog_content .meta { color: #777; font-size: 0.9rem; margin-bottom: 2rem; }
    div.blog_content code { background: #f4f4f4; padding: 0.15em 0.4em; border-radius: 3px; font-size: 0.92em; }
    div.blog_content pre { background: #f4f4f4; padding: 1rem; border-radius: 5px; overflow-x: auto; }
    div.blog_content pre code { background: none; padding: 0; }
    div.blog_content a { color: #0066cc; }
    div.blog_content img { max-width: 100%; border: 1px solid #ddd; border-radius: 4px; margin: 1rem 0; }
    div.blog_content .note { background: #eef6ff; border-left: 4px solid #0066cc; padding: 0.8rem 1rem; margin: 1.2rem 0; border-radius: 0 4px 4px 0; }
    div.blog_content ol { margin: 1rem 0 1.5rem 1.5rem; padding-left: 0.5rem;}
    div.blog_content ol li {  margin-bottom: 0.7rem;  line-height: 1.6;}
    div.blog_content ol li strong {  font-weight: 600;}
    div.blog_content ul li {  margin-bottom: 0.45rem;}
&lt;/style&gt;
&lt;div class="note"&gt;&lt;strong&gt;In this article:&lt;/strong&gt;
    &lt;ul&gt;
        &lt;li&gt;Signing PDF, XML and other documents with Signotaur&lt;/li&gt;
        &lt;li&gt;PAdES, XAdES and CAdES signature formats&lt;/li&gt;
        &lt;li&gt;Baseline, timestamped, long-term and archival signatures&lt;/li&gt;
        &lt;li&gt;Document-signing certificates and trust&lt;/li&gt;
        &lt;li&gt;Other changes in Signotaur 2.1&lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;Until now, Signotaur has concentrated on code signing. Version 2.1 adds document signing, using the same client, server and key-custody model. It can sign PDFs, XML files and other data in the standard formats used by document viewers, business systems and archives. The private key remains on the Signotaur server, hardware token or HSM at all times.&lt;/p&gt;

&lt;p&gt;Document signing is included in the Enterprise edition. Code-signing features remain available under the Standard licence.&lt;/p&gt;

&lt;h2&gt;PAdES, XAdES and CAdES&lt;/h2&gt;

&lt;p&gt;Different document types store signatures in different ways. Signotaur supports three ETSI Advanced Electronic Signature formats:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;PAdES&lt;/strong&gt; is used for PDF files. The signature is added as an incremental update without rewriting the existing PDF content, and the file continues to open normally in PDF readers. Signotaur selects PAdES automatically for &lt;code&gt;.pdf&lt;/code&gt; files.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;XAdES&lt;/strong&gt; is used for XML. By default, the signature is added inside the XML document alongside the content it covers. A detached signature can be written separately when the original XML must remain unchanged. Signotaur selects XAdES automatically for &lt;code&gt;.xml&lt;/code&gt; files.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;CAdES&lt;/strong&gt; can sign other types of content, such as CSV or JSON data, images and archives. Pass &lt;code&gt;--format cades&lt;/code&gt; to create a detached &lt;code&gt;.p7s&lt;/code&gt; signature beside the original file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three are established standards, so signatures created by Signotaur are not tied to Signotaur for verification. They can also be checked by compatible third-party software, including PDF readers that support PAdES.&lt;/p&gt;

&lt;h2&gt;Choosing a signature level&lt;/h2&gt;

&lt;p&gt;A plain signature proves who signed the content and that it has not changed. It does not prove &lt;em&gt;when&lt;/em&gt; it was signed, or that the signing certificate was valid and unrevoked at that moment. Once the certificate expires, a verifier has little to go on. The &lt;code&gt;--level&lt;/code&gt; option chooses how much supporting evidence to include. The same four levels are available across all three formats, and each includes everything from the levels below it:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;&lt;code&gt;baseline&lt;/code&gt;&lt;/strong&gt; includes the signature and signing certificate. This is the default.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;&lt;code&gt;timestamped&lt;/code&gt;&lt;/strong&gt; adds an RFC 3161 timestamp from a timestamp authority. This establishes when the signature existed without relying on the signer's computer clock, allowing a verifier to see that it was created within the certificate's validity period.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;&lt;code&gt;long-term&lt;/code&gt;&lt;/strong&gt; also embeds the certificate chain and revocation evidence, using OCSP responses or certificate revocation lists (CRLs). This allows the evidence to be checked later without depending on the issuing CA's services still being available.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;&lt;code&gt;archival&lt;/code&gt;&lt;/strong&gt; adds another timestamp over the signature and its supporting evidence, recording that the complete package existed intact while its algorithms were still considered secure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Levels above &lt;code&gt;baseline&lt;/code&gt; require a timestamp authority, supplied with &lt;code&gt;--timestamp-server&lt;/code&gt;. For long-term and archival signatures, Signotaur collects revocation evidence while signing. If it cannot retrieve that evidence, it identifies the affected certificate and continues with a warning. The signature remains valid, but may not be verifiable offline or after the certificate expires.&lt;/p&gt;

&lt;h2&gt;Signing a document&lt;/h2&gt;

&lt;p&gt;Document signing uses the existing &lt;code&gt;sign&lt;/code&gt; command. For a PDF, the simplest form looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SignotaurTool.exe sign -a [APIKey] -s [SignServer] -t [Thumbprint] contract.pdf&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To add a timestamp, select the &lt;code&gt;timestamped&lt;/code&gt; level and provide a timestamp authority:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SignotaurTool.exe sign -a [APIKey] -s [SignServer] -t [Thumbprint] --level timestamped --tr http://timestamp.example.com contract.pdf&lt;/code&gt;&lt;/pre&gt;

&lt;!-- SCREENSHOT: Capture a Command Prompt or Windows Terminal run that signs a sample PDF at the timestamped level. Show the selected format and level, timestamp and successful result. Use a placeholder API key or redact it before capture. --&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="https://cdn.finalbuilder.com/blog/daves/signotaur-21-signing-documents-not-just-code/pades-sign-output.png" alt="SignotaurTool signing a PDF with a timestamped PAdES signature." style="max-width: 100%;"&gt;&lt;/p&gt;

&lt;p&gt;The signed PDF replaces the input file, so retain the original separately if it is still required.&lt;/p&gt;

&lt;p&gt;PDF signatures are invisible by default: the signature is available through the reader's signature panel, but nothing is drawn on the page. Signotaur can instead add a visible signature containing a reason, location and optional logo. A password-protected PDF can also be signed: supply the password needed to open it and the file stays encrypted afterwards.&lt;/p&gt;

&lt;!-- SCREENSHOT: Open a signed sample PDF in Adobe Acrobat Reader. Show a visible signature on the page together with Acrobat's signature panel or validation banner. Do not use a real customer document. --&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="https://cdn.finalbuilder.com/blog/daves/signotaur-21-signing-documents-not-just-code/pades-visible-signature.png" alt="A visible PAdES signature and signature details shown in Adobe Acrobat Reader." style="max-width: 100%;"&gt;&lt;/p&gt;

&lt;h2&gt;Verifying document signatures&lt;/h2&gt;

&lt;p&gt;The existing &lt;code&gt;verify&lt;/code&gt; command recognises PAdES, XAdES and CAdES as well as the code-signing formats already supported by Signotaur:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SignotaurTool.exe verify contract.pdf invoice.xml invoice.csv.p7s&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Signotaur detects the signature format, including an XML document accompanied by a detached signature, and reports whether each file's signature was verified.&lt;/p&gt;

&lt;h2&gt;Document-signing certificates&lt;/h2&gt;

&lt;p&gt;Code-signing and document-signing certificates are marked for different purposes. Signotaur checks that marking before a signing run begins, so a code-signing certificate cannot normally be used to sign a document, or vice versa.&lt;/p&gt;

&lt;p&gt;An existing document-signing certificate can be registered from a PFX file, the Windows certificate store, or a hardware token or HSM accessed through PKCS#11. When a hardware device is used, the private key remains on that device and Signotaur asks it to perform the signing operation.&lt;/p&gt;

&lt;p&gt;A document-signing certificate can also be issued through Signotaur's Internal CA or Microsoft AD CS. Select &lt;strong&gt;Document signing&lt;/strong&gt; as the purpose in the Issue dialog. Certificates issued by the Internal CA carry the Microsoft, Adobe and RFC 9336 document-signing usages for compatibility with a broad range of verifiers.&lt;/p&gt;

&lt;!-- SCREENSHOT: Capture the Issue Certificate dialog on the Managed Certificates page with Document signing selected as the purpose. Include the subject, key size and validity fields. --&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="https://cdn.finalbuilder.com/blog/daves/signotaur-21-signing-documents-not-just-code/issue-document-signing-certificate.png" alt="Issuing a document-signing certificate from the Signotaur administration interface." style="max-width: 100%;"&gt;&lt;/p&gt;

&lt;p&gt;Certificates registered before upgrading to 2.1 remain recorded as code signing. Re-register any certificate that should also be available for document signing.&lt;/p&gt;

&lt;h2&gt;Certificate trust&lt;/h2&gt;

&lt;p&gt;Creating a valid signature does not automatically make its certificate trusted by every recipient. Trust is decided by the software or system performing the verification.&lt;/p&gt;

&lt;p&gt;Adobe Acrobat, for example, trusts a signature when its certificate chains to a root that Acrobat trusts. That may be a public root on the Adobe Approved Trust List, or a private root installed by your organisation. Certificates issued by Signotaur's Internal CA are therefore well suited to documents used within an organisation that distributes and trusts its own root certificate. Documents sent outside that environment may need a certificate from a publicly trusted provider.&lt;/p&gt;

&lt;p&gt;Trust and revocation are separate concerns. If signed documents leave your network, Signotaur 2.1 can publish the Internal CA's revocation list and issuer certificate to an external location. Recipients can then check whether a certificate has been revoked without needing access to your internal network. This does not make the Internal CA publicly trusted; recipients must still trust its root separately.&lt;/p&gt;

&lt;p&gt;A trusted certificate is also not necessarily a &lt;em&gt;qualified&lt;/em&gt; certificate in the eIDAS sense, a distinction covered in the documentation.&lt;/p&gt;

&lt;h2&gt;Using document signing in a pipeline&lt;/h2&gt;

&lt;p&gt;Because document signing uses the existing Signotaur client and API-key authentication, it can be added to the same release and automation processes as code signing. A release can sign its executables and accompanying PDF documentation, while another job might sign generated invoices or XML messages.&lt;/p&gt;

&lt;p&gt;The build machine never receives the private key. Access remains controlled through Signotaur, and successful and failed signing requests are recorded in its audit trail.&lt;/p&gt;

&lt;h2&gt;Also in Signotaur 2.1&lt;/h2&gt;

&lt;p&gt;Document signing is the main addition, but version 2.1 also includes several changes to the Internal CA and certificate management:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Validation Authority.&lt;/strong&gt; The Internal CA can answer OCSP requests and publish CRLs and CA certificates, allowing the status of certificates it issues to be checked.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Multiple Intermediate CAs.&lt;/strong&gt; Intermediates can be scoped to web (TLS), code signing, document signing or all purposes, and managed independently.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Certificate identities and policies.&lt;/strong&gt; Issued certificates can carry structured subjects and identify the certificate policy under which they were issued.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Certificate-management improvements.&lt;/strong&gt; These include a Certificate authorities view, whole-chain downloads and renewal under the Intermediate CA that originally issued the certificate.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Certificate-purpose enforcement.&lt;/strong&gt; If a certificate is unsuitable for any artefact in a batch, the run fails before anything is signed. Pass &lt;code&gt;--warn-wrong-purpose&lt;/code&gt; to warn and sign anyway.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;Signotaur 2.1 brings PDFs, XML and other documents into the same controlled signing process already used for software. It supports the standard PAdES, XAdES and CAdES formats, four levels of signing evidence, visible PDF signatures and certificates issued internally or registered from an existing source.&lt;/p&gt;

&lt;p&gt;The private key remains in its controlled location, whether that is the Signotaur server, a hardware token or an HSM. Existing deployment and automation processes can use the same client and API-key model they already use for code signing.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;Full details are available in the &lt;a href="https://docs.finalbuilder.com/sn/2.1/"&gt;Signotaur 2.1 documentation&lt;/a&gt;, including &lt;a href="https://docs.finalbuilder.com/sn/2.1/client/signing-documents.html"&gt;Signing Documents&lt;/a&gt;, &lt;a href="https://docs.finalbuilder.com/sn/2.1/document-signing-certificates.html"&gt;Document Signing Certificates&lt;/a&gt; and the &lt;a href="https://docs.finalbuilder.com/sn/2.1/client/commands/sign-command.html"&gt;sign command&lt;/a&gt; reference.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://www.finalbuilder.com/forums/t/signotaur-v2-1-0-198-released/7815"&gt;Signotaur 2.1 release announcement&lt;/a&gt; for the full changelog. To evaluate document signing on an existing installation, request a 14-day Enterprise trial licence from the Licences page in the server administration interface.&lt;/p&gt;
</description><guid isPermaLink="false">886</guid></item><item><title>Signing files that can't carry a signature: detached CMS for ZIPs, ISOs and more</title><link>https://www.finalbuilder.com/resources/blogs/postid/885/signing-files-that-cant-carry-a-signature-detached-cms-for-zips-isos-and-more</link><category>.NET,Code Signing,DelphiDevOps,Signotaur</category><pubDate>Fri, 12 Jun 2026 02:25:05 GMT</pubDate><description>&lt;style type="text/css"&gt;div.blog_content h1 { font-size: 1.9rem; margin-bottom: 0.3rem; }
    div.blog_content h2 { font-size: 1.4rem; margin-top: 2.2rem; border-bottom: 1px solid #e0e0e0; padding-bottom: 0.4rem; }
    div.blog_content h3 { font-size: 1.15rem; margin-top: 1.6rem; color: #222;}
    div.blog_content strong {  font-weight: 600;  color: #888;}
    div.blog_content .meta { color: #777; font-size: 0.9rem; margin-bottom: 2rem; }
    div.blog_content code { background: #f4f4f4; padding: 0.15em 0.4em; border-radius: 3px; font-size: 0.92em; }
    div.blog_content pre { background: #f4f4f4; padding: 1rem; border-radius: 5px; overflow-x: auto; }
    div.blog_content pre code { background: none; padding: 0; }
    div.blog_content a { color: #0066cc; }
    div.blog_content img { max-width: 100%; border: 1px solid #ddd; border-radius: 4px; margin: 1rem 0; }
    div.blog_content .note { background: #eef6ff; border-left: 4px solid #0066cc; padding: 0.8rem 1rem; margin: 1.2rem 0; border-radius: 0 4px 4px 0; }
    div.blog_content ol { margin: 1rem 0 1.5rem 1.5rem; padding-left: 0.5rem;}
    div.blog_content ol li {  margin-bottom: 0.7rem;  line-height: 1.6;}
    div.blog_content ol li strong {  font-weight: 600;}
    div.blog_content ul li {  margin-bottom: 0.45rem;}
&lt;/style&gt;
&lt;div class="note"&gt;&lt;strong&gt;In this article:&lt;/strong&gt;
&lt;ul&gt;
	&lt;li&gt;Why some files can't carry an embedded signature&lt;/li&gt;
	&lt;li&gt;What a detached &lt;code&gt;.p7s&lt;/code&gt; signature is, and when Signotaur writes one&lt;/li&gt;
	&lt;li&gt;Signing archives and disk images with no extra flags&lt;/li&gt;
	&lt;li&gt;Extending detached signing to arbitrary files with &lt;code&gt;--detached&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Controlling the output path, and verifying with Signotaur or OpenSSL&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Most of the file types Signotaur signs have somewhere to &lt;em&gt;put&lt;/em&gt; the signature. A PE binary has a certificate table, an MSI has a digital-signature stream, a NuGet package has a reserved ZIP entry. You sign the file, the signature goes inside it, and the file still works exactly as before.&lt;/p&gt;
&lt;p&gt;Plenty of files people need to sign have no standard embedded-signature format. A &lt;code&gt;.zip&lt;/code&gt;, a &lt;code&gt;.tar.gz&lt;/code&gt;, an &lt;code&gt;.iso&lt;/code&gt;, a firmware blob, a plain &lt;code&gt;.json&lt;/code&gt; manifest — several of these do have comment or metadata areas you could stash bytes in, but there's no agreed-upon signing format that other tools would recognise. You can wrap the whole file inside a signature structure, but that changes the file itself: your zip is no longer a zip, it's a CMS structure containing the zip.&lt;/p&gt;
&lt;p&gt;The standard answer to this is a &lt;strong&gt;detached signature&lt;/strong&gt;: sign the bytes, leave the original artifact untouched, and write the signature to a separate file. Signotaur now supports this directly, producing a standard CMS/PKCS#7 &lt;code&gt;.p7s&lt;/code&gt; signature next to the file it signed.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;CMS&lt;/em&gt; (Cryptographic Message Syntax, &lt;a href="https://datatracker.ietf.org/doc/html/rfc5652"&gt;RFC 5652&lt;/a&gt;) is the IETF standard format for digitally signed data; &lt;em&gt;PKCS#7&lt;/em&gt; is the older format CMS was based on, and the names are still often used interchangeably. The &lt;code&gt;.p7s&lt;/code&gt; extension is the conventional one for a detached CMS signature, which is why you'll see it throughout this post.&lt;/p&gt;
&lt;h2&gt;Archives and disk images: nothing to do&lt;/h2&gt;
&lt;p&gt;Signing a zip while keeping it usable is by far the most common case, so Signotaur &lt;strong&gt;automatically&lt;/strong&gt; uses detached signatures for common archive and disk-image formats, with no extra flags:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SignotaurTool.exe sign -a [APIKey] -s [SignServer] -t [Thumbprint] release.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That signs &lt;code&gt;release.zip&lt;/code&gt; and writes the signature to &lt;code&gt;release.zip.p7s&lt;/code&gt; alongside it. &lt;code&gt;release.zip&lt;/code&gt; itself is not touched — same bytes, same hash, still opens in any zip tool. The formats handled this way are &lt;code&gt;.zip&lt;/code&gt;, &lt;code&gt;.7z&lt;/code&gt;, &lt;code&gt;.tar&lt;/code&gt;, &lt;code&gt;.gz&lt;/code&gt;, &lt;code&gt;.tgz&lt;/code&gt;, &lt;code&gt;.bz2&lt;/code&gt;, &lt;code&gt;.xz&lt;/code&gt;, &lt;code&gt;.iso&lt;/code&gt;, &lt;code&gt;.img&lt;/code&gt;, &lt;code&gt;.vhd&lt;/code&gt; and &lt;code&gt;.vhdx&lt;/code&gt;.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="https://cdn.finalbuilder.com/blog/daves/signotaur-detached-cms/detached-sign-output.png" alt="Command Prompt output of SignotaurTool signing a zip with a detached CMS/PKCS#7 signature; the final line shows the signature written to the matching .p7s file alongside the untouched original."&gt;&lt;/p&gt;
&lt;p&gt;Files that &lt;em&gt;do&lt;/em&gt; have a native embedded format — PE, MSI, NuGet, VSIX, RDP, ClickOnce manifests, &lt;code&gt;.mobileconfig&lt;/code&gt; — keep using it. You don't have to think about which is which; the &lt;code&gt;sign&lt;/code&gt; command routes each file by its type.&lt;/p&gt;
&lt;h2&gt;Other file types: &lt;code&gt;--detached&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;To produce a detached signature for a file type that Signotaur would not otherwise sign as an embedded format — for example a &lt;code&gt;.txt&lt;/code&gt;, a &lt;code&gt;.json&lt;/code&gt;, an arbitrary binary — add &lt;code&gt;--detached&lt;/code&gt; (&lt;code&gt;--dt&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SignotaurTool.exe sign -a [APIKey] -s [SignServer] -t [Thumbprint] --detached manifest.json&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This writes &lt;code&gt;manifest.json.p7s&lt;/code&gt; and leaves &lt;code&gt;manifest.json&lt;/code&gt; alone. The flag is ignored for file types that have their own embedded signature, so it's harmless to leave on in a script that signs a mix of things.&lt;/p&gt;
&lt;h2&gt;Choosing where the signature lands&lt;/h2&gt;
&lt;p&gt;By default the signature is written next to each signed file as &lt;code&gt;[file].p7s&lt;/code&gt;. To put signatures somewhere else, use &lt;code&gt;--signature-file&lt;/code&gt; (&lt;code&gt;--sf&lt;/code&gt;). For a single file you can give an exact path:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SignotaurTool.exe sign release.zip --signature-file C:\sigs\release.sig ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When signing many files at once, use placeholders so each output is distinct:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;{name}&lt;/code&gt; — the file name including extension (&lt;code&gt;archive.zip&lt;/code&gt; → &lt;code&gt;archive.zip.p7s&lt;/code&gt;).&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;{name-no-ext}&lt;/code&gt; — the file name without extension (&lt;code&gt;archive.zip&lt;/code&gt; → &lt;code&gt;archive.p7s&lt;/code&gt;).&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;{rel-path}&lt;/code&gt; — the file path relative to the current directory, or to &lt;code&gt;--base-directory&lt;/code&gt; if specified. This avoids collisions when different folders contain files with the same name.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SignotaurTool.exe sign src\**\*.zip --signature-file sigs\{rel-path}.p7s ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any directories in the output path are created for you. An exact (placeholder-free) path is only valid when signing a single file — otherwise every file would write to the same signature file.&lt;/p&gt;
&lt;h2&gt;Verifying&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;.p7s&lt;/code&gt; file is a plain CMS/PKCS#7 SignedData structure, so it's not locked to Signotaur. Point &lt;code&gt;verify&lt;/code&gt; at either the original or its &lt;code&gt;.p7s&lt;/code&gt; signature and it auto-detects the pairing:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SignotaurTool.exe verify release.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="https://cdn.finalbuilder.com/blog/daves/signotaur-detached-cms/detached-verify-output.png" alt="Terminal output from SignotaurTool verify confirming a valid detached signature, showing the signer certificate and a verified result."&gt;&lt;/p&gt;
&lt;p&gt;And because it's standards-compliant, OpenSSL — or anything else that speaks CMS — can verify it too:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openssl cms -verify -binary -inform DER -in release.zip.p7s -content release.zip -CAfile root.pem -out NUL&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That example assumes a signer certificate issued directly by the root in &lt;code&gt;root.pem&lt;/code&gt;; in practice, use whichever CA bundle or certificate chain is appropriate for the signer certificate. (&lt;code&gt;-out NUL&lt;/code&gt; just discards the recovered content so the zip isn't dumped to the console.)&lt;/p&gt;
&lt;p&gt;If you only need an integrity check — confirm the signature matches the content, without deciding whether the signer is trusted — add &lt;code&gt;-noverify&lt;/code&gt;. It skips chain validation, so no &lt;code&gt;root.pem&lt;/code&gt; is required:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openssl cms -verify -noverify -binary -inform DER -in release.zip.p7s -content release.zip -out NUL&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This confirms the bytes haven't changed since signing, but it does &lt;em&gt;not&lt;/em&gt; establish that you trust the signer — for that, use the chain-validating form above.&lt;/p&gt;
&lt;p&gt;RFC 3161 timestamping works on detached signatures the same as everywhere else — pass &lt;code&gt;--tr&lt;/code&gt; (and optionally &lt;code&gt;--st&lt;/code&gt;) and the timestamp is embedded into the &lt;code&gt;.p7s&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Detached signing extends Signotaur beyond formats with a built-in signature slot. Where a file has a native signing format, Signotaur continues to use it. Where it does not, Signotaur can write a clean &lt;code&gt;.p7s&lt;/code&gt; signature alongside the untouched original.&lt;/p&gt;
&lt;p&gt;The result is still standards-compliant CMS/PKCS#7, so consumers are not tied to Signotaur for verification. More to come, but this removes a "you can't sign that" answer we'd rather not give.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;For the full option reference see the &lt;code&gt;sign&lt;/code&gt; and &lt;code&gt;verify&lt;/code&gt; command pages in the &lt;a href="https://docs.finalbuilder.com/sn/1.0/"&gt;Signotaur documentation&lt;/a&gt;. As always, the private key never leaves your signing server — detached or embedded, only the digest is ever sent for signing.&lt;/p&gt;
</description><guid isPermaLink="false">885</guid></item><item><title>Signing .rdp files with Signotaur (and surviving the April Windows update)</title><link>https://www.finalbuilder.com/resources/blogs/postid/882/signing-rdp-files-with-signotaur-and-surviving-the-april-windows-update</link><category>.NET,Code Signing,DelphiSignotaur,Windows</category><pubDate>Fri, 24 Apr 2026 02:27:48 GMT</pubDate><description>&lt;style type="text/css"&gt;div.blog_content h1 { font-size: 1.9rem; margin-bottom: 0.3rem; }
    div.blog_content h2 { font-size: 1.4rem; margin-top: 2.2rem; border-bottom: 1px solid #e0e0e0; padding-bottom: 0.4rem; }
    div.blog_content h3 { font-size: 1.15rem; margin-top: 1.6rem; color: #222;}
    div.blog_content strong {  font-weight: 600;  color: #888;}
    div.blog_content .meta { color: #777; font-size: 0.9rem; margin-bottom: 2rem; }
    div.blog_content code { background: #f4f4f4; padding: 0.15em 0.4em; border-radius: 3px; font-size: 0.92em; }
    div.blog_content pre { background: #f4f4f4; padding: 1rem; border-radius: 5px; overflow-x: auto; }
    div.blog_content pre code { background: none; padding: 0; }
    div.blog_content a { color: #0066cc; }
    div.blog_content img { max-width: 100%; border: 1px solid #ddd; border-radius: 4px; margin: 1rem 0; }
    div.blog_content .note { background: #eef6ff; border-left: 4px solid #0066cc; padding: 0.8rem 1rem; margin: 1.2rem 0; border-radius: 0 4px 4px 0; }
    div.blog_content ol { margin: 1rem 0 1.5rem 1.5rem; padding-left: 0.5rem;}
    div.blog_content ol li {  margin-bottom: 0.7rem;  line-height: 1.6;}
    div.blog_content ol li strong {  font-weight: 600;}
    div.blog_content ul li {  margin-bottom: 0.45rem;}
&lt;/style&gt;
&lt;div class="note"&gt;&lt;strong&gt;In this article:&lt;/strong&gt;
&lt;ul&gt;
	&lt;li&gt;What changed for signed &lt;code&gt;.rdp&lt;/code&gt; files in the April 2026 Windows update&lt;/li&gt;
	&lt;li&gt;Why previously-working signatures now show an orange warning dialog&lt;/li&gt;
	&lt;li&gt;The registry policy recipient machines need for no dialog at all&lt;/li&gt;
	&lt;li&gt;How Signotaur signs &lt;code&gt;.rdp&lt;/code&gt; files without distributing the certificate&lt;/li&gt;
	&lt;li&gt;Deploying the policy via Group Policy or PowerShell&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;If you push Remote Desktop shortcuts out to users, you probably already know about the April 2026 Windows cumulative update (&lt;a href="https://support.microsoft.com/kb/5083769"&gt;KB5083769&lt;/a&gt; on Windows 11, KB5082200 on Windows 10). If you don't, you might have found out the hard way — via a Monday-morning deluge of "is this a virus?" tickets from users who suddenly have a big orange warning on the RDP file that worked fine last week.&lt;/p&gt;

&lt;p&gt;Signotaur 1.2.0.107 ships with &lt;code&gt;.rdp&lt;/code&gt; file signing support. Here's what changed in Windows, why it matters, and what the new signing command actually does.&lt;/p&gt;

&lt;h2&gt;What Microsoft changed&lt;/h2&gt;

&lt;p&gt;The April cumulative addresses &lt;a href="https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-26151"&gt;CVE-2026-26151&lt;/a&gt;. Two user-visible things came with it:&lt;/p&gt;

&lt;ol style="margin-left: 1.4em;  margin-bottom: 1em;"&gt;
	&lt;li&gt;The Remote Desktop Connection warning dialog was redesigned. It now lists every resource the connection can redirect (drives, printers, clipboard, USB, etc.) with individual checkboxes, and &lt;strong&gt;every box is off by default&lt;/strong&gt;. Users have to opt in to each one on every connection, every time.&lt;/li&gt;
	&lt;li&gt;The trust criteria for signed &lt;code&gt;.rdp&lt;/code&gt; files tightened. Pre-April, a file signed by an untrusted cert got a yellow "Verify the publisher" banner. Post-April, the same file gets an orange "Caution: Unknown remote connection" banner — visually indistinguishable from an unsigned file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's what the new per-launch dialog looks like. For an unsigned file:&lt;/p&gt;

&lt;p style="text-align: center;"&gt;&lt;img alt="The RDP security warning dialog for an unsigned file: an orange 'Caution: Unknown remote connection' banner, 'Unknown publisher', and per-redirection checkboxes all off by default." src="https://cdn.finalbuilder.com/blog/daves/signotaur-rdp/unsigned-rdp-security-warning-dialog.png" /&gt;&lt;/p&gt;

&lt;p&gt;And for a file signed by a publisher Windows can verify:&lt;/p&gt;

&lt;p style="text-align: center;"&gt;&lt;img alt="The RDP security warning dialog for a signed file: a yellow 'Verify the publisher of this remote connection' banner with the publisher name, and the same per-redirection checkboxes." src="https://cdn.finalbuilder.com/blog/daves/signotaur-rdp/signed-rdp-security-warning-dialog.png" /&gt;&lt;/p&gt;

&lt;p&gt;Separately, the first time any user opens an &lt;code&gt;.rdp&lt;/code&gt; file after installing the update, Windows shows a one-time educational dialog explaining what &lt;code&gt;.rdp&lt;/code&gt; files are and why they can be dangerous:&lt;/p&gt;

&lt;p style="text-align: center;"&gt;&lt;img alt="The first-launch educational dialog shown once per user account after installing KB5083769, explaining what RDP files are and the associated phishing risks." src="https://cdn.finalbuilder.com/blog/daves/signotaur-rdp/rdp-first-launch-dialog.png" /&gt;&lt;/p&gt;

&lt;p&gt;Once dismissed, it doesn't reappear for that account.&lt;/p&gt;

&lt;p&gt;Discussion and lament: &lt;a href="https://www.reddit.com/r/sysadmin/comments/1sm61eo/fyi_microsoft_rdp_changes_with_april_cumulative/"&gt;r/sysadmin: FYI: Microsoft RDP changes with April cumulative&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is a genuinely good security change — the old dialog was vague and under-informed users about what was being shared with the remote host. It is also a rather annoying deployment change, because plenty of teams had &lt;code&gt;rdpsign.exe&lt;/code&gt;-signed files quietly working for years, and now they don't.&lt;/p&gt;

&lt;h2&gt;Why people got caught out&lt;/h2&gt;

&lt;p&gt;The usual story goes like this: a team signed their &lt;code&gt;.rdp&lt;/code&gt; file years ago with a self-signed or internal-CA certificate, shipped it to users, and it displayed a friendly yellow "Verify the publisher: Acme Corp" dialog that everyone clicked through. After April's update, the same file suddenly shows an orange "Unknown remote connection" dialog and support gets flooded. One representative example from the Reddit threads: &lt;a href="https://www.reddit.com/r/sysadmin/comments/1sp6h4x/comment/ohaenxv/"&gt;a sysadmin describing exactly this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The signatures on those files are still cryptographically valid. Windows is just stricter now about what counts as a "verified publisher" for RDP.&lt;/p&gt;

&lt;h2&gt;The actual recipe (no dialog at all)&lt;/h2&gt;

&lt;p&gt;Cutting through the noise, here's what recipient machines need for a signed &lt;code&gt;.rdp&lt;/code&gt; file to open with no warning dialog at all:&lt;/p&gt;

&lt;ol style="margin-left: 1.4em;  margin-bottom: 1em;"&gt;
	&lt;li&gt;The signing certificate's chain must terminate in a root the client machine trusts. Commercial code-signing certs (DigiCert, Sectigo, etc.) chain to roots Windows already trusts. For an internal CA or self-signed cert, the root has to be imported into &lt;code&gt;Cert:\*\Root&lt;/code&gt; on each client.&lt;/li&gt;
	&lt;li&gt;A Remote Desktop trust policy must be in place that whitelists your signing certificate's SHA-1 thumbprint. This lives at either &lt;code&gt;HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services&lt;/code&gt; (machine-wide, requires admin) or &lt;code&gt;HKCU\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services&lt;/code&gt; (per-user, no admin required), and needs two values:
	&lt;ul style="margin-bottom: 0.5em;"&gt;
		&lt;li&gt;&lt;code&gt;AllowSignedFiles&lt;/code&gt; — REG_DWORD, set to &lt;code&gt;1&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;TrustedCertThumbprints&lt;/code&gt; — REG_SZ, the SHA-1 thumbprint of your signing cert, uppercase, no spaces (semicolon-separated if you have more than one)&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A word of warning about one trap we hit: &lt;code&gt;TrustedCertThumbprints&lt;/code&gt; is a whitelist on top of normal chain validation, not a replacement for it. Dropping a self-signed cert's thumbprint into the list without also importing the cert into a trusted root store does nothing. If you've tried this and wondered why it didn't work, that's why.&lt;/p&gt;

&lt;h2&gt;What Signotaur does when you sign a .rdp file&lt;/h2&gt;

&lt;p&gt;Unlike &lt;code&gt;rdpsign.exe&lt;/code&gt;, Signotaur signs &lt;code&gt;.rdp&lt;/code&gt; files against a remote server — the private key stays on the server (or an HSM it's connected to), so no admin workstation or automation host needs a local copy of the signing certificate. This is the main reason to use Signotaur for &lt;code&gt;.rdp&lt;/code&gt; signing rather than running &lt;code&gt;rdpsign.exe&lt;/code&gt; directly.&lt;/p&gt;

&lt;p&gt;The mechanics otherwise match what you'd expect. The client reads the &lt;code&gt;.rdp&lt;/code&gt; file, canonicalises the contents, sends only the digest to the server for signing, and writes the signed file back in place. The output is byte-equivalent to &lt;code&gt;rdpsign.exe&lt;/code&gt;'s — same canonical form, same 12-byte Microsoft wrapper, same detached CMS structure — so recipients see the same Windows Remote Desktop Connection dialog regardless of which tool produced the signature.&lt;/p&gt;
        &lt;p&gt;RFC 3161 timestamping is supported, and the timestamp is embedded into the CMS in the standard way. But there's a caveat that's easy to miss: &lt;code&gt;mstsc.exe&lt;/code&gt; doesn't actually consult the timestamp when validating a &lt;code&gt;.rdp&lt;/code&gt; signature — it only checks whether the signing certificate is currently valid at the moment the file is opened. The strongest indirect evidence for this is that Microsoft's own &lt;code&gt;rdpsign.exe&lt;/code&gt; has no timestamping support at all — no &lt;code&gt;/tr&lt;/code&gt; flag, no timestamp in its output.&lt;/p&gt;
        &lt;p&gt;The timestamp is still worth having: it's standards-compliant CMS so general-purpose tools can read the signing time, it provides a tamper-evident audit trail, and it future-proofs against any future change in &lt;code&gt;mstsc&lt;/code&gt;'s behaviour. In practice though, plan to re-sign distributed &lt;code&gt;.rdp&lt;/code&gt; files when your signing certificate is renewed, the same way you would for an unsigned-but-distributed file.&lt;/p&gt;

&lt;p&gt;Because the registry recipe above is easy to get wrong, Signotaur also prints the recipe for you after signing, pre-filled with the thumbprint of the certificate that just signed the file. It tells you whether the cert is self-signed (in which case you'll also need to deploy the cert itself to recipient trusted-root stores) or chained (in which case you may not).&lt;/p&gt;

&lt;p&gt;If you're running &lt;code&gt;sign&lt;/code&gt; interactively on Windows, it also offers to apply the policy to &lt;code&gt;HKCU&lt;/code&gt; for the current user on the spot — no admin rights needed, no registry editor, no PowerShell snippet to copy-paste. This is mostly useful for confirming the signing works locally before you deploy the policy via GPO. In unattended runs, the prompt is automatically skipped, and you can pass &lt;code&gt;--no-mstsc-guidance&lt;/code&gt; (&lt;code&gt;--nmg&lt;/code&gt;) to suppress the whole lot if the log gets noisy.&lt;/p&gt;

&lt;h2&gt;An example&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;sign&lt;/code&gt; command detects &lt;code&gt;.rdp&lt;/code&gt; files automatically based on extension, so there's nothing special to type:&lt;/p&gt;

&lt;div&gt;
&lt;div class="syntaxhighlighter  bash" id="highlighter_rdpsign"&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td class="gutter"&gt;
			&lt;div class="line number1 index0 alt2"&gt;&gt;&lt;/div&gt;
			&lt;/td&gt;
			&lt;td class="code"&gt;
			&lt;div class="container"&gt;
			&lt;div class="line number1 index0 alt2"&gt;&lt;code class="bash plain"&gt;SignotaurTool.exe sign -a &lt;apikey&gt; -s &lt;signserver&gt; -t &lt;thumbprint&gt; --tr http://timestamp.digicert.com --td SHA256 connect-to-prod.rdp&lt;/thumbprint&gt;&lt;/signserver&gt;&lt;/apikey&gt;&lt;/code&gt;&lt;/div&gt;
			&lt;/div&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;After a successful sign you'll see something along the lines of:&lt;/p&gt;

&lt;pre style="margin-bottom: 1em;"&gt;
&lt;code&gt;RDP signing guidance (Windows Remote Desktop Connection compatibility, post-KB5083769):

By default recipients will see a "Verify the publisher" or "Unknown publisher"
warning dialog when opening this signed file in Windows Remote Desktop Connection.
To eliminate the warning, each recipient machine needs:

1. The signing certificate's chain trusted on the machine.
   For commercial certificates chaining to a Windows-preinstalled root, no action
   is required; internal-CA certificates require the CA to be imported into each
   recipient's Trusted Root store.

2. The signing certificate's thumbprint added to the Remote Desktop trust-publisher
   policy:

   Value: AllowSignedFiles (REG_DWORD) = 1
   Value: TrustedCertThumbprints (REG_SZ) = &lt;your_cert_thumbprint&gt;

Apply AllowSignedFiles + TrustedCertThumbprints to your current user registry now?
Useful for testing this signed .rdp locally. [y/N]:&lt;/your_cert_thumbprint&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Answer &lt;code&gt;y&lt;/code&gt; and it writes the values to your &lt;code&gt;HKCU&lt;/code&gt; — open the file in Remote Desktop Connection, confirm there's no dialog, and you know the signing bit is working before you take the policy near a GPO.&lt;/p&gt;

&lt;h2&gt;Deploying the policy to the fleet&lt;/h2&gt;

&lt;p&gt;For anything beyond a couple of machines, Group Policy is the right tool — it's also how you set these same values without touching the registry by hand. In the Group Policy Management Editor:&lt;/p&gt;

&lt;ul style="margin-bottom: 1em;"&gt;
	&lt;li&gt;Computer (or User) Configuration → Administrative Templates → Windows Components → Remote Desktop Services → Remote Desktop Connection Client&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Allow .rdp files from valid publishers and user's default .rdp settings&lt;/em&gt; → Enabled&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Specify SHA1 thumbprints of certificates representing trusted .rdp publishers&lt;/em&gt; → Enabled, with your thumbprints in the list (uppercase, semicolon-separated if multiple)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Intune has equivalent settings under the Administrative Templates profile. If you're deploying to a smaller set of machines, or scripting it, a PowerShell snippet that does the per-user version (no admin needed) looks like this:&lt;/p&gt;

&lt;div&gt;
&lt;div class="syntaxhighlighter  powershell" id="highlighter_psrecipe"&gt;
&lt;table border="0" cellpadding="0" cellspacing="0"&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td class="gutter"&gt;
			&lt;div class="line number1 index0 alt2"&gt;1&lt;/div&gt;

			&lt;div class="line number2 index1 alt1"&gt;2&lt;/div&gt;

			&lt;div class="line number3 index2 alt2"&gt;3&lt;/div&gt;

			&lt;div class="line number4 index3 alt1"&gt;4&lt;/div&gt;
			&lt;/td&gt;
			&lt;td class="code"&gt;
			&lt;div class="container"&gt;
			&lt;div class="line number1 index0 alt2"&gt;&lt;code class="powershell plain"&gt;$p = 'HKCU:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services'&lt;/code&gt;&lt;/div&gt;

			&lt;div class="line number2 index1 alt1"&gt;&lt;code class="powershell plain"&gt;New-Item -Path $p -Force | Out-Null&lt;/code&gt;&lt;/div&gt;

			&lt;div class="line number3 index2 alt2"&gt;&lt;code class="powershell plain"&gt;Set-ItemProperty -Path $p -Name AllowSignedFiles -Value 1 -Type DWord&lt;/code&gt;&lt;/div&gt;

			&lt;div class="line number4 index3 alt1"&gt;&lt;code class="powershell plain"&gt;Set-ItemProperty -Path $p -Name TrustedCertThumbprints -Value 'YOUR_THUMBPRINT_UPPERCASE' -Type String&lt;/code&gt;&lt;/div&gt;
			&lt;/div&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Swap &lt;code&gt;HKCU&lt;/code&gt; for &lt;code&gt;HKLM&lt;/code&gt; for the machine-wide version (and run elevated). The thumbprint must be uppercase with no spaces; use a semicolon to join multiple thumbprints if you have more than one signing cert in rotation.&lt;/p&gt;

&lt;h2&gt;What you still can't do&lt;/h2&gt;

&lt;p&gt;A few things worth knowing up front so you don't hunt for them:&lt;/p&gt;

&lt;ul style="margin-bottom: 1em;"&gt;
	&lt;li&gt;The per-redirection checkboxes in the new dialog are not controlled by &lt;code&gt;AllowSignedFiles&lt;/code&gt;. Even with a properly trusted and whitelisted signature, users still see the redirection dialog on first use. There's a separate set of policies for which redirections are allowed on the server side; the client-side checkboxes are a user-consent UI rather than a trust decision.&lt;/li&gt;
	&lt;li&gt;There's a temporary "revert to pre-April dialog" switch at &lt;code&gt;HKLM\Software\Policies\Microsoft\Windows NT\Terminal Services\Client\RedirectionWarningDialogVersion = 1&lt;/code&gt;. Don't rely on it — Microsoft has been explicit that it will be removed in a future update.&lt;/li&gt;
	&lt;li&gt;Windows has no built-in &lt;code&gt;.rdp&lt;/code&gt; signature verifier. &lt;code&gt;rdpsign.exe /v&lt;/code&gt; is "verbose", not "verify"; in practice the only verifier is Remote Desktop Connection opening the file. Signotaur's &lt;code&gt;verify&lt;/code&gt; command will validate the signature and cert chain offline if you want a CI-friendly check.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;If you'd rather not think about any of this&lt;/h2&gt;

&lt;p&gt;The short version: get a code-signing certificate from a public CA that chains to a Windows-preinstalled root, register it with your Signotaur server, sign your &lt;code&gt;.rdp&lt;/code&gt; files as part of your distribution workflow, and push the &lt;code&gt;AllowSignedFiles&lt;/code&gt; + &lt;code&gt;TrustedCertThumbprints&lt;/code&gt; policy out via GPO. After that, signed &lt;code&gt;.rdp&lt;/code&gt; files open with no dialog, and the next time Microsoft tightens the rules you've already done the trust-deployment work.&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;For command-line details and the full signing command reference see the &lt;a href="https://docs.finalbuilder.com/sn/1.0/"&gt;Signotaur documentation&lt;/a&gt;. If you run into something specific — especially if you have an internal CA or a less-common PKCS#11 token in play — our support team is happy to help.&lt;/p&gt;
</description><guid isPermaLink="false">882</guid></item><item><title>Managing Certificate and API Key Expiry with Signotaur</title><link>https://www.finalbuilder.com/resources/blogs/postid/879/managing-certificate-and-api-key-expiry-with-signotaur</link><category>.NET,Code Signing,Continua CI,Delphi,FinalBuilderSignotaur</category><pubDate>Fri, 13 Mar 2026 03:18:12 GMT</pubDate><description>&lt;style type="text/css"&gt;
	div.blog_content h1 { font-size: 1.9rem; margin-bottom: 0.3rem; }
    div.blog_content h2 { font-size: 1.4rem; margin-top: 2.2rem; border-bottom: 1px solid #e0e0e0; padding-bottom: 0.4rem; }
    div.blog_content h3 { font-size: 1.15rem; margin-top: 1.6rem; color: #222;}
    div.blog_content strong {  font-weight: 600;  color: #888;}
    div.blog_content .meta { color: #777; font-size: 0.9rem; margin-bottom: 2rem; }
    div.blog_content code { background: #f4f4f4; padding: 0.15em 0.4em; border-radius: 3px; font-size: 0.92em; }
    div.blog_content pre { background: #f4f4f4; padding: 1rem; border-radius: 5px; overflow-x: auto; }
    div.blog_content pre code { background: none; padding: 0; }
    div.blog_content a { color: #0066cc; }
    div.blog_content img { max-width: 100%; border: 1px solid #ddd; border-radius: 4px; margin: 1rem 0; }
    div.blog_content .note { background: #eef6ff; border-left: 4px solid #0066cc; padding: 0.8rem 1rem; margin: 1.2rem 0; border-radius: 0 4px 4px 0; }
    div.blog_content ol { margin: 1rem 0 1.5rem 1.5rem; padding-left: 0.5rem;}
    div.blog_content ol li {  margin-bottom: 0.7rem;  line-height: 1.6;}
    div.blog_content ol li strong {  font-weight: 600;}
    div.blog_content ul li {  margin-bottom: 0.45rem;}
&lt;/style&gt;
&lt;div class="note"&gt;&lt;strong&gt;In this article:&lt;/strong&gt;
&lt;ul&gt;
	&lt;li&gt;Why code signing certificates now expire sooner&lt;/li&gt;
	&lt;li&gt;How certificate labels remove thumbprints from build scripts&lt;/li&gt;
	&lt;li&gt;How to rotate and renew API keys safely&lt;/li&gt;
	&lt;li&gt;How to automate the process in Continua CI&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;h2&gt;Shorter Certificate Lifetimes Are Coming&lt;/h2&gt;

&lt;p&gt;Code signing certificates used to last up to three years. As of &lt;strong&gt;March 1, 2026&lt;/strong&gt;, that is no longer the case.&lt;/p&gt;

&lt;p&gt;The CA/Browser Forum adopted &lt;strong&gt;Ballot CSC-31&lt;/strong&gt; on November 17, 2025, reducing the maximum validity period for publicly-trusted code signing certificates from 39 months to &lt;strong&gt;460 days&lt;/strong&gt; (roughly 15 months). For most teams, that means certificate renewals are now an annual operational task rather than an occasional one.&lt;/p&gt;

&lt;p&gt;When a certificate is renewed, it receives a new thumbprint, and build scripts that reference the old thumbprint must be updated. In large CI/CD environments, tracking down every reference can be tedious and error-prone.&lt;/p&gt;

&lt;p&gt;Separately, API keys used by CI agents to authenticate with the signing server have their own lifecycle and eventually need to be rotated. Replacing them without interrupting active build pipelines can be challenging.&lt;/p&gt;

&lt;p&gt;Signotaur addresses both concerns. &lt;strong&gt;Label-based certificate selection&lt;/strong&gt; decouples build pipelines from individual certificates, while &lt;strong&gt;API key rotation with overlap&lt;/strong&gt; allows credentials to be replaced without downtime. Together they turn what used to be stressful maintenance tasks into routine operations.&lt;/p&gt;

&lt;h2&gt;Certificate Labels: Automatic Certificate Rotation&lt;/h2&gt;

&lt;h3&gt;The Thumbprint Problem&lt;/h3&gt;

&lt;p&gt;Traditionally, build scripts reference a code signing certificate by its SHA-1 thumbprint — a 40-character hex string that uniquely identifies the certificate. When you renew, you get a new certificate with a new thumbprint, so every script that signs code needs to be updated. If you sign across multiple CI configurations, that means tracking down and editing each one.&lt;/p&gt;

&lt;h3&gt;Labels to the Rescue&lt;/h3&gt;

&lt;p&gt;Signotaur lets you assign a &lt;strong&gt;label&lt;/strong&gt; to each registered certificate — for example, &lt;code&gt;production&lt;/code&gt; or &lt;code&gt;nightly&lt;/code&gt;. When you request a signing operation by label instead of thumbprint, Signotaur automatically selects the certificate with the &lt;strong&gt;latest expiry date&lt;/strong&gt; among all enabled, non-expired certificates that share that label. This ensures that newly issued certificates automatically take precedence.&lt;/p&gt;

&lt;p&gt;The rotation workflow is straightforward:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;Register your renewed certificate and assign it the same label as the outgoing one.&lt;/li&gt;
	&lt;li&gt;Builds automatically pick up the new certificate — no script changes required.&lt;/li&gt;
	&lt;li&gt;The old certificate expires naturally; remove it from Signotaur when you're ready.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Expiration Monitoring&lt;/h3&gt;

&lt;p&gt;Signotaur's background monitoring service checks certificate expiration &lt;strong&gt;daily&lt;/strong&gt; and sends email notifications to administrators at configurable intervals. The defaults are &lt;strong&gt;30, 14, 7, 3, and 1 day(s)&lt;/strong&gt; before expiry, with an additional alert if a certificate has already expired. You can customise these warning thresholds in the server configuration.&lt;/p&gt;

&lt;p&gt;During a rotation window — when both the old and new certificates are registered with the same label — the admin UI highlights the duplicate label so you can confirm the overlap is intentional.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Screenshot: Certificate list in the Signotaur admin UI showing two certificates sharing the 'production' label. The older certificate shows an expiry warning badge." src="https://cdn.finalbuilder.com/blog/daves/managing-certificate-and-api-key-expiry/screenshot-cert-labels.png" /&gt;&lt;/p&gt;

&lt;h2&gt;API Key Rotation with Overlap&lt;/h2&gt;

&lt;h3&gt;Why Rotate Keys?&lt;/h3&gt;

&lt;p&gt;API keys grant access to your signing service. If a key is leaked or reused indefinitely, it becomes a long-lived security risk. Regular rotation limits the impact if a key is compromised, satisfies compliance requirements, and handles natural key expiry gracefully. But naive rotation — revoke old, issue new — creates a window where CI agents holding the old key start failing.&lt;/p&gt;

&lt;h3&gt;How Signotaur Handles It&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;rotate-key&lt;/code&gt; command creates a new API key while keeping the old one valid for a configurable &lt;strong&gt;overlap period&lt;/strong&gt; of &lt;strong&gt;0–30 days&lt;/strong&gt; (default: &lt;strong&gt;7 days&lt;/strong&gt;). During this window, both keys are accepted, allowing CI agents and environments to transition without interruption.&lt;/p&gt;

&lt;p&gt;Once the overlap period expires, the old key is &lt;strong&gt;automatically revoked&lt;/strong&gt;. If you prefer to manage revocation manually, pass &lt;code&gt;--no-auto-revoke&lt;/code&gt; and the old key will remain valid until you explicitly revoke it.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Screenshot: API Keys page in the Signotaur admin UI showing a rotated key pair. The old key displays an 'Auto-revoke' date and the new key is marked as active." src="https://cdn.finalbuilder.com/blog/daves/managing-certificate-and-api-key-expiry/screenshot-api-key-rotation.png" /&gt;&lt;/p&gt;

&lt;h3&gt;Safety Guardrails&lt;/h3&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Role required&lt;/strong&gt; — users must be assigned the &lt;strong&gt;ApiKeyRotator&lt;/strong&gt; role before they can rotate keys. An administrator can assign this role in the Signotaur admin UI.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Rate limiting&lt;/strong&gt; — a maximum of 5 rotations per user per 24-hour period prevents accidental key sprawl.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Linear chain only&lt;/strong&gt; — a key that has already been rotated cannot be rotated again; you must use the successor key. This prevents branching into multiple active key chains.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Proactive expiry checking&lt;/strong&gt; — the sign command accepts a &lt;code&gt;--fail-if-expiring-within&lt;/code&gt; flag (e.g. &lt;code&gt;14d&lt;/code&gt;). If the API key used for signing will expire within that window, the command fails immediately with a clear message — catching the problem in CI before it causes a real signing failure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Conditional Rotation&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;--if-expiring-within&lt;/code&gt; flag on &lt;code&gt;rotate-key&lt;/code&gt; makes rotation idempotent: the key is only rotated if it expires within the specified duration (e.g. &lt;code&gt;14d&lt;/code&gt;, &lt;code&gt;1w&lt;/code&gt;, &lt;code&gt;24h&lt;/code&gt;). This makes it safe to run &lt;code&gt;rotate-key&lt;/code&gt; on every CI build or on a nightly schedule without generating unnecessary keys.&lt;/p&gt;

&lt;p&gt;Example scheduled rotation command:&lt;/p&gt;

&lt;pre&gt;
&lt;code&gt;signotaur rotate-key --if-expiring-within 14d&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Key Renewal&lt;/h3&gt;

&lt;p&gt;By default, a rotated key &lt;strong&gt;inherits the old key's expiry date&lt;/strong&gt;. If the old key had 30 days of validity remaining, the new key also expires in 30 days. Over time, repeatedly rotating a key gradually shortens its remaining lifetime — which can be a problem for long-running automation.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;--renew&lt;/code&gt; flag gives the new key a &lt;strong&gt;fresh validity period&lt;/strong&gt; starting from the rotation date, rather than inheriting whatever time was left on the old key. Without a value, it uses the server default of &lt;strong&gt;90 days&lt;/strong&gt;; with a value (e.g. &lt;code&gt;--renew 180d&lt;/code&gt;), it sets a specific duration up to a maximum of &lt;strong&gt;365 days&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This pairs naturally with conditional rotation — check whether the key is approaching expiry, and if so, rotate and renew in a single command:&lt;/p&gt;

&lt;pre&gt;
&lt;code&gt;signotaur rotate-key --if-expiring-within 14d --renew&lt;/code&gt;&lt;/pre&gt;

&lt;div class="note"&gt;If the renewal duration would be &lt;em&gt;shorter&lt;/em&gt; than the old key's remaining validity (for example renewing for 30 days when 60 days remain), the command fails as a safety measure. Pass &lt;code&gt;--allow-validity-reduction&lt;/code&gt; to override this check when the shorter duration is intentional.&lt;/div&gt;

&lt;h2&gt;Putting It Together in Continua CI&lt;/h2&gt;

&lt;p&gt;Continua CI ships dedicated &lt;strong&gt;Signotaur actions&lt;/strong&gt; for both signing and key rotation, so you can wire up the entire workflow without writing any custom scripts. Before configuring those actions, you'll need to assign a label to your certificates in the Signotaur admin UI.&lt;/p&gt;

&lt;h3&gt;Assigning a Label to Your Certificates&lt;/h3&gt;

&lt;p&gt;In the Signotaur admin UI, navigate to &lt;strong&gt;Certificates&lt;/strong&gt; and either add a new certificate or edit an existing one. In the certificate dialog you'll find two name fields:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Alias&lt;/strong&gt; — a unique display name for the certificate (auto-generated by default, e.g. "CodeSigningCert (2027-12-31)").&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Label&lt;/strong&gt; — an optional identifier used for CLI and CI/CD certificate selection, e.g. &lt;code&gt;production&lt;/code&gt;. Multiple certificates can share the same label. Matching is case-insensitive, so &lt;code&gt;Production&lt;/code&gt; and &lt;code&gt;production&lt;/code&gt; resolve the same way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you renew a certificate, register the new one and assign it the same label as the outgoing certificate. The admin UI will show an orange notice confirming that multiple active certificates share the label and that the one with the latest expiry will be selected automatically. No build script changes needed.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Screenshot: Signotaur certificate edit dialog showing the Alias and Label fields. The Label field is set to 'production'." src="https://cdn.finalbuilder.com/blog/daves/managing-certificate-and-api-key-expiry/screenshot-cert-edit-label.png" /&gt;&lt;/p&gt;

&lt;p&gt;For full details, see the &lt;a href="https://docs.finalbuilder.com/sn/1.0/server/admin/certificates/certificates.html"&gt; Certificates documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Setting Up the Rotate Keys Action&lt;/h3&gt;

&lt;p&gt;Add the &lt;strong&gt;Signotaur Rotate Keys&lt;/strong&gt; action to a stage — either in a scheduled maintenance configuration or directly in your build configuration. With the &lt;strong&gt;If Expiring Within&lt;/strong&gt; condition the action only rotates the key when expiry is approaching, so it can safely run on every build.&lt;/p&gt;

&lt;p&gt;The action is organised into several tabs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signotaur Rotate Keys tab&lt;/strong&gt; — configure &lt;strong&gt;Overlap Days&lt;/strong&gt; (how long the old key remains valid alongside the new one, default 7) and whether to &lt;strong&gt;Disable auto-revocation&lt;/strong&gt; if you prefer to revoke old keys manually.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Screenshot: Continua CI Signotaur Rotate Keys action — Main tab showing Overlap Days and Disable auto-revocation options." src="https://cdn.finalbuilder.com/blog/daves/managing-certificate-and-api-key-expiry/screenshot-rotate-keys-main.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server tab&lt;/strong&gt; — set the &lt;strong&gt;Server URL&lt;/strong&gt; for your Signotaur instance and the &lt;strong&gt;API Key Source&lt;/strong&gt;. Select &lt;em&gt;Value (from variable)&lt;/em&gt; and reference a server variable (e.g. &lt;code&gt;%SignotaurAPIKey%&lt;/code&gt;) to avoid hard-coding keys in the action.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Screenshot: Continua CI Signotaur Rotate Keys action — Server tab showing Server URL and API Key Source set to a server variable." src="https://cdn.finalbuilder.com/blog/daves/managing-certificate-and-api-key-expiry/screenshot-rotate-keys-server.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conditions tab&lt;/strong&gt; — set &lt;strong&gt;If Expiring Within&lt;/strong&gt; to make the rotation conditional (e.g. &lt;code&gt;14d&lt;/code&gt; to only rotate if expiry is within two weeks). Enable &lt;strong&gt;Ignore already rotated error&lt;/strong&gt; to safely run the action in concurrent CI builds without failure if the key was already rotated by another build.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Screenshot: Continua CI Signotaur Rotate Keys action — Conditions tab showing If Expiring Within and Ignore already rotated error options." src="https://cdn.finalbuilder.com/blog/daves/managing-certificate-and-api-key-expiry/screenshot-rotate-keys-conditions.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Renewal tab&lt;/strong&gt; — enable the &lt;strong&gt;Renew&lt;/strong&gt; checkbox to give the new key a fresh validity period instead of inheriting the old key's remaining lifetime. Set a specific &lt;strong&gt;Renew Duration&lt;/strong&gt; (e.g. &lt;code&gt;90d&lt;/code&gt;), or leave it blank to use the server default. Check &lt;strong&gt;Allow validity reduction&lt;/strong&gt; if the renewal duration may be shorter than the old key's remaining validity.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Screenshot: Continua CI Signotaur Rotate Keys action — Renewal tab showing Renew checkbox, Renew Duration, and Allow validity reduction options." src="https://cdn.finalbuilder.com/blog/daves/managing-certificate-and-api-key-expiry/screenshot-rotate-keys-renewal.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output tab&lt;/strong&gt; — choose &lt;strong&gt;Set Variable&lt;/strong&gt; as the output destination and select a &lt;strong&gt;Server variable&lt;/strong&gt; to store the new key. This way your sign actions automatically pick up the rotated key without any manual updates.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Screenshot: Continua CI Signotaur Rotate Keys action — Output tab with Set Variable selected, storing the new key in a server-scoped variable." src="https://cdn.finalbuilder.com/blog/daves/managing-certificate-and-api-key-expiry/screenshot-rotate-keys-output.png" /&gt;&lt;/p&gt;

&lt;p&gt;Full documentation: &lt;a href="https://docs.finalbuilder.com/ci/1.0/user-guide/actions/signing-actions/signotaur-rotate-keys-action.html"&gt; Signotaur Rotate Keys Action &lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Setting Up the Sign Action with Label Selection&lt;/h3&gt;

&lt;p&gt;Add the &lt;strong&gt;Signotaur Sign&lt;/strong&gt; action to your build stage, after compilation and before packaging.&lt;/p&gt;

&lt;p&gt;Key fields:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Files to Sign&lt;/strong&gt; — glob patterns for your build output, e.g. &lt;code&gt;**/*.exe&lt;/code&gt;, &lt;code&gt;**/*.dll&lt;/code&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Certificate Selection Mode&lt;/strong&gt; — set to &lt;strong&gt;Label&lt;/strong&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Label&lt;/strong&gt; — your shared label, e.g. &lt;code&gt;production&lt;/code&gt;. Signotaur will automatically select the certificate with the latest expiry date.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;API Key Source&lt;/strong&gt; — point to the server variable populated by the Rotate Keys action, or a securely stored key.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Fail If Expiring Within&lt;/strong&gt; — e.g. &lt;code&gt;14d&lt;/code&gt;. If the API key expires within two weeks, the action fails early so you can rotate before it becomes a blocker.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Timestamp Server &amp; Digest&lt;/strong&gt; — configure your preferred timestamping authority and hash algorithm.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot: Continua CI Signotaur Sign action — Certificate tab showing Selection Mode set to Label with value 'production'." src="https://cdn.finalbuilder.com/blog/daves/managing-certificate-and-api-key-expiry/screenshot-sign-certificate.png" /&gt; 
&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot: Continua CI Signotaur Sign action — Server tab showing Fail If Expiring Within set to '14d'." src="https://cdn.finalbuilder.com/blog/daves/managing-certificate-and-api-key-expiry/screenshot-sign-server.png" /&gt;&lt;/p&gt;

&lt;p&gt;Full documentation: &lt;a href="https://docs.finalbuilder.com/ci/1.0/user-guide/actions/signing-actions/signotaur-sign-action.html"&gt; Signotaur Sign Action &lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Typical Rotation Workflow&lt;/h2&gt;

&lt;p&gt;In practice, certificate and API key rotation can be handled with a small amount of scheduled automation in your CI system.&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Register renewed certificates&lt;/strong&gt; in Signotaur and assign them the same label as the previous certificate.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;CI builds continue using the label&lt;/strong&gt;, automatically selecting the certificate with the latest expiry date.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Schedule periodic API key checks&lt;/strong&gt; using the &lt;code&gt;rotate-key --if-expiring-within&lt;/code&gt; option.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;The new key is written to a CI server variable&lt;/strong&gt;, allowing build pipelines to automatically use the rotated key.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Use &lt;code&gt;--renew&lt;/code&gt;&lt;/strong&gt; so rotated keys receive a fresh validity period rather than inheriting the old key's remaining lifetime.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Retire old certificates and keys&lt;/strong&gt; once they are no longer needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Wrapping Up&lt;/h2&gt;

&lt;p&gt;With code signing certificate lifetimes dropping to roughly 15 months, the days of "set it and forget it" certificate management are over. Signotaur's label-based signing means your CI/CD pipelines don't need to know — or care — which specific certificate is current. And overlap-based API key rotation ensures you can swap credentials without any signing downtime.&lt;/p&gt;

&lt;p&gt;These features are already available in Signotaur. If you're evaluating it, check out the &lt;a href="https://docs.finalbuilder.com/signotaur/1.0/"&gt;Signotaur documentation&lt;/a&gt; to get started.&lt;/p&gt;
</description><guid isPermaLink="false">879</guid></item><item><title>ClickOnce and VSTO Application Signing with Signotaur</title><link>https://www.finalbuilder.com/resources/blogs/postid/876/clickonce-and-vsto-application-signing-with-signotaur</link><category>.NET,Code Signing,Continua CI,Delphi,Deployment,Signotaur</category><pubDate>Tue, 14 Oct 2025 00:23:40 GMT</pubDate><description>&lt;p&gt;&lt;/p&gt;&lt;p&gt;If you've been working with ClickOnce or VSTO applications, you know that signing them isn't quite like signing a regular executable. We're pleased to announce that Signotaur now handles ClickOnce and VSTO application signing, taking care of the manifest orchestration so you don't have to.&lt;/p&gt;

        &lt;h2&gt;What Makes ClickOnce and VSTO Different?&lt;/h2&gt;
        
        &lt;p&gt;When you sign a standard executable or DLL, you're dealing with a single file. The process is straightforward: calculate a hash, sign it, embed the signature. One file, one operation.&lt;/p&gt;
        
        &lt;p&gt;ClickOnce and VSTO applications are a different beast entirely. These deployment packages consist of multiple files tied together by manifest files that describe the application structure, dependencies, and deployment configuration. The challenge? Everything needs to be signed in a specific order, and those manifests need to be updated with new hash values after each signing operation.&lt;/p&gt;
        
        &lt;p&gt;Here's what's happening under the hood:&lt;/p&gt;
        &lt;ol style="margin-left: 1.4em;  margin-bottom: 1em;"&gt;
            &lt;li&gt;&lt;strong&gt;Application files&lt;/strong&gt; get signed first (your assemblies, dependencies, etc.)&lt;/li&gt;
            &lt;li&gt;The &lt;strong&gt;application manifest (.manifest)&lt;/strong&gt; needs to be updated with the new hash values of those signed files&lt;/li&gt;
            &lt;li&gt;Then the application manifest itself gets signed&lt;/li&gt;
            &lt;li&gt;The &lt;strong&gt;deployment manifest (.application)&lt;/strong&gt; needs to be updated with the hash of the signed application manifest&lt;/li&gt;
            &lt;li&gt;Finally, the deployment manifest gets signed&lt;/li&gt;
        &lt;/ol&gt;
        
        &lt;p&gt;Miss a step or do things out of order, and Windows will reject your deployment package. It's tedious and error prone to manage manually, which is exactly why we've automated it.&lt;/p&gt;

        &lt;h2&gt;Certificate Requirements&lt;/h2&gt;
        
        &lt;p&gt;ClickOnce and VSTO signing requires an RSA certificate with specific characteristics:&lt;/p&gt;
        
        &lt;ul style="margin-bottom: 1em;"&gt;
            &lt;li&gt;&lt;strong&gt;Algorithm&lt;/strong&gt;: RSA only (ECC/ECDSA certificates are not supported by the ClickOnce/VSTO signing infrastructure)&lt;/li&gt;
            &lt;li&gt;&lt;strong&gt;Key size&lt;/strong&gt;: Minimum 2048 bits, though 3072 bits is recommended for better security&lt;/li&gt;
            &lt;li&gt;&lt;strong&gt;Certificate type&lt;/strong&gt;: Must be a code signing certificate (Authenticode) from a trusted Certificate Authority&lt;/li&gt;
            &lt;li&gt;&lt;strong&gt;Key storage&lt;/strong&gt;: Since June 2023, CA/B Forum requirements mandate that private keys be stored on secure hardware (USB tokens or HSMs)&lt;/li&gt;
        &lt;/ul&gt;
        
        &lt;p&gt;Signotaur supports all of these requirements, whether your certificates are stored on YubiKeys, SafeNet tokens, other PKCS#11 HSMs, or in the Windows Certificate Store.&lt;/p&gt;

        &lt;h2&gt;The Publisher Name Challenge&lt;/h2&gt;
        
        &lt;p&gt;Getting the manifests signed is only half the battle. Making your application display the proper publisher name instead of "Unknown Publisher" during installation is notoriously tricky. Even with a properly signed application, several factors can cause Windows to show "Unknown Publisher":&lt;/p&gt;
        
        &lt;ul style="margin-bottom: 1em;"&gt;
            &lt;li&gt;Certificate chain issues (missing intermediate certificates)&lt;/li&gt;
            &lt;li&gt;Publisher name in the deployment manifest not matching the certificate's Common Name exactly&lt;/li&gt;
            &lt;li&gt;Whitespace differences introduced during the signing process&lt;/li&gt;
            &lt;li&gt;Self-signed or test certificates (which will always show as unknown)&lt;/li&gt;
            &lt;li&gt;Certificate not from a trusted root CA&lt;/li&gt;
        &lt;/ul&gt;
        
        &lt;p&gt;When everything is configured correctly, users see a clean installation prompt with your verified publisher information:&lt;/p&gt;
        
        &lt;p style="text-align: center;"&gt;&lt;img src="https://cdn.finalbuilder.com/blog/daves/signotaur-clickonce/verified-publisher-install.png" alt="Application Install window showing verified publisher details"&gt;&lt;/p&gt;
        
        &lt;p&gt;When something's wrong — even if the manifests are technically signed — users see the dreaded "Unknown Publisher" warning:&lt;/p&gt;
        
        &lt;p style="text-align: center;"&gt;&lt;img src="https://cdn.finalbuilder.com/blog/daves/signotaur-clickonce/unknown-publisher-install.png" alt="Application Install window showing Unknown Publisher warning"&gt;&lt;/p&gt;
        
        &lt;p&gt;This is why using certificates from trusted CAs and ensuring proper manifest configuration is so important. Signotaur handles all the signing mechanics correctly so all you need to display the verified publisher name is a valid certificate from a publicly trusted Certificate Authority.&lt;/p&gt;

        &lt;h2&gt;Signing Made Simple&lt;/h2&gt;
        
        &lt;p&gt;To sign a ClickOnce or VSTO application, you only need to point Signotaur at the deployment manifest:&lt;/p&gt;
        &lt;div&gt;&lt;div id="highlighter_119824" class="syntaxhighlighter  xml"&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;div class="line number1 index0 alt2"&gt;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="container"&gt;&lt;div class="line number1 index0 alt2"&gt;&lt;code class="xml plain"&gt;SignotaurTool.exe sign -a &lt;APIKey&gt; -s &lt;SignServer&gt; -t &lt;Thumbprint&gt; --tr &lt;TimeStampServer&gt; --td SHA256 path\to\MyApp.application&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;
        
        &lt;p&gt;Signotaur will parse the manifest, identify all the files that are part of the application, sign them in the correct order, and update the hash values throughout the manifest chain. Any files sitting in the deployment folder that aren't referenced in the manifest will be ignored, even if they match your file spec. This keeps things clean and ensures only application files get signed.&lt;/p&gt;

        &lt;h2&gt;Command-Line Parameters&lt;/h2&gt;
        
        &lt;p&gt;We've added a new &lt;em&gt;--application-name&lt;/em&gt; parameter specifically for ClickOnce and VSTO deployments. This value appears in the Windows Start menu when users install your application, giving it a proper identity in the system.&lt;/p&gt;
        
        &lt;p&gt;The existing &lt;em&gt;--description&lt;/em&gt; and &lt;em&gt;--description-url&lt;/em&gt; parameters are used to populate the publisher name and support URL in the deployment manifest. This means if you're already using these parameters for other signing operations, your scripts should work with minimal changes.&lt;/p&gt;

        &lt;h2&gt;What This Means for Your Build Process&lt;/h2&gt;
        
        &lt;p&gt;If you've been juggling multiple tools or scripts to handle ClickOnce and VSTO signing, you can simplify your build pipeline. Signotaur handles the entire process as a single operation, maintaining the correct signing order and manifest updates automatically. This is particularly useful in CI/CD environments where you need reliable, repeatable signing without manual intervention.&lt;/p&gt;
        
        &lt;p&gt;The usual benefits of Signotaur apply here: your certificates stay securely on the server, private keys never travel over the network, and the command-line interface integrates cleanly with your existing build scripts.&lt;/p&gt;

        &lt;hr&gt;
        
        &lt;p&gt;For detailed command-line syntax and examples, check out the &lt;a href="https://docs.finalbuilder.com/sn/1.0/"&gt;Signotaur documentation&lt;/a&gt;. If you run into any issues or have questions about signing ClickOnce or VSTO applications, our support team is here to help.&lt;/p&gt;</description><guid isPermaLink="false">876</guid></item><item><title>Continua CI System Server Properties</title><link>https://www.finalbuilder.com/resources/blogs/postid/844/continua-ci-server-properties</link><category>Continua CI,Delphi,FinalBuilder,General</category><pubDate>Thu, 13 May 2021 12:59:28 GMT</pubDate><description>&lt;p&gt;If you are using Continua for your CI, (and if not why not?) ensure that you check out &lt;a href="https://wiki.finalbuilder.com/x/BYDp"&gt;System Server Properties&lt;/a&gt;. These allow access to global settings which do not fit on any existing page.&lt;/p&gt;
&lt;p&gt;They can be used to configure several aspects of the UI and build process to fit your team preferences. This could simply be the number items to show per page on each of the dashboard views (&lt;em&gt;Server.ProjectsView.*.PageSize&lt;/em&gt;), or more complex patterns for detecting errors and warnings in actions settings (&lt;em&gt;Actions.Messages.*Patterns&lt;/em&gt;). Some system server properties are rarely needed, but some can be considered essential, such as &lt;em&gt;Server.HostUrl&lt;/em&gt; which can be used to ensure the links in notifications go to the correct external host name.&lt;/p&gt;

&lt;p&gt;We have recently added some new server properties which allow you to control the tabs on the Queue Options dialog (&lt;em&gt;Server.QueueOptionsDialog.*&lt;/em&gt;) and create a banner for displaying a message to all (or a subset of) users (&lt;em&gt;Server.Banner.*&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Here is the result of changing &lt;em&gt;Server.QueueOptionsDialog.TabSequence&lt;/em&gt; from "Variables,Repositories,Options"&lt;/p&gt;

&lt;p&gt;&lt;img alt="Queue Options dialog tabs - Variables first" src="https://cdn.finalbuilder.com/blog/daves/serverprops/queueoptionsvariablesfirst.png" /&gt;&lt;/p&gt;

&lt;p&gt;to "Repositories,Variables,Options".&lt;/p&gt;

&lt;p&gt;&lt;img alt="Queue Options dialog tabs - Variables first" src="https://cdn.finalbuilder.com/blog/daves/serverprops/queueoptionsrepositoriesfirst.png" /&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;This is what happens to an existing banner when you change the &lt;em&gt;Server.Banner.MessageType&lt;/em&gt; from "Information"&lt;/p&gt;

&lt;p&gt;&lt;img alt="Information Banner" src="https://cdn.finalbuilder.com/blog/daves/serverprops/informationbanner.png" /&gt;&lt;/p&gt;

&lt;p&gt;to "Warning".&lt;/p&gt;

&lt;p&gt;&lt;img alt="Warning Banner" src="https://cdn.finalbuilder.com/blog/daves/serverprops/warningbanner.png" /&gt;&lt;/p&gt;

&lt;p&gt;Server properties can be edited on the "Continua Server - Properties" page located in the "Administration" section of Continua CI. See our documentation for &lt;a href="https://wiki.finalbuilder.com/x/BYDp"&gt;details on all the currently available server properties&lt;/a&gt;.&lt;/p&gt;
</description><guid isPermaLink="false">844</guid></item><item><title>Announcing the Release of Continua CI Version 1.9.2</title><link>https://www.finalbuilder.com/resources/blogs/postid/840/introducing-the-release-of-continua-ci-version-192</link><category>Continua CI,Delphi</category><pubDate>Mon, 09 Nov 2020 06:16:32 GMT</pubDate><description>&lt;p&gt;We are delighted to announce that &lt;a href="/downloads/continuaci/continua-ci-version-history-v192" target="_blank"&gt;version 1.9.2 of Continua CI&lt;/a&gt; has passed through the beta and release candidate stages, and has now been released. Here is a reminder of the new features in v1.9.2:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href="#export-and-import"&gt;&lt;b&gt;Export and Import&lt;/b&gt;&lt;/a&gt;: You can now export one or more configurations to a file and import them back from the file into Continua CI.&lt;/li&gt;
	&lt;li&gt;&lt;a href="#requeuing-stages"&gt;&lt;b&gt;Requeuing Stages&lt;/b&gt;&lt;/a&gt;: Requeue a failing stage without restarting the build.&lt;/li&gt;
	&lt;li&gt;&lt;a href="#multiple-daily-cleanup-rules"&gt;&lt;b&gt;Multiple Daily Cleanup Rules&lt;/b&gt;&lt;/a&gt;: Each type of build by-product can now have a different shelf life.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;&lt;a name="export-and-import"&gt;Export and Import&lt;/a&gt; &lt;a class="up-link" href="#" title="Go to top"&gt;&lt;img src="https://cdn.finalbuilder.com/i/up-icn.png" /&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Users with Configuration Edit permissions can now export one or more project configurations to a YAML or JSON file. This may be for backup, versioning or migration to another server.&lt;/p&gt;

&lt;p&gt;The export wizard has a number of steps allowing selection of one or more configurations, and also any related repositories, variables and shared resources.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Export Wizard - Configuration Selection" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/export_resized.png" /&gt;&lt;/p&gt;

&lt;p&gt;The configuration details can be exported to YAML or JSON file formats, according to your preferences for readability and differencing.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Export Wizard - File Details" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/export-file-details_resized.png" /&gt;&lt;/p&gt;

&lt;p&gt;The resultant file is downloaded to your computer, allowing you to file it away until you need it.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Export Wizard - Downloaded File" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/export-download.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt="Export Wizard - YAML" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/export-yaml.png" /&gt;&lt;/p&gt;

&lt;p&gt;The import wizard also consists of several steps, allowing users with Project Edit permissions to upload a file, ...&lt;/p&gt;

&lt;p&gt;&lt;img alt="Import Wizard - File Selection" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/import-file-details_resized.png" /&gt;&lt;/p&gt;

&lt;p&gt;choose which items in the file to import and whether to overwrite any existing matching items of create new items.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Import Wizard - Configuration Selection" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/import-configurations_resized.png" /&gt;&lt;/p&gt;

&lt;p&gt;The import runs in a transaction, so if any modified file content fails validation it will rollback...&lt;/p&gt;

&lt;p&gt;&lt;img alt="Import Wizard - Import Failed" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/import-failed_resized.png" /&gt;&lt;/p&gt;

&lt;p&gt;allowing you to make changes and retry.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Export Wizard - Import Complete" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/import-complete_resized.png" /&gt;&lt;/p&gt;

&lt;h2&gt;&lt;a name="requeuing-stages"&gt;Requeuing Stages&lt;/a&gt; &lt;a class="up-link" href="#" title="Go to top"&gt;&lt;img src="https://cdn.finalbuilder.com/i/up-icn.png" /&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Sometimes a build stage may fail due to external influences. It could be that a file server was offline, network connectivity was down, or a file was locked for access. If it has taken several long stages to get to this point, then having to run the whole build again from the start can be a pain.&lt;/p&gt;

&lt;p&gt;The last stage of a completed build can now be requeued, providing that it has failed, stopped or errored, and the server workspace is intact.&lt;/p&gt;

&lt;p&gt;If no parts of the server workspace have been removed by the cleanup process, then a Requeue Stage button will be shown after the last stage in the Stages list on the Build page.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Action list categories" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/requeue-stage-button.png" /&gt;&lt;/p&gt;

&lt;p&gt;This allows you to requeue and execute the stage again!&lt;/p&gt;

&lt;p&gt;&lt;img alt="Action list search" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/requeue-stage-running.png" /&gt;&lt;/p&gt;

&lt;p&gt;You can also optionally make changes to the stage actions and requeue the stage with the latest changes.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Stages" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/requeue-stage-dialog.png" /&gt;&lt;/p&gt;

&lt;h2&gt;&lt;a name="multiple-daily-cleanup-rules"&gt;Multiple Daily Cleanup Rules&lt;/a&gt; &lt;a class="up-link" href="#" title="Go to top"&gt;&lt;img src="https://cdn.finalbuilder.com/i/up-icn.png" /&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Every build that is executed within Continua CI stores information in the server's workspace, such as artifacts and build logs, and entries in the database. These by-products are vital for executing your build process and tracking build information, however, they can also take up considerable disk space over time and have a negative impact on database performance. The cleanup settings define the shelf life for the build by-products.&lt;/p&gt;

&lt;p&gt;Up until now, the cleanup settings have been quite limited - you could set up a single policy per configuration defining the build age and build limits for cleaning up either the database, the workspace, or both. Often, however you would want to cleanup the workspace files to save space, well before removing the build from the database. This update allows you to define multiple cleanup rules, with different shelf lives for each type of build by-product.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Cleanup rules" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/cleanuprules_resized.png" /&gt;&lt;/p&gt;

&lt;p&gt;Each rule can include one or more by-product to clean up.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Cleanup rules dialog" class="dropShadow" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2-release/cleanuprule.png" /&gt;&lt;/p&gt;

&lt;p&gt;Download the installers for Continua CI v1.9.2 from the &lt;a href="/downloads/continuaci" target="_blank"&gt;Downloads&lt;/a&gt; page&lt;/p&gt;
&lt;style type="text/css"&gt;ul.horizontal {
		overflow: auto;
		margin: 10px 0 0 0;
		}
		ul.horizontal li {
			  float: left;
			  margin-left: 2em
		}
.syntaxhighlighter {
    background-color: #eee !important;
    margin-top: 0 !important;
    padding: 10px;
    outline-style: dashed;
    outline-width: 1px;
    outline-color: #666;
    width: 97% !important;
}
.syntaxhighlighter .line.alt2 {
    background-color: #eee !important;
}
.syntaxhighlighter table td.code
{
    overflow-y: hidden !important;
}
.syntaxhighlighter .plain, .syntaxhighlighter .plain a
{
    color: #639099 !important;
}
h1 { margin-bottom: 0.6em !important;
}

.up-link {
 float: right
}

img.dropShadow
{
  -webkit-filter: drop-shadow(5px 5px 5px #222);
  filter: drop-shadow(5px 5px 5px #222);
  margin-bottom: 1em;
}
&lt;/style&gt;
</description><guid isPermaLink="false">840</guid></item><item><title>Introducing Continua CI Version 1.9.2 Beta</title><link>https://www.finalbuilder.com/resources/blogs/postid/839/introducing-continua-ci-version-192-beta</link><category>Continua CI,Delphi</category><pubDate>Sun, 30 Aug 2020 14:12:26 GMT</pubDate><description>&lt;p&gt;We are delighted to announce a new &lt;a href="/downloads/continuaci/continua-ci-version-history-v192" target="_blank"&gt;beta release&lt;/a&gt; of Continua CI. We have added the following new features:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href="#export-and-import"&gt;&lt;b&gt;Export and Import&lt;/b&gt;&lt;/a&gt;: You can now export one or more configurations to a file and import them back from the file into Continua CI.&lt;/li&gt;
	&lt;li&gt;&lt;a href="#requeuing-stages"&gt;&lt;b&gt;Requeuing Stages&lt;/b&gt;&lt;/a&gt;: Requeue a failing stage without restarting the build.&lt;/li&gt;
	&lt;li&gt;&lt;a href="#multiple-daily-cleanup-rules"&gt;&lt;b&gt;Multiple Daily Cleanup Rules&lt;/b&gt;&lt;/a&gt;: Each type of build by-product can now have a different shelf life.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;&lt;a name="export-and-import"&gt;Export and Import&lt;/a&gt; &lt;a class="up-link" href="#" title="Go to top"&gt;&lt;img src="https://cdn.finalbuilder.com/i/up-icn.png" /&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Administrators can now export one or more project configurations to a YAML or JSON file. This may be for backup, versioning or migration to another server.&lt;/p&gt;

&lt;p&gt;The export wizard has a number of steps allowing selection of one or more configurations, and also any related repositories, variables and shared resources.&lt;/p&gt;

&lt;p&gt;&lt;img class="dropShadow" alt="Export Wizard - Configuration Selection" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/export_resized.png" /&gt;&lt;/p&gt;

&lt;p&gt;The configuration details can be exported to YAML or JSON file formats, according to your preferences for readability and differencing.&lt;/p&gt;

&lt;p&gt;&lt;img class="dropShadow" alt="Export Wizard - File Details" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/export-file-details_resized.png" /&gt;&lt;/p&gt;

&lt;p&gt;The resultant file is downloaded to your computer, allowing you to file it away until you need it.&lt;/p&gt;  

&lt;p&gt;&lt;img class="dropShadow" alt="Export Wizard - Downloaded File" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/export-download.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class="dropShadow" alt="Export Wizard - YAML" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/export-yaml.png" /&gt;&lt;/p&gt;

&lt;p&gt;The import wizard also consists of several steps, allowing you to upload a file, ... &lt;/p&gt;

&lt;p&gt;&lt;img class="dropShadow" alt="Import Wizard - File Selection" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/import-file-details_resized.png" /&gt;&lt;/p&gt;

&lt;p&gt;choose which items in the file to import and whether to overwrite any existing matching items of create new items.&lt;/p&gt;

&lt;p&gt;&lt;img class="dropShadow" alt="Import Wizard - Configuration Selection" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/import-configurations_resized.png" /&gt;&lt;/p&gt;

&lt;p&gt;The import runs in a transaction, so if any modified file content fails validation it will rollback...&lt;/p&gt;  

&lt;p&gt;&lt;img class="dropShadow" alt="Import Wizard - Import Failed" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/import-failed_resized.png" /&gt;&lt;/p&gt;

&lt;p&gt;allowing you to make changes and retry.&lt;/p&gt;  

&lt;p&gt;&lt;img class="dropShadow" alt="Export Wizard - Import Complete" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/import-complete_resized.png" /&gt;&lt;/p&gt;

&lt;h2&gt;&lt;a name="requeuing-stages"&gt;Requeuing Stages&lt;/a&gt; &lt;a class="up-link" href="#" title="Go to top"&gt;&lt;img src="https://cdn.finalbuilder.com/i/up-icn.png" /&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Sometimes a build stage may fail due to external influences. It could be that a file server was offline, network connectivity was down, or a file was locked for access. If it has taken several long stages to get to this point, then having to run the whole build again from the start can be a pain.&lt;/p&gt;

&lt;p&gt;The last stage of a completed build can now be requeued, providing that it has failed, stopped or errored, and the server workspace is intact.&lt;/p&gt;

&lt;p&gt;If no parts of the server workspace have been removed by the cleanup process, then a Requeue Stage button will be shown after the last stage in the Stages list on the Build page.&lt;/p&gt;

&lt;p&gt;&lt;img class="dropShadow" alt="Action list categories" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/requeue-stage-button.png" /&gt;&lt;/p&gt;

&lt;p&gt;This allows you to requeue and execute the stage again!&lt;/p&gt;

&lt;p&gt;&lt;img class="dropShadow" alt="Action list search" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/requeue-stage-running.png" /&gt;&lt;/p&gt;

&lt;p&gt;You can also optionally make changes to the stage actions and requeue the stage with the latest changes.&lt;/p&gt;

&lt;p&gt;&lt;img class="dropShadow" alt="Stages" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/requeue-stage-dialog.png" /&gt;&lt;/p&gt;

&lt;h2&gt;&lt;a name="multiple-daily-cleanup-rules"&gt;Multiple Daily Cleanup Rules&lt;/a&gt; &lt;a class="up-link" href="#" title="Go to top"&gt;&lt;img src="https://cdn.finalbuilder.com/i/up-icn.png" /&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Every build that is executed within Continua CI stores information in the server's workspace, such as artifacts and build logs, and entries in the database. These by-products are vital for executing your build process and tracking build information, however, they can also take up considerable disk space over time and have a negative impact on database performance. The cleanup settings define the shelf life for the build by-products.&lt;/p&gt;

&lt;p&gt;Up until now, the cleanup settings have been quite limited - you could set up a single policy per configuration defining the build age and build limits for cleaning up either the database, the workspace, or both. Often, however you would want to cleanup the workspace files to save space, well before removing the build 
from the database. This update allows you to define multiple cleanup rules, with different shelf lives for each type of build by-product. &lt;/p&gt;

&lt;p&gt;&lt;img class="dropShadow" alt="Cleanup rules" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/cleanuprules_resized.png" /&gt;&lt;/p&gt;

&lt;p&gt;Each rule can include one or more by-product to clean up.&lt;/p&gt; 

&lt;p&gt;&lt;img class="dropShadow" alt="Cleanup rules dialog" src="https://cdn.finalbuilder.com/blog/daves/v1.9.2/cleanuprule.png" /&gt;&lt;/p&gt;



&lt;p&gt;Download the installers for Continua CI v1.9.2 Beta from the &lt;a href="/downloads/continuaci" target="_blank"&gt;Downloads&lt;/a&gt; page&lt;/p&gt;
&lt;style type="text/css"&gt;ul.horizontal {
		overflow: auto;
		margin: 10px 0 0 0;
		}
		ul.horizontal li {
			  float: left;
			  margin-left: 2em
		}
.syntaxhighlighter {
    background-color: #eee !important;
    margin-top: 0 !important;
    padding: 10px;
    outline-style: dashed;
    outline-width: 1px;
    outline-color: #666;
    width: 97% !important;
}
.syntaxhighlighter .line.alt2 {
    background-color: #eee !important;
}
.syntaxhighlighter table td.code
{
    overflow-y: hidden !important;
}
.syntaxhighlighter .plain, .syntaxhighlighter .plain a
{
    color: #639099 !important;
}
h1 { margin-bottom: 0.6em !important;
}

.up-link {
 float: right
}

img.dropShadow
{
  -webkit-filter: drop-shadow(5px 5px 5px #222);
  filter: drop-shadow(5px 5px 5px #222);
  margin-bottom: 1em;
}


&lt;/style&gt;
</description><guid isPermaLink="false">839</guid></item><item><title>Daily Builds with Continua CI</title><link>https://www.finalbuilder.com/resources/blogs/postid/838/daily-builds-with-continua-ci</link><category>Continua CI,Delphi,Deployment,Triggers</category><pubDate>Sun, 24 May 2020 09:22:55 GMT</pubDate><description>&lt;p&gt;Generally, at VSoft, we like to build. So we build every commit and this allows us to look back at our build history and see which changes caused the build to fail. We use manual stage promotion to prevent every build being released until we decide that it is ready to go.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Build promotion" src="https://cdn.finalbuilder.com/blog/daves/dailytriggers/buildpromotion.png" /&gt;&lt;/p&gt;

&lt;p&gt;Many teams like to trigger a build at the end of each day, or during the night, compiling the work for the day in one single package.&lt;/p&gt;

&lt;p&gt;The obvious choice for this scenario is the Daily Trigger. This can be set to run a build at a specific time every day, or just weekdays - even just weekends for those with alternative lifestyles.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Build promotion" src="https://cdn.finalbuilder.com/blog/daves/dailytriggers/dailytrigger.png" /&gt;&lt;/p&gt;

&lt;p&gt;But what if the team is just having a design day, is off on a team building excursion or, perish the thought, a day of meetings! No commits are made, but the daily build still runs even though there are no changes. One possible solution is to use a Discard condition.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Discard condition" src="https://cdn.finalbuilder.com/blog/daves/dailytriggers/discardcondition.png" /&gt;&lt;/p&gt;

&lt;p&gt;This will prevent the build running if there are no changes since the last build.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Build being discarded" src="https://cdn.finalbuilder.com/blog/daves/dailytriggers/discardcondition.gif" /&gt;&lt;/p&gt;

&lt;p&gt;Another option has been added to Continua CI recently. The Quiet Period setting on Repository Triggers now allows you to enter an End Time rather than an Interval.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Quiet period end time on repository trigger" src="https://cdn.finalbuilder.com/blog/daves/dailytriggers/endtimerepositorytrigger.png" /&gt;&lt;/p&gt;

&lt;p&gt;Any builds triggered from a repository change are then queued right through the day until the specified end time. Any additional changes added to the configuration repositories during the day are added to the queued build, and when the end time comes up, the build executes on the latest changeset.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Build waiting on quiet period end time" src="https://cdn.finalbuilder.com/blog/daves/dailytriggers/quietperiodtrigger.png" /&gt;&lt;/p&gt;

&lt;p&gt;If you're going home earlier than the end time and want stuff deployed already, you can swiftly end the quiet period at the click of a button. Using a repository trigger in this way means that you can ignore changes to some files, changesets with a specific comment, or commits from certain users.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Trigger with user exclusion" src="https://cdn.finalbuilder.com/blog/daves/dailytriggers/triggeruserexclusion.png" /&gt;&lt;/p&gt;

&lt;p&gt; - like that hands-on manager who thinks of his commit count as a key performance indicator.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.commitstrip.com/en/2016/05/09/when-the-pm-fixes-a-bug/" target="_blank"&gt;&lt;img alt="'When the PM fixes a bug' cartoon by commitstrip.com" src="https://cdn.finalbuilder.com/blog/daves/dailytriggers/strip-quand-les-pm-se-mettent-au-code-650-finalenglish-1.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;


</description><guid isPermaLink="false">838</guid></item><item><title>Introducing Continua CI Version 1.9.1 Beta</title><link>https://www.finalbuilder.com/resources/blogs/postid/835/introducing-continua-ci-version-191-beta</link><category>.NET,Continua CI,Delphi,Deployment</category><pubDate>Wed, 01 May 2019 07:00:08 GMT</pubDate><description>&lt;p&gt;This new &lt;a href="/downloads/continuaci/continua-ci-version-history-v191" target="_blank"&gt;beta release&lt;/a&gt; includes substantial improvements to the expressions engine including new several expressions objects and functions. We have also made some updates to the stage editor, implemented automatic report generation for some reporting actions, and added several new deployment actions providing support for Docker, Azure, SQL packages, File Transfer and SSH.&lt;/p&gt;

&lt;p&gt;Continue reading for details of all the new features.&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href="#expressions-engine"&gt;Enhanced expressions engine&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="#stage-editor-changes"&gt;Stage editor changes&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="#deployment-actions"&gt;New premium deployment actions&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="#other-actions"&gt;Other new and updated actions&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="#automatic-reporting"&gt;Automatic reporting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;&lt;a name="expressions-engine"&gt;Enhanced expressions engine&lt;/a&gt; &lt;a class="up-link" href="#" title="Go to top"&gt;&lt;img src="https://cdn.finalbuilder.com/i/up-icn.png" /&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;The expression engine in Continua CI evaluates expression objects and variables denoted with $ and % characters. It also provides auto-completion suggestions when typing such expressions into expression fields. This has now been overhauled to include function return types, chaining of functions, nesting functions as function parameters, selection and filtering of collections and many improvements to expression parsing. We have added several new functions, objects and collections to give access to more values and allow you to manipulate those values.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Expression in Set Variable action list categories" src="https://cdn.finalbuilder.com/blog/daves/v1.9.1/setvariableaction.png" /&gt;&lt;/p&gt;

&lt;p&gt;You can now, for example, use the following expression to get the time that the penultimate build stage finished;&lt;/p&gt;

&lt;pre class="brush:javascript;toolbar:false;gutter:false;"&gt;
 $Build.Stages.Item($Build.Stages.Count.Decrement()$).Finished.ToLongTimeString()$&lt;/pre&gt;

&lt;p&gt;combine the result of multiple flags by chaining functions, as in this expression;&lt;/p&gt;

&lt;pre class="brush:plain;toolbar:false;gutter:false;"&gt;
$Build.HasErroredStages.Or($Build.HasFailedStages$).Or($Build.HasWarnings$)$&lt;/pre&gt;

&lt;p&gt;or use the following expression to get the comment of the first build changeset in the build containing the word 'merge' (ignoring case):&lt;/p&gt;

&lt;pre class="brush:plain;toolbar:false;gutter:false;"&gt;
$Source.SuperFancyRepo.Changesets.First(Comment, Contains, "merge", true).Comment$&lt;/pre&gt;

&lt;p&gt;We have also included functions to get the value of a variable as a type, allowing you to use properties or functions on the variable value.&lt;/p&gt;

&lt;p&gt;You can, for example, now use the following expression to get the abbreviated day of the week from a variable entered using a DateTime prompt;&lt;/p&gt;

&lt;pre class="brush:javascript;toolbar:false;gutter:false;"&gt;
$Utils.GetDateTime(%DateTimeTest%).DayOfWeek.Substring(0, 3)$&lt;/pre&gt;

&lt;p&gt;use expressions to do some more complex maths on a Numeric variable;&lt;/p&gt;

&lt;pre class="brush:plain;toolbar:false;gutter:false;"&gt;
  $Utils.GetNumber(%NumberTest%).Floor().Modulus(10).Multiply(100)$&lt;/pre&gt;

&lt;p&gt;or get the first selected value in a checkbox select variable with this expression:&lt;/p&gt;

&lt;pre class="brush:plain;toolbar:false;gutter:false;"&gt;
$Utils.GetString(%CheckboxSelectTest%).SplitWithQuotes(",").First()$&lt;/pre&gt;

&lt;p&gt;You can see a full list of available expression objects, collection and functions on the &lt;a href="https://wiki.finalbuilder.com/x/C4DmAQ"&gt;Expression Objects page&lt;/a&gt; of the documentation.&lt;/p&gt;

&lt;p&gt;Auto-completion has also been revamped so show more information in the suggestions list. A list of parameters with types is now shown for each for each function. Descriptions are also displayed on mouse over for each object, collection and function in the suggestions list. We have also removed some annoying quirks with expression auto-completion where the cursor would end up in the wrong place or end characters would be added in the wrong place.&lt;/p&gt;

&lt;h2&gt;&lt;a name="stage-editor-changes"&gt;Stage editor changes&lt;/a&gt; &lt;a class="up-link" href="#" title="Go to top"&gt;&lt;img src="https://cdn.finalbuilder.com/i/up-icn.png" /&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;As Continua CI matures, the number of actions (and categories) has increased. This can make it more difficult to find the action you need. We have therefore redesigned the action list.&lt;/p&gt;

&lt;p&gt;The list of categories has been pulled up into a drop down menu with all actions listed below by default.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Action list categories" src="https://cdn.finalbuilder.com/blog/daves/v1.9.1/actionlistcategories.png" /&gt;&lt;/p&gt;

&lt;p&gt;The filtering of actions using the search box is now fuzzier, using partial and keyword matches.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Action list search" src="https://cdn.finalbuilder.com/blog/daves/v1.9.1/actionlistsearch.png" /&gt;&lt;/p&gt;

&lt;p&gt;Stage buttons now resize (up to a maximum) to fit the stage name. If you stage names are short, this means you can fit more stages into your browser width. If your stage names are long, then the text will no longer escape the stage borders. Really long stage names which do not fit the maximum stage button size will now be truncated.&lt;/p&gt;

&lt;p&gt;&lt;img alt="Stages" src="https://cdn.finalbuilder.com/blog/daves/v1.9.1/stages.png" /&gt;&lt;/p&gt;

&lt;p&gt;All actions now include a Validate button to allow you to check that all fields have valid values before saving.&lt;/p&gt;

&lt;h2&gt;&lt;a name="deployment-actions"&gt;New premium deployment actions&lt;/a&gt; &lt;a class="up-link" href="#" title="Go to top"&gt;&lt;img src="https://cdn.finalbuilder.com/i/up-icn.png" /&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;We have added a set of premium actions which can be used for deploying the results of your build. The following actions can only be used if you have purchased one or more concurrent build licenses.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;File Transfer action:&lt;/b&gt; This allows you to upload files to a remote server via FTP, FTPS and SFTP. &lt;a href="https://wiki.finalbuilder.com/x/GADc" target="_blank" title="Further information on File Transfer action"&gt;&lt;img src="https://cdn.finalbuilder.com/i/info.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;SSH Run Script action:&lt;/b&gt; This can be used to run a script or list of commands on an SSH server. &lt;a href="https://wiki.finalbuilder.com/x/KIAJAQ" target="_blank" title="Further information on SSH Run Script action"&gt;&lt;img src="https://cdn.finalbuilder.com/i/info.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Azure actions:&lt;/b&gt; Several new actions are available to allow you to deploy web apps, function apps, files and blobs to Azure. &lt;a href="https://wiki.finalbuilder.com/x/OwBJAg" target="_blank" title="Further information on Azure actions"&gt;&lt;img src="https://cdn.finalbuilder.com/i/info.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt="Azure actions" src="https://cdn.finalbuilder.com/blog/daves/v1.9.1/azureactions.png" /&gt;&lt;/p&gt;

&lt;ul class="horizontal"&gt;
	&lt;li&gt;Create Azure Resource Group&lt;/li&gt;
	&lt;li&gt;Delete Azure Resource Group&lt;/li&gt;
&lt;/ul&gt;

&lt;ul class="horizontal"&gt;
	&lt;li&gt;Create Azure App Service Plan&lt;/li&gt;
	&lt;li&gt;Delete Azure App Service Plan&lt;/li&gt;
&lt;/ul&gt;

&lt;ul class="horizontal"&gt;
	&lt;li&gt;Create Azure Web App&lt;/li&gt;
	&lt;li&gt;Deploy Azure Web App&lt;/li&gt;
	&lt;li&gt;Upload Azure Web App&lt;/li&gt;
	&lt;li&gt;Control Azure Web App&lt;/li&gt;
	&lt;li&gt;Delete Azure Web App&lt;/li&gt;
&lt;/ul&gt;

&lt;ul class="horizontal"&gt;
	&lt;li&gt;Create Azure Function&lt;/li&gt;
	&lt;li&gt;Deploy Azure Function&lt;/li&gt;
	&lt;li&gt;Delete Azure Function&lt;/li&gt;
&lt;/ul&gt;

&lt;ul class="horizontal"&gt;
	&lt;li&gt;Create Azure Storage Account&lt;/li&gt;
	&lt;li&gt;Get Azure Storage Account Keys&lt;/li&gt;
	&lt;li&gt;Delete Azure Storage Account&lt;/li&gt;
&lt;/ul&gt;

&lt;ul class="horizontal"&gt;
	&lt;li&gt;Create Azure Storage Container&lt;/li&gt;
	&lt;li&gt;Delete Azure Storage Container&lt;/li&gt;
&lt;/ul&gt;

&lt;ul class="horizontal"&gt;
	&lt;li&gt;Upload Azure Blob&lt;/li&gt;
	&lt;li&gt;Delete Azure Blob&lt;/li&gt;
&lt;/ul&gt;

&lt;ul class="horizontal"&gt;
	&lt;li&gt;Create Azure File Share&lt;/li&gt;
	&lt;li&gt;Delete Azure File Share&lt;/li&gt;
&lt;/ul&gt;

&lt;ul class="horizontal"&gt;
	&lt;li&gt;Create Azure Directory&lt;/li&gt;
	&lt;li&gt;Delete Azure Directory&lt;/li&gt;
&lt;/ul&gt;

&lt;ul class="horizontal"&gt;
	&lt;li&gt;Upload Azure File&lt;/li&gt;
	&lt;li&gt;Delete Azure File&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Docker actions:&lt;/b&gt; These new actions are available to allow you to build, deploy and manage Docker containers. &lt;a href="https://wiki.finalbuilder.com/x/AwAPAg" target="_blank" title="Further information on Docker actions"&gt;&lt;img src="https://cdn.finalbuilder.com/i/info.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul class="horizontal"&gt;
	&lt;li&gt;Docker Build&lt;/li&gt;
	&lt;li&gt;Docker Command&lt;/li&gt;
	&lt;li&gt;Docker Commit&lt;/li&gt;
	&lt;li&gt;Docker Inspect&lt;/li&gt;
	&lt;li&gt;Docker Pull&lt;/li&gt;
	&lt;li&gt;Docker Push&lt;/li&gt;
	&lt;li&gt;Docker Run&lt;/li&gt;
	&lt;li&gt;Docker Stop&lt;/li&gt;
	&lt;li&gt;Docker Tag&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;SQL Package actions:&lt;/b&gt; These new actions allow you to create, update and export SQL Server database schemas and table data. &lt;a href="https://wiki.finalbuilder.com/x/PwBJAg" target="_blank" title="Further information on SQL Package actions"&gt;&lt;img src="https://cdn.finalbuilder.com/i/info.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul class="horizontal"&gt;
	&lt;li&gt;SQL Package Export&lt;/li&gt;
	&lt;li&gt;SQL Package Extract&lt;/li&gt;
	&lt;li&gt;SQL Package Import&lt;/li&gt;
	&lt;li&gt;SQL Package Publish&lt;/li&gt;
	&lt;li&gt;SQL Package Script&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;&lt;a name="other-actions"&gt;Other new and updated actions&lt;/a&gt; &lt;a class="up-link" href="#" title="Go to top"&gt;&lt;img src="https://cdn.finalbuilder.com/i/up-icn.png" /&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;Extent Reports:&lt;/b&gt; Wrapper for the Extent Reports CLI for reporting on NUnit results. &lt;a href="https://wiki.finalbuilder.com/x/3oE6Ag" target="_blank" title="Further information on Extent Reports action"&gt;&lt;img src="https://cdn.finalbuilder.com/i/info.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;ReportGenerator:&lt;/b&gt; Updated to include all the latest command line options. &lt;a href="https://wiki.finalbuilder.com/x/WQMZ" target="_blank" title="Further information on ReportGenerator action"&gt;&lt;img src="https://cdn.finalbuilder.com/i/info.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Rename Directory:&lt;/b&gt; Does what it says on the tin.. &lt;a href="https://wiki.finalbuilder.com/x/BgAxAg" target="_blank" title="Further information on Rename Directory action"&gt;&lt;img src="https://cdn.finalbuilder.com/i/info.png" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;&lt;a name="automatic-reporting"&gt;Automatic reporting&lt;/a&gt; &lt;a class="up-link" href="#" title="Go to top"&gt;&lt;img src="https://cdn.finalbuilder.com/i/up-icn.png" /&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Currently, there are a few steps to configure when setting up a report. You have to ensure that the report files are included in the Workspace Rules and that the report is defined in the Reports section of the configuration wizard. Furthermore, it's also recommended to include the report files in the artifact rules so that you can control when they are cleaned up.&lt;/p&gt;

&lt;p&gt;To simplify this process, we have added a new option to automatically register the report with the server to actions which generate reports (FinalBuilder, ReportGenerator and the new Extent Reports action). Ticking this option shows a new tab where you can enter the name, description and run order of the report. When a stage completes, any report files generated by actions where this option is turned on, will automatically be copied to the server workspace. The main report file will be registered as a report and all report files will be registered as artifacts.&lt;/p&gt;

&lt;p&gt;&lt;img alt="FinalBuilder automatic report option" src="https://cdn.finalbuilder.com/blog/daves/v1.9.1/finalbuilderautomaticreport.png" /&gt;&lt;/p&gt;

&lt;p&gt;Download the installers for Continua CI v1.9.1 Beta from the &lt;a href="/downloads/continuaci" target="_blank"&gt;Downloads&lt;/a&gt; page&lt;/p&gt;
&lt;style type="text/css"&gt;ul.horizontal {
		overflow: auto;
		margin: 10px 0 0 0;
		}
		ul.horizontal li {
			  float: left;
			  margin-left: 2em
		}
.syntaxhighlighter {
    background-color: #eee !important;
    margin-top: 0 !important;
    padding: 10px;
    outline-style: dashed;
    outline-width: 1px;
    outline-color: #666;
    width: 97% !important;
}
.syntaxhighlighter .line.alt2 {
    background-color: #eee !important;
}
.syntaxhighlighter table td.code
{
    overflow-y: hidden !important;
}
.syntaxhighlighter .plain, .syntaxhighlighter .plain a
{
    color: #639099 !important;
}
h1 { margin-bottom: 0.6em !important;
}

.up-link {
 float: right
}
&lt;/style&gt;
</description><guid isPermaLink="false">835</guid></item><item><title>Introducing Continua CI Version 1.9</title><link>https://www.finalbuilder.com/resources/blogs/postid/782/introducing-continua-ci-version-19</link><category>.NET,Continua CI,Delphi,General,Web Development,Windows</category><pubDate>Tue, 14 Aug 2018 13:47:08 GMT</pubDate><description>&lt;p&gt;&lt;img alt="" src="https://cdn.finalbuilder.com/blog/dave/continuaciwizardimagesmall.png" style="border-width: 0px; border-style: solid; margin-right: 5px; margin-left: 5px; width: 55px; height: 55px;" /&gt;&lt;/p&gt;

&lt;p&gt;Version 1.9 is now out of beta and available as a stable release. Thank you to those of you who have already tried out the beta - especially those who reported issues.&lt;/p&gt;

&lt;p&gt;This version brings major changes to the notifications system. We redesigned it using a common architecture, that makes it much easier to add new notification publisher types. Where previously, only email, XMPP and private message notifications were available, there are now publishers for Slack, Teams, Hipchat and Stride. And we can now add more (let us know what you need).&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="https://cdn.finalbuilder.com/blog/dave/publishertypes.png" style="width: 626px; height: 399px; display: block;  margin-left: auto;  margin-right: auto; " /&gt;&lt;/p&gt;

&lt;p&gt;We are no longer limited to one publisher of each type. You may, for example, have different email servers for different teams on your company. You can set up two email publishers, one for each server, and set up subscriptions so that notifications from different projects go to different email servers. Likewise for different Slack workspaces, Teams channel connectors and so on.&lt;/p&gt;

&lt;p&gt;We have also improved the XMPP publisher to support sending notifications to rooms. Subscriptions have been improved, allowing you to specify a room and/or channel for this and other publishers.&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="https://cdn.finalbuilder.com/blog/dave/subscription.png" style="display: block; margin-left: auto; margin-right: auto; width: 625px; height: 733px;" /&gt;&lt;/p&gt;

&lt;p&gt;User preferences have been updated allowing each user to specify a recipient id, username or channel per publisher.&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="https://cdn.finalbuilder.com/blog/dave/userpreferences.png" style="width: 726px; height: 751px; display: block;  margin-left: auto;  margin-right: auto; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);" /&gt;&lt;/p&gt;

&lt;p&gt;You can see some metrics on the throughput of each publisher (number of messages on queue, messages sent per second, average send time, etc.) on the Publishers page in the Administration area. This also shows real-time counts of any errors occurring while sending messages and also any messages waiting on a retry queue due to rate limiting or service outages. This allows you to know when you need to upgrade rate limits or make other service changes.&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="https://cdn.finalbuilder.com/blog/dave/publishermetrics.png" style="width: 990px; height: 306px; display: block;  margin-left: auto;  margin-right: auto; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);" /&gt;&lt;/p&gt;

&lt;p&gt;The Templates page has been updated. Templates are now divided into a tab per publisher. The list of available variables for each event type has been moved to a expandable side panel.&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="https://cdn.finalbuilder.com/blog/dave/notificationtemplates.png" style="width: 564px; height: 707px; display: block;  margin-left: auto;  margin-right: auto; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);" /&gt;&lt;/p&gt;

&lt;p&gt;This release is built on .Net Framework version 4.7.2, which has allowed us to upgrade a number of third party libraries, including the database ORM and PostgreSQL drivers. This has noticeably improved performance, as well as providing us with a richer platform to build future features on. The setup wizard will prompt for you to install .Net Framework version 4.7.2, before continuing with the installation.&lt;/p&gt;

&lt;p&gt;&lt;img alt="" src="https://cdn.finalbuilder.com/blog/dave/installerframeworkrequirement.png" style="width: 503px; height: 391px; display: block;  margin-left: auto;  margin-right: auto;" /&gt;&lt;/p&gt;

&lt;p&gt;Note that applications running on .Net 4.7.2 do not run on versions of Windows prior to Windows Server 2008R2 and Windows 7 SP1. We are also dropping the 32-bit server installer. This is mainly to reduce testing overheads. We will still be releasing 32-bit agents for those who are using 16-bit compilers.&lt;/p&gt;

&lt;p&gt;We will continue to provide bug fixes to Continua CI version 1.8.1 for while to give you time to migrate from older platforms.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
</description><guid isPermaLink="false">782</guid></item><item><title>Introducing archive rules in Continua CI</title><link>https://www.finalbuilder.com/resources/blogs/postid/766/introducing-archive-rules-in-continua-ci</link><category>Continua CI,Delphi</category><pubDate>Wed, 16 May 2018 14:15:12 GMT</pubDate><description>&lt;p&gt;In version 1.8.1.870 of Continua CI, we have added new archiving functionality to the workspace and repository rules.&lt;/p&gt;

&lt;p&gt;Builds can generate a lot of output files: binary library files or report files, for example. Copying a large number of these files back to the server at the end of the build can take time. Manually downloading each individual artefact from the server can be a tedious task, so compressing these files into a handy bundle makes sense.&lt;/p&gt;

&lt;p&gt;Previously, you would have needed to use actions, such as the Seven Zip action, in your build stages to zip these files. The compression can now be performed as part of the agent-to-server workspace rules.&lt;/p&gt;

&lt;p&gt;To compress a set of files in the agent workspace to an archive in the server workspace, specify a file with a zip extension on the left-hand side of a agent-to-server workspace rule.&lt;/p&gt;

&lt;p&gt;e.g.&lt;/p&gt;

&lt;pre class="brush:plain; toolbar:false;gutter:false;"&gt;


    Libraries.zip &lt; Output/**.dll


&lt;/pre&gt;

&lt;p&gt;Note that the all the usual operators are taken into account when compressing files so, in the above example, the directory structure is preserved. Likewise, using the &lt;- operator will cause all matching files to be flattened into the root folder of the zip file.&lt;/p&gt;

&lt;p&gt;Doubling up with the &lt;&lt; operator will delete any existing zip file before compressing to a new file. Without the &lt;&lt; operator, multiple sets of files can be added to the same archive file.&lt;/p&gt;

&lt;p&gt;e.g.&lt;/p&gt;

&lt;pre class="brush:plain; toolbar:false;gutter:false;"&gt;


    Reports.zip &lt; Output/**.html
	Reports.zip &lt; Output/**.css


&lt;/pre&gt;

&lt;p&gt;You can also compress files into subfolders within the zip file using the new : operator&lt;/p&gt;

&lt;p&gt;e.g.&lt;/p&gt;

&lt;pre class="brush:plain; toolbar:false;gutter:false;"&gt;


    Reports.zip:/css &lt; Output/**.css


&lt;/pre&gt;

&lt;p&gt;Once files have been compressed at the end of one stage, you may need to access the contents of zip files in the next stage. Additionally, you may wish to unpack a zip file from your repository at the start of a stage. The : operator facilitates the extracting of zip files in server-to-agent workspace rules and repository rules.&lt;/p&gt;

&lt;p&gt;To extract a set of files from an archive in the server workspace to a folder in the agent workspace, specify a file with a zip extension on the left-hand side of a server-to-agent workspace rule. Ensure that you follow the ‘zip’ with a : operator, otherwise the zip file will just be copied.&lt;/p&gt;

&lt;p&gt;e.g.&lt;/p&gt;

&lt;pre class="brush:plain; toolbar:false;gutter:false;"&gt;


    Libraries.zip: &gt; Libraries


&lt;/pre&gt;

&lt;p&gt;This also works for repository rules.&lt;/p&gt;

&lt;p&gt;e.g.&lt;/p&gt;

&lt;pre class="brush:plain; toolbar:false;gutter:false;"&gt;


	$Source.MyRepo$/Documents.zip: &gt; Docs/Main


&lt;/pre&gt;

&lt;p&gt;Note that the all the usual operators &gt;, &gt;&gt;, -&gt; and --&gt; have the same meaning when extracting files as they have when copying file; signifying whether to preserve the directory structure within the zip file and whether to empty the destination folder.&lt;/p&gt;

&lt;p&gt;You can also specify a pattern after the : operator, allowing you to filter the extracted files.&lt;/p&gt;

&lt;p&gt; e.g.&lt;/p&gt;

&lt;pre class="brush:plain; toolbar:false;gutter:false;"&gt;


	Libraries.zip:/plugins/**.dll &gt; Libraries/Plugins
	$Source.MyRepo$/Documents.zip:**.md &gt; Docs/Markdown


&lt;/pre&gt;

&lt;p&gt;See the &lt;a href="https://wiki.finalbuilder.com/display/continua/Workspace+Rules" target="_blank"&gt;Workspace Rules documentation&lt;/a&gt; for further details on the new archive rules syntax.&lt;/p&gt;
</description><guid isPermaLink="false">766</guid></item><item><title>Introducing Continua CI Version 1.8.1</title><link>https://www.finalbuilder.com/resources/blogs/postid/748/introducing-continua-ci-version-181</link><category>Continua CI</category><pubDate>Thu, 08 Sep 2016 16:43:33 GMT</pubDate><description>&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;This version adds several back-end performance enhancements including significant improvements to database query caching. We have also updated various third party packages and upgraded the bundled PostgreSQl database from version 9.3.4 to version 9.5.3. What&amp;rsquo;s more, this release builds upon all the improvements and fixes made to version 1.8.&lt;/p&gt;
&lt;h2&gt;
New Actions&lt;/h2&gt;
&lt;br /&gt;
&lt;p&gt;To keep up with the latest developments in Visual Studio, we have added several new actions for working with .Net Core projects. The DotNet Build, DotNet Pack, DotNet Publish, DotNet Restore, DotNet Run and DotNet Test actions all run the DotNet Cli command line.&lt;/p&gt;
&lt;p&gt;&lt;img alt="DotNet Build Action" src="https://www.finalbuilder.com/blogimages/daves/v1.8.1/DotNetBuildAction.png" /&gt;&lt;/p&gt;
&lt;p&gt;This release also includes a new action for importing XUnit tests from an XML report file. The sort of file you may choose to output from the DotNet Test action.&lt;/p&gt;
&lt;p&gt;To polish this off we have added new NPM Pack and NPM Publish actions for sharing your completed packages.&lt;/p&gt;
&lt;h2&gt;
New Build Event Handlers&lt;/h2&gt;
&lt;br /&gt;
&lt;p&gt;A powerful new addition to the Continua CI build event handlers is the HTTP Request handler which allows you to send JSON or XML to HTTP endpoints via GET, POST. PUT, DELETE, PATCH methods and extract values from the results to set as Continua CI variables.&lt;/p&gt;
&lt;p&gt;&lt;img alt="HTTP Request Build Event Handler" src="/blogimages/daves/v1.8.1/HTTPRequestBuildEventHandler.png" /&gt;&lt;/p&gt;
&lt;p&gt;This enables interaction with a various existing web services and REST APIs. You could, for example, use this feature to send a message via Slack when a build starts, tag a commit on GitLab when a build finishes or even translate a variable value to Azerbaijani using Google Translate API. If you have any in-house web services which handle HTTP requests, it is likely that these can be accessed too.&lt;/p&gt;
&lt;p&gt;We have also added a new GitHub Release build event handler for creating, updating and deleting GitHub releases. This also allows you to upload artifacts as GitHub release assets.&lt;/p&gt;
&lt;h2&gt;Other New Features&lt;/h2&gt;
&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;
Build Event Handler conditions&lt;/strong&gt;. You can now control the triggering of handlers based on the value of build variables or expression objects. These values may be specified when queuing a manual build or set in the stage workflow. You could, for example, only send a GitHub Release if the number of failed unit tests $Build.Metrics.UnitTests.Failed$ is zero.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Build Event Handler conditions" src="/blogimages/daves/v1.8.1/BuildEventHandlerConditions.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Continue on failure.&lt;/strong&gt; Builds can now be set to progress to the next stage after one stage has failed. Stage gates now include an $Stage.IsSuccessful$ condition by default. This can be removed to allow the build to continue to the next stage when a stage fails. So you can see what failed, the stages are now coloured green or red in Tile and Details dashboard views to indicate an success or failure status.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Continue on failure" src="/blogimages/daves/v1.8.1/ContinueOnFail.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;
New cleanup options.&lt;/strong&gt; We have also made some changes to the server cleanup policy, giving you the options to clean up build statistics. The database category has also been split up so that build unit tests can be cleaned up without cleaning up the full build. This is important to prevent database tables growing too large when you have a large number of unit tests.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cleanup options" src="/blogimages/daves/v1.8.1/CleanupOptions.png" /&gt;&lt;/p&gt;</description><guid isPermaLink="false">748</guid></item><item><title>Continua CI 1.8 Released</title><link>https://www.finalbuilder.com/resources/blogs/postid/745/continua-ci-18-released</link><category>Continua CI</category><pubDate>Thu, 14 Apr 2016 13:07:29 GMT</pubDate><description>&lt;p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;We are pleased to announce that Continua CI 1.8 has been released. It was actually released a couple of days ago, but for anyone who missed it, here is a heads up with and overview of the new features. We'd also like to thank all those who downloaded the beta - the time and effort spent reporting issues helped us to fix some important bugs and is most appreciated.&lt;/p&gt;
&lt;p&gt;Version 1.8 adds the following features which build upon all the improvements and fixes made to version 1.7.1.&lt;/p&gt;
&lt;h2&gt;Dashboard Filtering&lt;/h2&gt;
&lt;br /&gt;
&lt;p&gt;We've added a new filter box to the dashboard so you can quickly find the configuration (or project) that you are looking for as you type. Use the shortcut key F on the dashboard pages to focus on the filter box and start typing.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Dashboard filtering" src="/blogimages/daves/v1.8/DashboardFiltering.png" /&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;Shared Resources&lt;/h2&gt;
&lt;br /&gt;
&lt;p&gt;Many of you have requested more control over the number of builds which can run concurrently for some configurations. This may be to restrict the number of times a particular tool is run due to a license, memory or processor limit, or to prevent concurrency issues with multiple build stages simultaneously writing to the same file, folder or network resource.&lt;br /&gt;
You can now allocate quotas to named Shared Resources and specify that builds and stages must acquire a lock on the Shared Resource before running. If all locks are allocated, then the build or stage will wait on the queue until a lock is released.&lt;/p&gt;
&lt;p&gt;Shared resources can be associated with the server or a particular agent in the Administration pages.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Agent shared resources" src="/blogimages/daves/v1.8/AgentSharedResources.png" /&gt;&lt;/p&gt;
&lt;p&gt;Agent shared resources are acquired when selecting an agent to run a stage. Continua will select the agent with the largest available quota of each shared resource.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Stage shared resource locks" src="/blogimages/daves/v1.8/StageSharedResourceLocks.png" /&gt;&lt;/p&gt;
&lt;p&gt;Server shared resources can also be acquired when selecting an agent, or while on the build queue after evaluating configuration conditions.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Shared resource lock configuration condition" src="/blogimages/daves/v1.8/SharedResourceLockCondition.png" /&gt;&lt;/p&gt;
&lt;p&gt;We hope you find that shared resources can provide many different ways to control the build process.&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;Requeue Build&lt;/h2&gt;
&lt;br /&gt;
&lt;p&gt;Sometimes a build may fail due to an offline network resource, or some logical error in the stage workflow. Up until now, your only option was to re-run a build for the same branch heads. If any new changesets had been committed to the branch since that build, then you are out of luck.&lt;/p&gt;
The new Requeue Build button on the Build View page allows you to requeue an existing build using the same changesets, variables and queue options. Any changes to the configuration such as stage actions or repositories are taken into account and used for the new build.
&lt;p&gt;&lt;img alt="Requeue build button" src="/blogimages/daves/v1.8/RequeueBuildButton.png" /&gt;&lt;/p&gt;
&lt;p&gt;You can also change the priority, comment and variables before requeuing the build.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Requeue build options menu item" src="/blogimages/daves/v1.8/RequeueBuildOptionsMenuItem.png" /&gt;&lt;/p&gt;
&lt;p&gt;Clicking on the &amp;ldquo;Build requeue options&amp;rdquo; menu item will open the Queue Options dialog.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Requeue options dialog" src="/blogimages/daves/v1.8/RequeueOptions.png" /&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;Persist Build Variables&lt;/h2&gt;
&lt;br /&gt;
&lt;p&gt;Another common request has been to persist variable values from one build to another build. This may be to keep a count of builds on a particular branch or to flag that some actions have been completed in one build and do not need to be repeated.&lt;/p&gt;
Continua CI takes a copy of configuration and project variables at the start of each build. These copies are referred to as build variables. Any changes to build variables are normally discarded when the build finishes and cannot be used by other builds.
&lt;p&gt;&lt;img alt="First tab of Persist Build Variable build event handler dialog " src="/blogimages/daves/v1.8/PersistBuildVariable1.png" /&gt;&lt;/p&gt;
&lt;p&gt;The new Persist Build Variable build event handler allows you to save the value of the build variables when specific events happen in the build timeline. This is stored as the value of the configuration variable. Subsequent builds will then pick up this revised value and use it as the initial value of the build variable.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Second tab of Persist Build Variable build event handler dialog " src="/blogimages/daves/v1.8/PersistBuildVariable2.png" /&gt;&lt;/p&gt;
&lt;p&gt;As Continua CI allows multiple builds to run concurrently, it is important to control when the variables are overwritten. A later build may run faster and finish before a build which started earlier, causing unexpected results. &amp;nbsp;You can optionally state that a variable should not be persisted if the configuration variable has been modified (e.g. by another build) since a specified build event, such the build start.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Options tab of Persist Build Variable build event handler dialog " src="/blogimages/daves/v1.8/PersistBuildVariable3.png" /&gt;&lt;/p&gt;
&lt;p&gt;You can also prevent concurrency issues by using this feature in conjunction with shared resource locks.&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;Other New Features&lt;/h2&gt;
&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;You can now set the Variables display order of variable prompts on the Queue Options dialog.&lt;/li&gt;
    &lt;li&gt;We have provided buttons for cloning Triggers, Repositories and Build Event Handlers.&lt;/li&gt;
    &lt;li&gt;Configuration Conditions can now be disabled.&lt;/li&gt;
    &lt;li&gt;All actions which run external processes now have a Timeout (in seconds) setting.&lt;/li&gt;
    &lt;li&gt;We have also added a new &lt;a href="https://cakebuild.net/" target="_blank"&gt;Cake &lt;/a&gt;build runner action and a new &lt;a href="https://msdn.microsoft.com/en-us/library/jj155796.aspx" target="_blank"&gt;VSTest&lt;/a&gt; unit testing action.&lt;/li&gt;
&lt;/ul&gt;</description><guid isPermaLink="false">745</guid></item><item><title>Introducing Continua CI Version 1.8 Beta</title><link>https://www.finalbuilder.com/resources/blogs/postid/743/introducing-continua-ci-version-18-beta</link><category>Continua CI</category><pubDate>Tue, 08 Mar 2016 10:10:00 GMT</pubDate><description>&lt;p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
This version adds several new features which build upon all the improvements and fixes made to version 1.7.1.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Dashboard Filtering&lt;/h2&gt;
&lt;br /&gt;
&lt;p&gt;We've added a new filter box to the dashboard so you can quickly find the configuration (or project) that you are looking for as you type. Use the shortcut key F on the dashboard pages to focus on the filter box and start typing.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Dashboard filtering" src="/blogimages/daves/v1.8/DashboardFiltering.png" /&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;Shared Resources&lt;/h2&gt;
&lt;br /&gt;
&lt;p&gt;Many of you have requested more control over the number of builds which can run concurrently for some configurations. This may be to restrict the number of times a particular tool is run due to a license, memory or processor limit, or to prevent concurrency issues with multiple build stages simultaneously writing to the same file, folder or network resource.&lt;br /&gt;
You can now allocate quotas to named Shared Resources and specify that builds and stages must acquire a lock on the Shared Resource before running. If all locks are allocated, then the build or stage will wait on the queue until a lock is released.&lt;/p&gt;
&lt;p&gt;Shared resources can be associated with the server or a particular agent in the Administration pages.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Agent shared resources" src="/blogimages/daves/v1.8/AgentSharedResources.png" /&gt;&lt;/p&gt;
&lt;p&gt;Agent shared resources are acquired when selecting an agent to run a stage. Continua will select the agent with the largest available quota of each shared resource.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Stage shared resource locks" src="/blogimages/daves/v1.8/StageSharedResourceLocks.png" /&gt;&lt;/p&gt;
&lt;p&gt;Server shared resources can also be acquired when selecting an agent, or while on the build queue after evaluating configuration conditions.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Shared resource lock configuration condition" src="/blogimages/daves/v1.8/SharedResourceLockCondition.png" /&gt;&lt;/p&gt;
&lt;p&gt;We hope you find that shared resources can provide many different ways to control the build process.&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;Requeue Build&lt;/h2&gt;
&lt;br /&gt;
&lt;p&gt;Sometimes a build may fail due to an offline network resource, or some logical error in the stage workflow. Up until now, your only option was to re-run a build for the same branch heads. If any new changesets had been committed to the branch since that build, then you are out of luck.&lt;/p&gt;
The new Requeue Build button on the Build View page allows you to requeue an existing build using the same changesets, variables and queue options. Any changes to the configuration such as stage actions or repositories are taken into account and used for the new build.
&lt;p&gt;&lt;img alt="Requeue build button" src="/blogimages/daves/v1.8/RequeueBuildButton.png" /&gt;&lt;/p&gt;
&lt;p&gt;You can also change the priority, comment and variables before requeuing the build.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Requeue build options menu item" src="/blogimages/daves/v1.8/RequeueBuildOptionsMenuItem.png" /&gt;&lt;/p&gt;
&lt;p&gt;Clicking on the &amp;ldquo;Build requeue options&amp;rdquo; menu item will open the Queue Options dialog.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Requeue options dialog" src="/blogimages/daves/v1.8/RequeueOptions.png" /&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;Persist Build Variables&lt;/h2&gt;
&lt;br /&gt;
&lt;p&gt;Another common request has been to persist variable values from one build to another build. This may be to keep a count of builds on a particular branch or to flag that some actions have been completed in one build and do not need to be repeated.&lt;/p&gt;
Continua CI takes a copy of configuration and project variables at the start of each build. These copies are referred to as build variables. Any changes to build variables are normally discarded when the build finishes and cannot be used by other builds.
&lt;p&gt;&lt;img alt="First tab of Persist Build Variable build event handler dialog " src="/blogimages/daves/v1.8/PersistBuildVariable1.png" /&gt;&lt;/p&gt;
&lt;p&gt;The new Persist Build Variable build event handler allows you to save the value of the build variables when specific events happen in the build timeline. This is stored as the value of the configuration variable. Subsequent builds will then pick up this revised value and use it as the initial value of the build variable.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Second tab of Persist Build Variable build event handler dialog " src="/blogimages/daves/v1.8/PersistBuildVariable2.png" /&gt;&lt;/p&gt;
&lt;p&gt;As Continua CI allows multiple builds to run concurrently, it is important to control when the variables are overwritten. A later build may run faster and finish before a build which started earlier, causing unexpected results. &amp;nbsp;You can optionally state that a variable should not be persisted if the configuration variable has been modified (e.g. by another build) since a specified build event, such the build start.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Options tab of Persist Build Variable build event handler dialog " src="/blogimages/daves/v1.8/PersistBuildVariable3.png" /&gt;&lt;/p&gt;
&lt;p&gt;You can also prevent concurrency issues by using this feature in conjunction with shared resource locks.&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;Other New Features&lt;/h2&gt;
&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;You can now set the Variables display order of variable prompts on the Queue Options dialog.&lt;/li&gt;
    &lt;li&gt;We have provided buttons for cloning Triggers, Repositories and Build Event Handlers.&lt;/li&gt;
    &lt;li&gt;Configuration Conditions can now be disabled.&lt;/li&gt;
    &lt;li&gt;We have also added a new &lt;a href="https://cakebuild.net/"&gt;Cake &lt;/a&gt;build runner action&lt;/li&gt;
&lt;/ul&gt;</description><guid isPermaLink="false">743</guid></item><item><title>Continua CI Version 1.7 released</title><link>https://www.finalbuilder.com/resources/blogs/postid/734/continua-ci-version-17-released</link><category>Continua CI</category><pubDate>Sun, 23 Aug 2015 16:20:37 GMT</pubDate><description>&lt;p&gt;Version 1.7 of Continua is now released. A big thank you to all those who downloaded the beta and especially those of you who reported issues and bugs.&lt;/p&gt;
&lt;p&gt; This version  introduces several new features, many of which have been requested by users over the past few months. These features are built upon the various improvements and bug fixes applied in revisions to version 1.6.
Please don&amp;rsquo;t dismay if your requested feature is not included yet, it is still high on our to-do list. Indeed we have several other features specced out, and some partially developed in the background.&lt;/p&gt;
&lt;h2&gt;Version 1.7 Features&lt;/h2&gt;
&lt;h3&gt;New Builds View dashboard&lt;/h3&gt;
&lt;p&gt;This view is useful for project administrators and shows a list of active builds across all viewable configurations. This includes running builds, queued builds and builds awaiting promotion.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blogimages/daves/v1.7beta/buildsview.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;New panel of indicators&lt;/h3&gt;
&lt;p&gt;Some important numbers including the total count of queued and running builds, as well as available agents and concurrent build licenses.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blogimages/daves/v1.7beta/indicators.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;New Repositories tab&lt;/h3&gt;
&lt;p&gt; This is accessed via the Configurations view and shows status of each repository. We've also included &amp;ldquo;Check &amp;nbsp;Now&amp;rdquo; buttons for immediately polling each repository. You can also initiate repository checking from all existing repository pages&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blogimages/daves/v1.7beta/repoview.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Project-wide and configuration versioning options.&lt;/h3&gt;
&lt;p&gt;We've added some new options in the details section of the project and configuration wizards&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Project-wide versioning: &lt;/strong&gt;The build version number can now be incremented across many configurations within a project.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Build number re-use: &lt;/strong&gt;A new &lt;span&gt;option at the&amp;nbsp;&lt;/span&gt;project or configuration level to decrement the version counter when a build is discarded while initialising. e.g. due to configuration conditions. Please note that the build number will be decremented only if no other build has started in the mean time and is using a later build number. &amp;nbsp;&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;img alt="" src="/blogimages/daves/v1.7beta/projectwidesettings.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Improvements to Build Completed triggers.&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Variable expressions: &lt;/strong&gt;You can now use expressions when defining variables allowing you to pass information from triggering to triggered build.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;New conditions tab:&lt;/strong&gt; This allows you to use expressions to control whether a build is triggered&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;img alt="" src="/blogimages/daves/v1.7beta/buildcompletedconditions.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Improvements to Repository triggers.&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Trigger on specific file change types: &lt;/strong&gt;Triggers can now be set to start only when the changeset contains certain types of file changes e.g. additions, modifications and deletions.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Trigger file pattern: &lt;/strong&gt;You can now specify a file pattern for repository triggers to restrict triggering only to changesets containing matching files.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Trigger comment pattern:&amp;nbsp;&lt;/strong&gt;You can also limit triggering to changesets with specific text in the comment.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;img alt="" src="/blogimages/daves/v1.7beta/repotriggeroptions.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Other build features&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;New &lt;strong&gt;force repository check&lt;/strong&gt; option in queue build dialog allowing control over whether to recheck repository when building. There is also a default setting for each configuration&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;Improvements to &lt;strong&gt;Stop Build buttons on dashboard view&lt;/strong&gt;&amp;nbsp;to ensure that the build stopped is always the latest build at the time when the button was clicked. Stop build dialogs also now display the build number of the build being stopped.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h3&gt;Actions and event handlers&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;New &lt;strong&gt;node.js actions
    &lt;/strong&gt;
    &lt;ul&gt;
        &lt;li&gt;Package management with Npm and Bower&lt;/li&gt;
        &lt;li&gt;Grunt and Gulp build runners&lt;/li&gt;
        &lt;li&gt;Unit testing with Mocha&lt;br /&gt;
        &lt;br /&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;New build event handler for posting &lt;strong&gt;status updates to a Stash server&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;Log Entry action now allows you to &lt;strong&gt;add the message as a build comment&lt;/strong&gt;. This can be useful for showing additional build details on the build view page.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;New &lt;strong&gt;comments field &lt;/strong&gt;on all actions &amp;ndash; displayed as a tooltip in Stages editor.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;New ContinuaCI.* &lt;strong&gt;system environment variables&lt;/strong&gt; are now available to all executable actions.&lt;br /&gt;
    &lt;br /&gt;
    &lt;table style="width: 300px;"&gt;
        &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;ContinuaCI.AgentProperty.*&lt;br /&gt;
                ContinuaCI.Variable.*&lt;br /&gt;
                ContinuaCI.Project.Name&lt;br /&gt;
                ContinuaCI.Configuration.Name&lt;br /&gt;
                ContinuaCI.Build.Id&lt;br /&gt;
                ContinuaCI.Build.BuildNumber&lt;br /&gt;
                ContinuaCI.Build.ChangesetCount&lt;br /&gt;
                ContinuaCI.Build.ChangesetRevisions&lt;br /&gt;
                ContinuaCI.Build.ChangesetTagNames &lt;br /&gt;
                ContinuaCI.Build.ChangesetUserNames &lt;br /&gt;
                ContinuaCI.Build.Elapsed &lt;br /&gt;
                ContinuaCI.Build.HasNewChanges&lt;br /&gt;
                ContinuaCI.Build.IsFeatureBranchBuild&lt;br /&gt;
                &lt;/td&gt;
                &lt;td style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;
                ContinuaCI.Build.IssueCount&lt;br /&gt;
                ContinuaCI.Build.LatestChangeset.Created&lt;br /&gt;
                ContinuaCI.Build.LatestChangeset.IssueCount&lt;br /&gt;
                ContinuaCI.Build.LatestChangeset.RepositoryName&lt;br /&gt;
                ContinuaCI.Build.LatestChangeset.Revision&lt;br /&gt;
                ContinuaCI.Build.LatestChangeset.TagCount&lt;br /&gt;
                ContinuaCI.Build.LatestChangeset.UserName&lt;br /&gt;
                ContinuaCI.Build.Started&lt;br /&gt;
                ContinuaCI.Build.StartedBy&lt;br /&gt;
                ContinuaCI.Build.TimeOnQueue&lt;br /&gt;
                ContinuaCI.Build.UsesDefaultBranch&lt;br /&gt;
                ContinuaCI.Build.Version&lt;br /&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/tbody&gt;
    &lt;/table&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;Execute Program, DOS Command and PowerShell actions now include an option to generate a &lt;strong&gt;context XML file&lt;/strong&gt;. This file contains details of the build including repositories, changesets and files for you to parse with your own script or program.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Git repositories&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Case-only renames&lt;/strong&gt; are now recorded in the repository cache.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;New option to list &lt;strong&gt;author instead of committer&lt;/strong&gt; as changeset username&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;strong&gt;Version 1.7 is ready for you to &lt;a href="https://www.finalbuilder.com/downloads/continuaci"&gt;download&lt;/a&gt; and install. All feedback is welcome!&lt;/strong&gt;&lt;/h5&gt;</description><guid isPermaLink="false">734</guid></item><item><title>Introducing Continua CI Version 1.7 beta</title><link>https://www.finalbuilder.com/resources/blogs/postid/732/introducing-continua-ci-version-17-beta</link><category>Continua CI</category><pubDate>Wed, 29 Jul 2015 15:30:43 GMT</pubDate><description>&lt;p&gt;This version introduces several new features, many of which have been requested by users over the past few months. These features are built upon the various improvements and bug fixes applied in revisions to version 1.6.
Please don&amp;rsquo;t dismay if your requested feature is not included yet, it is still high on our to-do list. Indeed we have several other features specced out, and some partially developed in the background.&lt;/p&gt;
&lt;h2&gt;Version 1.7 Features&lt;/h2&gt;
&lt;h3&gt;New Builds View dashboard&lt;/h3&gt;
&lt;p&gt;This view is useful for project administrators and shows a list of active builds across all viewable configurations. This includes running builds, queued builds and builds awaiting promotion.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blogimages/daves/v1.7beta/buildsview.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;New panel of indicators&lt;/h3&gt;
&lt;p&gt;Some important numbers including the total count of queued and running builds, as well as available agents and concurrent build licenses.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blogimages/daves/v1.7beta/indicators.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;New Repositories tab&lt;/h3&gt;
&lt;p&gt; This is accessed via the Configurations view and shows status of each repository. We've also included &amp;ldquo;Check &amp;nbsp;Now&amp;rdquo; buttons for immediately polling each repository. You can also initiate repository checking from all existing repository pages&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="/blogimages/daves/v1.7beta/repoview.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Project-wide and configuration versioning options.&lt;/h3&gt;
&lt;p&gt;We've added some new options in the details section of the project and configuration wizards&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Project-wide versioning: &lt;/strong&gt;The build version number can now be incremented across many configurations within a project.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Build number re-use: &lt;/strong&gt;A new &lt;span&gt;option at the&amp;nbsp;&lt;/span&gt;project or configuration level to decrement the version counter when a build is discarded while initialising. e.g. due to configuration conditions. Please note that the build number will be decremented only if no other build has started in the mean time and is using a later build number. &amp;nbsp;&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;img alt="" src="/blogimages/daves/v1.7beta/projectwidesettings.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Improvements to Build Completed triggers.&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Variable expressions: &lt;/strong&gt;You can now use expressions when defining variables allowing you to pass information from triggering to triggered build.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;New conditions tab:&lt;/strong&gt; This allows you to use expressions to control whether a build is triggered&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;img alt="" src="/blogimages/daves/v1.7beta/buildcompletedconditions.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Improvements to Repository triggers.&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Trigger on specific file change types: &lt;/strong&gt;Triggers can now be set to start only when the changeset contains certain types of file changes e.g. additions, modifications and deletions.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Trigger file pattern: &lt;/strong&gt;You can now specify a file pattern for repository triggers to restrict triggering only to changesets containing matching files.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Trigger comment pattern:&amp;nbsp;&lt;/strong&gt;You can also limit triggering to changesets with specific text in the comment.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;img alt="" src="/blogimages/daves/v1.7beta/repotriggeroptions.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Other build features&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;New &lt;strong&gt;force repository check&lt;/strong&gt; option in queue build dialog allowing control over whether to recheck repository when building. There is also a default setting for each configuration&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;Improvements to &lt;strong&gt;Stop Build buttons on dashboard view&lt;/strong&gt;&amp;nbsp;to ensure that the build stopped is always the latest build at the time when the button was clicked. Stop build dialogs also now display the build number of the build being stopped.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h3&gt;Actions and event handlers&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;New &lt;strong&gt;node.js actions
    &lt;/strong&gt;
    &lt;ul&gt;
        &lt;li&gt;Package management with Npm and Bower&lt;/li&gt;
        &lt;li&gt;Grunt and Gulp build runners&lt;/li&gt;
        &lt;li&gt;Unit testing with Mocha&lt;br /&gt;
        &lt;br /&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;New build event handler for posting &lt;strong&gt;status updates to a Stash server&lt;/strong&gt;&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;Log Entry action now allows you to &lt;strong&gt;add the message as a build comment&lt;/strong&gt;. This can be useful for showing additional build details on the build view page.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;New &lt;strong&gt;comments field &lt;/strong&gt;on all actions &amp;ndash; displayed as a tooltip in Stages editor.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;New ContinuaCI.* &lt;strong&gt;system environment variables&lt;/strong&gt; are now available to all executable actions.&lt;br /&gt;
    &lt;br /&gt;
    &lt;table style="width: 300px;"&gt;
        &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;ContinuaCI.AgentProperty.*&lt;br /&gt;
                ContinuaCI.Variable.*&lt;br /&gt;
                ContinuaCI.Project.Name&lt;br /&gt;
                ContinuaCI.Configuration.Name&lt;br /&gt;
                ContinuaCI.Build.Id&lt;br /&gt;
                ContinuaCI.Build.BuildNumber&lt;br /&gt;
                ContinuaCI.Build.ChangesetCount&lt;br /&gt;
                ContinuaCI.Build.ChangesetRevisions&lt;br /&gt;
                ContinuaCI.Build.ChangesetTagNames &lt;br /&gt;
                ContinuaCI.Build.ChangesetUserNames &lt;br /&gt;
                ContinuaCI.Build.Elapsed &lt;br /&gt;
                ContinuaCI.Build.HasNewChanges&lt;br /&gt;
                ContinuaCI.Build.IsFeatureBranchBuild&lt;br /&gt;
                &lt;/td&gt;
                &lt;td style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;
                ContinuaCI.Build.IssueCount&lt;br /&gt;
                ContinuaCI.Build.LatestChangeset.Created&lt;br /&gt;
                ContinuaCI.Build.LatestChangeset.IssueCount&lt;br /&gt;
                ContinuaCI.Build.LatestChangeset.RepositoryName&lt;br /&gt;
                ContinuaCI.Build.LatestChangeset.Revision&lt;br /&gt;
                ContinuaCI.Build.LatestChangeset.TagCount&lt;br /&gt;
                ContinuaCI.Build.LatestChangeset.UserName&lt;br /&gt;
                ContinuaCI.Build.Started&lt;br /&gt;
                ContinuaCI.Build.StartedBy&lt;br /&gt;
                ContinuaCI.Build.TimeOnQueue&lt;br /&gt;
                ContinuaCI.Build.UsesDefaultBranch&lt;br /&gt;
                ContinuaCI.Build.Version&lt;br /&gt;
                &lt;/td&gt;
            &lt;/tr&gt;
        &lt;/tbody&gt;
    &lt;/table&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;Execute Program, DOS Command and PowerShell actions now include an option to generate a &lt;strong&gt;context XML file&lt;/strong&gt;. This file contains details of the build including repositories, changesets and files for you to parse with your own script or program.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Git repositories&lt;/h3&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Case-only renames&lt;/strong&gt; are now recorded in the repository cache.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;New option to list &lt;strong&gt;author instead of committer&lt;/strong&gt; as changeset username&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;strong&gt;Version 1.7 beta is ready for you to &lt;a href="https://www.finalbuilder.com/downloads/continuaci"&gt;download&lt;/a&gt; and install. All feedback is welcome!&lt;/strong&gt;&lt;/h5&gt;</description><guid isPermaLink="false">732</guid></item><item><title>Deployment with Continua CI 1.5 and Octopus Deploy</title><link>https://www.finalbuilder.com/resources/blogs/postid/712/deployment-with-continua-ci-and-octopus-deploy</link><category>.NET,Continua CI</category><pubDate>Wed, 02 Jul 2014 16:12:00 GMT</pubDate><description>&lt;p&gt;So you've got your Continua CI server set up to automatically build, run unit tests and produce reports for your awesome new web application. Now you're ready to try out your project in its natural environment and then eventually release it to the wild for well-deserved public applause.&lt;br /&gt;
&lt;br /&gt;
Up until now, your options were either to use a Copy action to push the files up to test server and a PowerShell action to set up web services, or preferably run a FinalBuilder script utilising the plethora of actions available for transferring files and interacting with web servers.&lt;br /&gt;
&lt;br /&gt;
As of version 1.5, Continua CI can also work together with &lt;a href="https://octopusdeploy.com"&gt;Octopus Deploy&lt;/a&gt; server to provide an end-to-end continuous delivery mechanism. Using the new build event handlers feature, Continua CI builds can now be set up to create Octopus Deploy releases and initiate deployment to test and production environments, at key points in the build process.&lt;br /&gt;
&lt;br /&gt;
This post will walk through the steps required to push a .Net web application built in Continua to Octopus Deploy and trigger a deployment process to effortlessly get your application running on your test and production servers.&lt;br /&gt;
 &lt;/p&gt;

&lt;h3&gt;Preparing your solution&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;
Octopus Deploy requires that you provide your applications as &lt;a href="https://www.nuget.org"&gt;NuGet packages&lt;/a&gt;. You can create and push the package to the Octopus Deploy server using Nuget Pack and Push actions, or create and push an &lt;a href="https://docs.octopusdeploy.com/display/OD/Using+OctoPack"&gt;OctoPack&lt;/a&gt; from MSBuild or VisualStudio build runner actions.&lt;br /&gt;
&lt;br /&gt;
Lets go with the recommended OctoPack option. First prepare your Visual Studio solution - use the NuGet package manager to install the OctoPack package into the projects you want to deploy. This will include web application projects, console application projects and Windows service projects but not class libraries and unit test projects.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/octopack.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
You can now optionally add a &lt;a href="https://docs.nuget.org/docs/reference/nuspec-reference"&gt;.nuspec file&lt;/a&gt; to the root folder of your project to describe the contents of your package. If you don't provide a .nuspec file, OctoPack will automatically create one based on your project settings.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/nuspec.png" /&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Setting up the deployment process&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;
Next head over to your Octopus server and set up a deployment project. This should include a “Deploy a NuGet package” process step as below.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/deploymentstep.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
We will set this to retrieve the application package from the built-in NuGet feed. Note that the NuGet package id should match the id element in your .nuspec file - this will default to the name of your assembly.&lt;br /&gt;
&lt;br /&gt;
We added a few more steps:&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/deploymentprocess.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
And some variables:&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/deploymentvariables.png" /&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Setting up the build process&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;
You can now get back to Continua and set up a configuration for building your project. Once you have entered the configuration details and linked up the repository containing your project, move on over to the Stages page:&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/buildstage.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
For this simple example you'll need two actions: a NuGet Restore action to ensure that the OctoPack package is available for the build and an MSBuild action to build and push the application to your Octopus Deploy server.&lt;br /&gt;
Just enter the path to your solution for the NuGet Restore action (the other fields can be left as is) and complete the main tab of the MSBuild action as required for your project.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/msbuildaction.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
You then need to enter some additional properties to tell MSBuild to run OctoPack and tell it where to send your package.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/msbuildproperties.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
Set the &lt;em&gt;RunOctoPack &lt;/em&gt;property to true and the &lt;em&gt;OctoPackPublishPackageToHttp &lt;/em&gt;property to the URL for the NuGet feed on the Octopus Deploy server e.g. https://octopusserver/nuget/packages&lt;br /&gt;
&lt;br /&gt;
You will also need to provide an &lt;em&gt;OctoPackPublishAPIKey &lt;/em&gt;property – you can generate an API key on your profile page on the Octopus Deploy server.&lt;br /&gt;
&lt;br /&gt;
&lt;span&gt;Optionally, y&lt;/span&gt;ou can  use the &lt;em&gt;OctoPackPackageVersion &lt;/em&gt;to specify up the package version. Here we use Continua expressions to set this based on the build version. If you leave this out then OctoPack will get this value from the &lt;em&gt;AssemblyVersion &lt;/em&gt;property in your AssemblyInfo.cs file.&lt;br /&gt;
&lt;br /&gt;
Once the actions are set up and saved, run a build and check that your package gets uploaded to the Octopus Deploy server. Then create a release for your deployment project and test that it deploys ok. Now we are ready to look into how to run this process automatically from Continua CI.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Build event handler&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;
On the Continua CI configuration wizard after Stages, we have a new area titled Events. Here you can add &lt;a href="https://wiki.finalbuilder.com/x/BgB4"&gt;Build Event Handlers&lt;/a&gt; for tagging repository changesets, updating the GitHub status and interacting with Octopus Deploy.&lt;br /&gt;
&lt;br /&gt;
Create a new build event handler, give it a name and select the Octopus Deploy as the Type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/neweventhandler.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
You can now provide general project details under the Octopus Deploy tab.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/octopusdeploydetails.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
The Octopus Deploy URL should end with '/api' e.g. https://octopusserver/api. Enter the API key generated under your Octopus Deploy profile and the name of your deployment project.&lt;br /&gt;
  &lt;br /&gt;
You can then choose one or more actions to run. The available options are &lt;strong&gt;Create&lt;/strong&gt;, &lt;strong&gt;Deploy&lt;/strong&gt; and &lt;strong&gt;Promote&lt;/strong&gt; and are used to create a new deployment release, deploy a release to an environment and promote a release from one environment to another. As you select each action, new tabs open so you can provide further details and hook the action to a build event.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Creating a release&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;
Before you can deploy an application you need to create a Octopus Deploy release&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/createrelease.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
When creating a release you can specify the Release Version or leave this blank to automatically create a number based on the highest package version. You must provide either a Default Package Version or Step Package Versions for each step which requires one e.g.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/steppackageversions.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
Flip over to the Create Options tab to tell Continua when to create the release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/createoptions.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
There are six &lt;a href="https://wiki.finalbuilder.com/x/GQB4"&gt;Build Events&lt;/a&gt; available to choose from. Some allow you to select a Stage and some allow you to select a successful or failed Build Status&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;On Before Stage Start&lt;/li&gt;
	&lt;li&gt;On Sending Stage To Agent&lt;/li&gt;
	&lt;li&gt;On Stage Completed&lt;/li&gt;
	&lt;li&gt;On Build Pending Promotion&lt;/li&gt;
	&lt;li&gt;On After Build Continued&lt;/li&gt;
	&lt;li&gt;On Build Completed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
Generally we want to create the release at the start of the build before the first stage starts.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Deploying to an environment&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;
Now on to the crux of this whole process - deploying your application. We generally deploy to a Test environment first and then, once we are happy with the outcome, promote to a User Acceptance environment or directly to Production. Continua CI allows you to deploy a release previously created by a Create action in the same build event handler, the highest release version in the project or a specific release version. It's up to you to ensure that the release version exists before the deploy action is run. An environment can consist of multiple machines - you can specify which machines you want to deploy to. If no machines are specified then the release will be deployed to all machines in the environment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/deployrelease.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When selecting the Build Event for deployment, ensure that it is triggerred after the package has been built and pushed to the Octopus Deploy server. Here we have set this to be run once the Build stage has completed successfully.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/deployoptions.png" /&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Promoting a release&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;
You can promote the latest release from one environment to another. Ideally this would be linked to the promotion of a stage e.g. a testing stage, so that the application can be promoted from a test environment to production environment.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/promoterelease.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
We have set our test stage to require manual promotion;&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/stagepromoteoptions.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
and set our promote action to run when a build is continued after waiting for promotion.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/promoteoptions.png" /&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt; &lt;/h3&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Variables&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;
You can also pass variables from Continua CI to your deployment, these will be sent to the Octopus Deploy server before each action is run, updating the variables for the deployment project. We have used expressions is this example to send the build versions number and branch name. These variables can then be used to update project files with details for display or configure services differently depending on the source of the project.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/variables.png" /&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h3&gt;Running the configuration&lt;/h3&gt;

&lt;p&gt;&lt;br /&gt;
Once your build event handler dialog has been completed and saved, its time to start running the configuration. As the build processes Continua CI will display status information mirroring the process running on Octopus Deploy.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/status.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
You can also see full details of the deployment process in the build log.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/buildlog.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
And all going well you will now see a successful deployment on your Octopus Deploy server!&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" src="https://cdn.finalbuilder.com/blog/daves/octopus/success.png" /&gt;&lt;/p&gt;
</description><guid isPermaLink="false">712</guid></item></channel></rss>