<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://community.appian.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Appian DevOps Quick Start</title><link>https://community.appian.com/success/w/article/3225/appian-devops-quick-start</link><description /><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><item><title>Appian DevOps Quick Start</title><link>https://community.appian.com/success/w/article/3225/appian-devops-quick-start</link><pubDate>Thu, 18 Apr 2024 15:58:30 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:503b7a31-6400-40ab-ad83-219e9e6a40e0</guid><dc:creator>Appian Max Team</dc:creator><comments>https://community.appian.com/success/w/article/3225/appian-devops-quick-start#comments</comments><description>Current Revision posted to Article by Appian Max Team on 4/18/2024 3:58:30 PM&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;This document serves as a guide to configure a generic automated process for versioning and importing Appian applications using a defined DevOps pipeline. This guide has been assembled as a holistic process that covers automated versioning, application import/export, and testing. While the pipeline described can be used as-is for many different projects, it can also be adapted to fit other configurations and environments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#devops_overview"&gt;DevOps Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#what_is_devops"&gt;What is DevOps?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#what_is_devops_pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appian_devops_pipeline_overview"&gt;Appian DevOps Pipeline Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#why_devops_important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tools_devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how_devops_works"&gt;How does the Appian DevOps Pipeline work?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops_pipeline"&gt;Appian DevOps Pipeline&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#prereqs"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#setup"&gt;Pipeline Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dev"&gt;Developer Environment Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how_to_use"&gt;How to use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#verify"&gt;Verify Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appendix"&gt;Appendix&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#structure"&gt;Code Repository File Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#security"&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cloud"&gt;Appian Cloud Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#environments"&gt;Environments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="devops_overview"&gt;DevOps Overview&lt;/h2&gt;
&lt;h3 id="what_is_devops"&gt;What is DevOps?&lt;/h3&gt;
&lt;p&gt;Development and Operations (DevOps) is a set of practices and tools that help foster a culture of collaboration between development and operations to enable the rapid, frequent, and reliable delivery of software.&lt;/p&gt;
&lt;h3 id="what_is_devops_pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;Continuous Integration&lt;/a&gt;&amp;nbsp;(CI) and&amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Continuous_delivery"&gt;Continuous Delivery&lt;/a&gt;&amp;nbsp;(CD) describe a set of procedures many modern software companies follow in order to ensure their software is robust and compatible with current and previous versions. A&amp;nbsp;&lt;a href="https://devops.com/continuous-delivery-pipeline/"&gt;DevOps pipeline&lt;/a&gt;&amp;nbsp;breaks the CI and CD processes into discrete automated stages.&lt;/p&gt;
&lt;h2 id="appian_devops_pipeline_overview"&gt;Appian DevOps Pipeline Overview&lt;/h2&gt;
&lt;h3 id="why_devops_important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/h3&gt;
&lt;p&gt;Appian applications, though faster and simpler to build and maintain than traditional software applications, must also go through a basic life cycle that goes from conception to implementation and testing before they can be deployed to end users. Automating and modularizing this process makes Appian application development even faster and simpler.&lt;/p&gt;
&lt;h3 id="tools_devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/894x501/__key/communityserver-wikis-components-files/00-00-00-00-45/2260.tools.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Planning and Ticket Management:&amp;nbsp;&lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Development Platform:&amp;nbsp;&lt;a href="https://www.appian.com/"&gt;Appian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code Version Control System (VCS):&amp;nbsp;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Database Version Control System (VCS):&amp;nbsp;&lt;a href="https://documentation.red-gate.com/fd/getting-started-212140421.html"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pipeline Tool:&amp;nbsp;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Artifact Repository:&amp;nbsp;&lt;a href="https://jfrog.com/artifactory/"&gt;JFrog Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Secret Management:&amp;nbsp;&lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Packaging:&amp;nbsp;&lt;a href="/w/guide/3328/deployment-automation#Automated_Versioning_Manager"&gt;Appian Automated Versioning Manager (AVM)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Automated Testing:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.appian.com/suite/help/latest/Automated_Testing_for_Expression_Rules.html"&gt;Appian Expression Tests (AET)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Software Release Management:&amp;nbsp;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deployment Automation: &lt;a href="https://docs.appian.com/suite/help/latest/Deployment_Rest_API.html"&gt;Appian Deployment API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="how_devops_works"&gt;How does the Appian DevOps Pipeline work?&lt;/h3&gt;
&lt;p&gt;The recommended Appian DevOps Pipeline leverages&amp;nbsp;&lt;a href="https://trunkbaseddevelopment.com"&gt;trunk-based development&lt;/a&gt;. The Appian Dev environment can be interpreted as a &amp;ldquo;branch&amp;rdquo;. Adding the Appian Applications to the &amp;ldquo;master&amp;rdquo; branch in version control is the equivalent of &amp;ldquo;merging&amp;rdquo;. After the &amp;ldquo;merge&amp;rdquo;, the Appian Dev environment can be interpreted as a &amp;ldquo;new branch&amp;rdquo;. The goal is to &amp;ldquo;merge&amp;rdquo; frequently to the &amp;ldquo;master&amp;rdquo; branch to keep the spirit of &amp;ldquo;short-lived branches&amp;rdquo;.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/986x453/__key/communityserver-wikis-components-files/00-00-00-00-45/6237.process.png" /&gt;&lt;/div&gt;
&lt;h2 id="devops_pipeline"&gt;Appian DevOps Pipeline&lt;/h2&gt;
&lt;h3 id="prereqs"&gt;Prerequisites&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jfrog.com/artifactory/"&gt;Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt;&amp;nbsp;need to be accessible in the Jenkins workspace&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3328/deployment-automation"&gt;Appian Automated Deployment Manager (ADM)&lt;/a&gt;&amp;nbsp;(Only Appian Version Manager is leveraged in this Pipeline)&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="setup"&gt;Pipeline Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/appian/devops-quickstart/archive/master.zip"&gt;Download&lt;/a&gt;&amp;nbsp;or re-create the recommended&amp;nbsp;&lt;a href="#structure"&gt;file structure&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;Please refer to the documentation contained in the repository&amp;nbsp;&lt;code&gt;README.md&lt;/code&gt;&amp;nbsp;files for more detailed guidance&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Connect the local repository copy to a new Github repository&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/test_suites/QuickStart&amp;lt;Integration/Acceptance&amp;gt;Test/content.txt&lt;/code&gt;&amp;nbsp;files
&lt;pre class="ui-code"&gt;|set appian url to |https://&amp;lt;integration/acceptance-site-url&amp;gt;/suite |
|set appian version to |&amp;lt;site-url-version&amp;gt; |
|set appian locale to |en_US |
|login with username |&amp;lt;username-for-site&amp;gt; |&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update devops/deploymentmanager.properties files for each environment to specify site URL and API Key.
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="text"&gt;### Environment-specific properties
## REQUIRED. URL of the environment
url=[Enter URL of the appian site e.g. https://yourCloudSite.appiancloud.com/suite]
siteApiKey=[Enter the API key for the deployment service account created in Appian]
packageFileName=app-package.zip
### Import-specific properties
## REQUIRED Name for the deployment
deploymentName=[ Enter a name for the deployment, to appear in the deployment tab within Appian]
## REQUIRED Description for the deployment
deploymentDescription=[ Enter a description for the deployment, to appear in the deployment tab within Appian]&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/users.properties&lt;/code&gt;
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;# List of username/password combination with access to Appian environment
# Example: fitnesse.user=password
&amp;lt;username-for-site&amp;gt;=&amp;lt;password&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;The following parameters need to be accessible to the&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;&amp;nbsp;as environmental variables:
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOUSERNAME&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Username for remote repository&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOPASSWORD&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Password for remote repository.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYAPIKEY&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;API Key to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYURL&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;URL to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Create a generic repository in Artifactory to store the .zip files for ADM and FitNesse for Appian based on the recommended&amp;nbsp;&lt;a href="#artifact-structure"&gt;file structure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a Jenkins Job
&lt;ol&gt;
&lt;li&gt;Create a &amp;lsquo;New Item&amp;rsquo;
&lt;ol&gt;
&lt;li&gt;Pick a descriptive name, such as &amp;ldquo;My-App-QuickStart&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Select &amp;ldquo;Pipeline&amp;rdquo; Job&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;This project is parameterized&amp;rdquo; and add the following parameters:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;String&lt;/strong&gt;:&amp;nbsp;APPLICATIONNAME
&lt;ol&gt;
&lt;li&gt;Name of application being deployed (Should correspond directly with folder name in repository)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;Poll SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Cron"&gt;Schedule&lt;/a&gt;:&amp;nbsp;&lt;/strong&gt;&amp;ldquo;0 2 * * *&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;In the Pipeline definition, &amp;ldquo;Pipeline script from SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SCM:&amp;nbsp;&lt;/strong&gt;Git&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository URL&lt;/strong&gt;: URL to remote repository&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Script Path:&lt;/strong&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="dev"&gt;Developer Environment Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="/w/guide/3328/deployment-automation#Installation1"&gt;Install ADM&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;li&gt;Override the default Automated Versioning Manager&amp;rsquo;s&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file with the copy from the repo located at&amp;nbsp;&lt;code&gt;devops/adm/version-manager.local.properties&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Adjust the&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file as necessary to match your local preferences
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;### Environment-specific properties
## REQUIRED. Username of the version control account
vcUsername=&amp;lt;remote-repo-username&amp;gt;
## REQUIRED. Password of the version control account
vcPassword=&amp;lt;remote-repo-password&amp;gt;
## REQUIRED. URL to access the remote repository
repoUrl=&amp;lt;remote-repo-url&amp;gt;
## REQUIRED. Path to the folder containing the local repository
localRepoPath=&amp;lt;local-repo-path&amp;gt;
## Path to the folder containing the Appian objects in the repository. This path is relative to the path of the local repository. If not specified, the Appian objects are checked out to and committed from the root of the local repository path.
## Assure that the path does not contain any preceding or trailing forward slashes. Example: appian/applications/Hello_World
appianObjectsRepoPath=appian/applications/&amp;lt;application-name&amp;gt;


### Action-specific properties
## REQUIRED. Valid choices are addContents, buildAllApps, buildSingleApp, or updateLocalRepo
action=addContents
## Path for the application ZIP file to add to version control. Used for the addContents action.
applicationPath=&amp;lt;path-to-local-application-ZIP&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Install&amp;nbsp;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="how_to_use"&gt;How to use&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Use git to update your&amp;nbsp;local repository with any&amp;nbsp;remote changes&lt;/li&gt;
&lt;li&gt;Use&amp;nbsp;&lt;a href="/w/guide/3328/deployment-automation#addContents"&gt;Version Manager&lt;/a&gt;&amp;nbsp;to add your Appian application/patch to the repo
&lt;ol&gt;
&lt;li&gt;Include any necessary Flyway migration files associated to the application changes&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Wait for the pipeline to be triggered or manually trigger it&lt;/li&gt;
&lt;li&gt;Use the&amp;nbsp;&lt;a href="https://plugins.jenkins.io/pipeline-stage-view"&gt;Jenkins pipeline dashboard&lt;/a&gt;&amp;nbsp;to monitor the automated tests and deployments&lt;/li&gt;
&lt;li&gt;In the &amp;ldquo;Promotion Decision&amp;rdquo; stage, either promote or abort the pipeline job&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="verify"&gt;Verify Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Verify the Jenkins job pipeline ran successfully and all stages are reported green&lt;/li&gt;
&lt;li&gt;Navigate to &amp;ldquo;Releases&amp;rdquo; in your GitHub repository and verify that a release has been made
&lt;ol&gt;
&lt;li&gt;The release should include the application zip as well as a custom import properties file, if specified in&amp;nbsp;&lt;code&gt;appian/properties&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="appendix"&gt;Appendix&lt;/h2&gt;
&lt;h3 id="structure"&gt;Code Repository File Structure&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/appian/devops-quickstart"&gt;Download Sample Code Repository File Structure&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;appian
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;applications
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;properties
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;devops
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0044.pastedimage1649095776037v1.png" /&gt;deploymentmanagement.prod.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/8267.pastedimage1649095826124v2.png" /&gt;deploymentmanagement.test.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/8081.pastedimage1649095827402v3.png" /&gt;deploymentmanagement.stag.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;adm
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.prod.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.stag.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.test.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;version-manager.local.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;version-manager.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;f4a
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;test_suites
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;QuickStartAcceptanceTest&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;QuickStartIntegrationTest&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;fitnesse-automation.acceptance.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;fitnesse-automation.integration.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;users.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="artifact-structure"&gt;&lt;/a&gt;Artifact Repository File Structure&lt;/h3&gt;
&lt;p&gt;Download &lt;a href="/b/appmarket/posts/deployment-automation-manager"&gt;ADM&lt;/a&gt; and &lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;. Rename the .zip files as adm.zip and f4a.zip respectively. Upload them to an Artifactory repo named appian-devops.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1588.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;appian-devops
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0753.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;adm.zip&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0753.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;f4a.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="security"&gt;Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It is recommended to configure the pipeline infrastructure to limit access to node machines executing the pipeline to ensure sensitive information required for execution is properly secured.&lt;/li&gt;
&lt;li&gt;The sample Jenkinsfile document relies on credentials stored in plaintext directly in the properties files or environment variables. This is intended for demonstration purposes only. It is recommended to store credentials in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime.&lt;/li&gt;
&lt;li&gt;For sensitive configuration properties, such as those used in the staging and production environments, it is recommended to store their values in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime. Consider updating the sample properties files to use a single tokenized file if all the values for each environment are stored in a separate system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Appian Cloud Considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All plugins needed by your Appian applications should be deployed to all the Appian environments before running the pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="environments"&gt;Environments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The pipeline is setup to automatically add git tags to keep track of the version of the applications that is deployed on each environment. This is simpler than using separate branches or a different system. It&amp;rsquo;s also fully automated and traceable via the git tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: Configuration Management, Platform&lt;/div&gt;
</description></item><item><title>Appian DevOps Quick Start</title><link>https://community.appian.com/success/w/article/3225/appian-devops-quick-start/revision/7</link><pubDate>Tue, 31 Oct 2023 16:34:18 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:503b7a31-6400-40ab-ad83-219e9e6a40e0</guid><dc:creator>matt.cosenza</dc:creator><comments>https://community.appian.com/success/w/article/3225/appian-devops-quick-start#comments</comments><description>Revision 7 posted to Article by matt.cosenza on 10/31/2023 4:34:18 PM&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;This document serves as a guide to configure a generic automated process for versioning and importing Appian applications using a defined DevOps pipeline. This guide has been assembled as a holistic process that covers automated versioning, application import/export, and testing. While the pipeline described can be used as-is for many different projects, it can also be adapted to fit other configurations and environments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#devops_overview"&gt;DevOps Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#what_is_devops"&gt;What is DevOps?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#what_is_devops_pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appian_devops_pipeline_overview"&gt;Appian DevOps Pipeline Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#why_devops_important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tools_devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how_devops_works"&gt;How does the Appian DevOps Pipeline work?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops_pipeline"&gt;Appian DevOps Pipeline&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#prereqs"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#setup"&gt;Pipeline Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dev"&gt;Developer Environment Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how_to_use"&gt;How to use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#verify"&gt;Verify Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appendix"&gt;Appendix&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#structure"&gt;Code Repository File Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#security"&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cloud"&gt;Appian Cloud Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#environments"&gt;Environments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="devops_overview"&gt;DevOps Overview&lt;/h2&gt;
&lt;h3 id="what_is_devops"&gt;What is DevOps?&lt;/h3&gt;
&lt;p&gt;Development and Operations (DevOps) is a set of practices and tools that help foster a culture of collaboration between development and operations to enable the rapid, frequent, and reliable delivery of software.&lt;/p&gt;
&lt;h3 id="what_is_devops_pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;Continuous Integration&lt;/a&gt;&amp;nbsp;(CI) and&amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Continuous_delivery"&gt;Continuous Delivery&lt;/a&gt;&amp;nbsp;(CD) describe a set of procedures many modern software companies follow in order to ensure their software is robust and compatible with current and previous versions. A&amp;nbsp;&lt;a href="https://devops.com/continuous-delivery-pipeline/"&gt;DevOps pipeline&lt;/a&gt;&amp;nbsp;breaks the CI and CD processes into discrete automated stages.&lt;/p&gt;
&lt;h2 id="appian_devops_pipeline_overview"&gt;Appian DevOps Pipeline Overview&lt;/h2&gt;
&lt;h3 id="why_devops_important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/h3&gt;
&lt;p&gt;Appian applications, though faster and simpler to build and maintain than traditional software applications, must also go through a basic life cycle that goes from conception to implementation and testing before they can be deployed to end users. Automating and modularizing this process makes Appian application development even faster and simpler.&lt;/p&gt;
&lt;h3 id="tools_devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/894x501/__key/communityserver-wikis-components-files/00-00-00-00-45/2260.tools.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Planning and Ticket Management:&amp;nbsp;&lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Development Platform:&amp;nbsp;&lt;a href="https://www.appian.com/"&gt;Appian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code Version Control System (VCS):&amp;nbsp;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Database Version Control System (VCS):&amp;nbsp;&lt;a href="https://documentation.red-gate.com/fd/getting-started-212140421.html"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pipeline Tool:&amp;nbsp;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Artifact Repository:&amp;nbsp;&lt;a href="https://jfrog.com/artifactory/"&gt;JFrog Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Secret Management:&amp;nbsp;&lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Packaging:&amp;nbsp;&lt;a href="/w/guide/3328/deployment-automation#Automated_Versioning_Manager"&gt;Appian Automated Versioning Manager (AVM)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Automated Testing:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.appian.com/suite/help/latest/Automated_Testing_for_Expression_Rules.html"&gt;Appian Expression Tests (AET)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Software Release Management:&amp;nbsp;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deployment Automation: &lt;a href="https://docs.appian.com/suite/help/latest/Deployment_Rest_API.html"&gt;Appian Deployment API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="how_devops_works"&gt;How does the Appian DevOps Pipeline work?&lt;/h3&gt;
&lt;p&gt;The recommended Appian DevOps Pipeline leverages&amp;nbsp;&lt;a href="https://trunkbaseddevelopment.com"&gt;trunk-based development&lt;/a&gt;. The Appian Dev environment can be interpreted as a &amp;ldquo;branch&amp;rdquo;. Adding the Appian Applications to the &amp;ldquo;master&amp;rdquo; branch in version control is the equivalent of &amp;ldquo;merging&amp;rdquo;. After the &amp;ldquo;merge&amp;rdquo;, the Appian Dev environment can be interpreted as a &amp;ldquo;new branch&amp;rdquo;. The goal is to &amp;ldquo;merge&amp;rdquo; frequently to the &amp;ldquo;master&amp;rdquo; branch to keep the spirit of &amp;ldquo;short-lived branches&amp;rdquo;.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/986x453/__key/communityserver-wikis-components-files/00-00-00-00-45/6237.process.png" /&gt;&lt;/div&gt;
&lt;h2 id="devops_pipeline"&gt;Appian DevOps Pipeline&lt;/h2&gt;
&lt;h3 id="prereqs"&gt;Prerequisites&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jfrog.com/artifactory/"&gt;Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt;&amp;nbsp;need to be accessible in the Jenkins workspace&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3328/deployment-automation"&gt;Appian Automated Deployment Manager (ADM)&lt;/a&gt;&amp;nbsp;(Only Appian Version Manager is leveraged in this Pipeline)&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="setup"&gt;Pipeline Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/appian/devops-quickstart/archive/master.zip"&gt;Download&lt;/a&gt;&amp;nbsp;or re-create the recommended&amp;nbsp;&lt;a href="#structure"&gt;file structure&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;Please refer to the documentation contained in the repository&amp;nbsp;&lt;code&gt;README.md&lt;/code&gt;&amp;nbsp;files for more detailed guidance&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Connect the local repository copy to a new Github repository&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/test_suites/QuickStart&amp;lt;Integration/Acceptance&amp;gt;Test/content.txt&lt;/code&gt;&amp;nbsp;files
&lt;pre class="ui-code"&gt;|set appian url to |https://&amp;lt;integration/acceptance-site-url&amp;gt;/suite |
|set appian version to |&amp;lt;site-url-version&amp;gt; |
|set appian locale to |en_US |
|login with username |&amp;lt;username-for-site&amp;gt; |&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update devops/deploymentmanager.properties files for each environment to specify site URL and API Key.
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="text"&gt;### Environment-specific properties
## REQUIRED. URL of the environment
url=[Enter URL of the appian site e.g. https://yourCloudSite.appiancloud.com/suite]
siteApiKey=[Enter the API key for the deployment service account created in Appian]
packageFileName=app-package.zip
### Import-specific properties
## REQUIRED Name for the deployment
deploymentName=[ Enter a name for the deployment, to appear in the deployment tab within Appian]
## REQUIRED Description for the deployment
deploymentDescription=[ Enter a description for the deployment, to appear in the deployment tab within Appian]&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/users.properties&lt;/code&gt;
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;# List of username/password combination with access to Appian environment
# Example: fitnesse.user=password
&amp;lt;username-for-site&amp;gt;=&amp;lt;password&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;The following parameters need to be accessible to the&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;&amp;nbsp;as environmental variables:
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOUSERNAME&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Username for remote repository&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOPASSWORD&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Password for remote repository.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYAPIKEY&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;API Key to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYURL&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;URL to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Create a generic repository in Artifactory to store the .zip files for ADM and FitNesse for Appian based on the recommended&amp;nbsp;&lt;a href="#artifact-structure"&gt;file structure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a Jenkins Job
&lt;ol&gt;
&lt;li&gt;Create a &amp;lsquo;New Item&amp;rsquo;
&lt;ol&gt;
&lt;li&gt;Pick a descriptive name, such as &amp;ldquo;My-App-QuickStart&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Select &amp;ldquo;Pipeline&amp;rdquo; Job&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;This project is parameterized&amp;rdquo; and add the following parameters:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;String&lt;/strong&gt;:&amp;nbsp;APPLICATIONNAME
&lt;ol&gt;
&lt;li&gt;Name of application being deployed (Should correspond directly with folder name in repository)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;Poll SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Cron"&gt;Schedule&lt;/a&gt;:&amp;nbsp;&lt;/strong&gt;&amp;ldquo;0 2 * * *&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;In the Pipeline definition, &amp;ldquo;Pipeline script from SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SCM:&amp;nbsp;&lt;/strong&gt;Git&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository URL&lt;/strong&gt;: URL to remote repository&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Script Path:&lt;/strong&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="dev"&gt;Developer Environment Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="/w/guide/3328/deployment-automation#Installation1"&gt;Install ADM&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;li&gt;Override the default Automated Versioning Manager&amp;rsquo;s&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file with the copy from the repo located at&amp;nbsp;&lt;code&gt;devops/adm/version-manager.local.properties&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Adjust the&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file as necessary to match your local preferences
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;### Environment-specific properties
## REQUIRED. Username of the version control account
vcUsername=&amp;lt;remote-repo-username&amp;gt;
## REQUIRED. Password of the version control account
vcPassword=&amp;lt;remote-repo-password&amp;gt;
## REQUIRED. URL to access the remote repository
repoUrl=&amp;lt;remote-repo-url&amp;gt;
## REQUIRED. Path to the folder containing the local repository
localRepoPath=&amp;lt;local-repo-path&amp;gt;
## Path to the folder containing the Appian objects in the repository. This path is relative to the path of the local repository. If not specified, the Appian objects are checked out to and committed from the root of the local repository path.
## Assure that the path does not contain any preceding or trailing forward slashes. Example: appian/applications/Hello_World
appianObjectsRepoPath=appian/applications/&amp;lt;application-name&amp;gt;


### Action-specific properties
## REQUIRED. Valid choices are addContents, buildAllApps, buildSingleApp, or updateLocalRepo
action=addContents
## Path for the application ZIP file to add to version control. Used for the addContents action.
applicationPath=&amp;lt;path-to-local-application-ZIP&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Install&amp;nbsp;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="how_to_use"&gt;How to use&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Use git to update your&amp;nbsp;local repository with any&amp;nbsp;remote changes&lt;/li&gt;
&lt;li&gt;Use&amp;nbsp;&lt;a href="/w/guide/3328/deployment-automation#addContents"&gt;Version Manager&lt;/a&gt;&amp;nbsp;to add your Appian application/patch to the repo
&lt;ol&gt;
&lt;li&gt;Include any necessary Flyway migration files associated to the application changes&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Wait for the pipeline to be triggered or manually trigger it&lt;/li&gt;
&lt;li&gt;Use the&amp;nbsp;&lt;a href="https://plugins.jenkins.io/pipeline-stage-view"&gt;Jenkins pipeline dashboard&lt;/a&gt;&amp;nbsp;to monitor the automated tests and deployments&lt;/li&gt;
&lt;li&gt;In the &amp;ldquo;Promotion Decision&amp;rdquo; stage, either promote or abort the pipeline job&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="verify"&gt;Verify Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Verify the Jenkins job pipeline ran successfully and all stages are reported green&lt;/li&gt;
&lt;li&gt;Navigate to &amp;ldquo;Releases&amp;rdquo; in your GitHub repository and verify that a release has been made
&lt;ol&gt;
&lt;li&gt;The release should include the application zip as well as a custom import properties file, if specified in&amp;nbsp;&lt;code&gt;appian/properties&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="appendix"&gt;Appendix&lt;/h2&gt;
&lt;h3 id="structure"&gt;Code Repository File Structure&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/appian/devops-quickstart"&gt;Download Sample Code Repository File Structure&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;appian
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;applications
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;properties
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;devops
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0044.pastedimage1649095776037v1.png" /&gt;deploymentmanagement.prod.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/8267.pastedimage1649095826124v2.png" /&gt;deploymentmanagement.test.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/8081.pastedimage1649095827402v3.png" /&gt;deploymentmanagement.stag.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;adm
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.prod.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.stag.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.test.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;version-manager.local.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;version-manager.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;f4a
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;test_suites
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;QuickStartAcceptanceTest&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;QuickStartIntegrationTest&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;fitnesse-automation.acceptance.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;fitnesse-automation.integration.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;users.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="artifact-structure"&gt;&lt;/a&gt;Artifact Repository File Structure&lt;/h3&gt;
&lt;p&gt;Download &lt;a href="/b/appmarket/posts/deployment-automation-manager"&gt;ADM&lt;/a&gt; and &lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;. Rename the .zip files as adm.zip and f4a.zip respectively. Upload them to an Artifactory repo named appian-devops.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1588.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;appian-devops
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0753.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;adm.zip&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0753.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;f4a.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="security"&gt;Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It is recommended to configure the pipeline infrastructure to limit access to node machines executing the pipeline to ensure sensitive information required for execution is properly secured.&lt;/li&gt;
&lt;li&gt;The sample Jenkinsfile document relies on credentials stored in plaintext directly in the properties files or environment variables. This is intended for demonstration purposes only. It is recommended to store credentials in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime.&lt;/li&gt;
&lt;li&gt;For sensitive configuration properties, such as those used in the staging and production environments, it is recommended to store their values in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime. Consider updating the sample properties files to use a single tokenized file if all the values for each environment are stored in a separate system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Appian Cloud Considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All plugins needed by your Appian applications should be deployed to all the Appian environments before running the pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="environments"&gt;Environments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The pipeline is setup to automatically add git tags to keep track of the version of the applications that is deployed on each environment. This is simpler than using separate branches or a different system. It&amp;rsquo;s also fully automated and traceable via the git tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: Configuration Management, Platform&lt;/div&gt;
</description></item><item><title>Appian DevOps Quick Start</title><link>https://community.appian.com/success/w/article/3225/appian-devops-quick-start/revision/6</link><pubDate>Fri, 20 Oct 2023 15:18:02 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:503b7a31-6400-40ab-ad83-219e9e6a40e0</guid><dc:creator>matt.cosenza</dc:creator><comments>https://community.appian.com/success/w/article/3225/appian-devops-quick-start#comments</comments><description>Revision 6 posted to Article by matt.cosenza on 10/20/2023 3:18:02 PM&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;This document serves as a guide to configure a generic automated process for versioning and importing Appian applications using a defined DevOps pipeline. This guide has been assembled as a holistic process that covers automated versioning, application import/export, and testing. While the pipeline described can be used as-is for many different projects, it can also be adapted to fit other configurations and environments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#devops_overview"&gt;DevOps Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#what_is_devops"&gt;What is DevOps?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#what_is_devops_pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appian_devops_pipeline_overview"&gt;Appian DevOps Pipeline Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#why_devops_important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tools_devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how_devops_works"&gt;How does the Appian DevOps Pipeline work?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops_pipeline"&gt;Appian DevOps Pipeline&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#prereqs"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#setup"&gt;Pipeline Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dev"&gt;Developer Environment Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how_to_use"&gt;How to use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#verify"&gt;Verify Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appendix"&gt;Appendix&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#structure"&gt;Code Repository File Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#security"&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cloud"&gt;Appian Cloud Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#environments"&gt;Environments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="devops_overview"&gt;DevOps Overview&lt;/h2&gt;
&lt;h3 id="what_is_devops"&gt;What is DevOps?&lt;/h3&gt;
&lt;p&gt;Development and Operations (DevOps) is a set of practices and tools that help foster a culture of collaboration between development and operations to enable the rapid, frequent, and reliable delivery of software.&lt;/p&gt;
&lt;h3 id="what_is_devops_pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;Continuous Integration&lt;/a&gt;&amp;nbsp;(CI) and&amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Continuous_delivery"&gt;Continuous Delivery&lt;/a&gt;&amp;nbsp;(CD) describe a set of procedures many modern software companies follow in order to ensure their software is robust and compatible with current and previous versions. A&amp;nbsp;&lt;a href="https://devops.com/continuous-delivery-pipeline/"&gt;DevOps pipeline&lt;/a&gt;&amp;nbsp;breaks the CI and CD processes into discrete automated stages.&lt;/p&gt;
&lt;h2 id="appian_devops_pipeline_overview"&gt;Appian DevOps Pipeline Overview&lt;/h2&gt;
&lt;h3 id="why_devops_important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/h3&gt;
&lt;p&gt;Appian applications, though faster and simpler to build and maintain than traditional software applications, must also go through a basic life cycle that goes from conception to implementation and testing before they can be deployed to end users. Automating and modularizing this process makes Appian application development even faster and simpler.&lt;/p&gt;
&lt;h3 id="tools_devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/894x501/__key/communityserver-wikis-components-files/00-00-00-00-45/2260.tools.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Planning and Ticket Management:&amp;nbsp;&lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Development Platform:&amp;nbsp;&lt;a href="https://www.appian.com/"&gt;Appian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code Version Control System (VCS):&amp;nbsp;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Database Version Control System (VCS):&amp;nbsp;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pipeline Tool:&amp;nbsp;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Artifact Repository:&amp;nbsp;&lt;a href="https://jfrog.com/artifactory/"&gt;JFrog Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Secret Management:&amp;nbsp;&lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Packaging:&amp;nbsp;&lt;a href="/w/guide/3328/deployment-automation#Automated_Versioning_Manager"&gt;Appian Automated Versioning Manager (AVM)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Automated Testing:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.appian.com/suite/help/latest/Automated_Testing_for_Expression_Rules.html"&gt;Appian Expression Tests (AET)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Software Release Management:&amp;nbsp;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deployment Automation: &lt;a href="https://docs.appian.com/suite/help/latest/Deployment_Rest_API.html"&gt;Appian Deployment API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="how_devops_works"&gt;How does the Appian DevOps Pipeline work?&lt;/h3&gt;
&lt;p&gt;The recommended Appian DevOps Pipeline leverages&amp;nbsp;&lt;a href="https://trunkbaseddevelopment.com"&gt;trunk-based development&lt;/a&gt;. The Appian Dev environment can be interpreted as a &amp;ldquo;branch&amp;rdquo;. Adding the Appian Applications to the &amp;ldquo;master&amp;rdquo; branch in version control is the equivalent of &amp;ldquo;merging&amp;rdquo;. After the &amp;ldquo;merge&amp;rdquo;, the Appian Dev environment can be interpreted as a &amp;ldquo;new branch&amp;rdquo;. The goal is to &amp;ldquo;merge&amp;rdquo; frequently to the &amp;ldquo;master&amp;rdquo; branch to keep the spirit of &amp;ldquo;short-lived branches&amp;rdquo;.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/986x453/__key/communityserver-wikis-components-files/00-00-00-00-45/6237.process.png" /&gt;&lt;/div&gt;
&lt;h2 id="devops_pipeline"&gt;Appian DevOps Pipeline&lt;/h2&gt;
&lt;h3 id="prereqs"&gt;Prerequisites&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jfrog.com/artifactory/"&gt;Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt;&amp;nbsp;need to be accessible in the Jenkins workspace&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3328/deployment-automation"&gt;Appian Automated Deployment Manager (ADM)&lt;/a&gt;&amp;nbsp;(Only Appian Version Manager is leveraged in this Pipeline)&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="setup"&gt;Pipeline Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/appian/devops-quickstart/archive/master.zip"&gt;Download&lt;/a&gt;&amp;nbsp;or re-create the recommended&amp;nbsp;&lt;a href="#structure"&gt;file structure&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;Please refer to the documentation contained in the repository&amp;nbsp;&lt;code&gt;README.md&lt;/code&gt;&amp;nbsp;files for more detailed guidance&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Connect the local repository copy to a new Github repository&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/test_suites/QuickStart&amp;lt;Integration/Acceptance&amp;gt;Test/content.txt&lt;/code&gt;&amp;nbsp;files
&lt;pre class="ui-code"&gt;|set appian url to |https://&amp;lt;integration/acceptance-site-url&amp;gt;/suite |
|set appian version to |&amp;lt;site-url-version&amp;gt; |
|set appian locale to |en_US |
|login with username |&amp;lt;username-for-site&amp;gt; |&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update devops/deploymentmanager.properties files for each environment to specify site URL and API Key.
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="text"&gt;### Environment-specific properties
## REQUIRED. URL of the environment
url=[Enter URL of the appian site e.g. https://yourCloudSite.appiancloud.com/suite]
siteApiKey=[Enter the API key for the deployment service account created in Appian]
packageFileName=app-package.zip
### Import-specific properties
## REQUIRED Name for the deployment
deploymentName=[ Enter a name for the deployment, to appear in the deployment tab within Appian]
## REQUIRED Description for the deployment
deploymentDescription=[ Enter a description for the deployment, to appear in the deployment tab within Appian]&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/users.properties&lt;/code&gt;
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;# List of username/password combination with access to Appian environment
# Example: fitnesse.user=password
&amp;lt;username-for-site&amp;gt;=&amp;lt;password&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;The following parameters need to be accessible to the&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;&amp;nbsp;as environmental variables:
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOUSERNAME&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Username for remote repository&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOPASSWORD&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Password for remote repository.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYAPIKEY&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;API Key to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYURL&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;URL to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Create a generic repository in Artifactory to store the .zip files for ADM and FitNesse for Appian based on the recommended&amp;nbsp;&lt;a href="#artifact-structure"&gt;file structure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a Jenkins Job
&lt;ol&gt;
&lt;li&gt;Create a &amp;lsquo;New Item&amp;rsquo;
&lt;ol&gt;
&lt;li&gt;Pick a descriptive name, such as &amp;ldquo;My-App-QuickStart&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Select &amp;ldquo;Pipeline&amp;rdquo; Job&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;This project is parameterized&amp;rdquo; and add the following parameters:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;String&lt;/strong&gt;:&amp;nbsp;APPLICATIONNAME
&lt;ol&gt;
&lt;li&gt;Name of application being deployed (Should correspond directly with folder name in repository)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;Poll SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Cron"&gt;Schedule&lt;/a&gt;:&amp;nbsp;&lt;/strong&gt;&amp;ldquo;0 2 * * *&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;In the Pipeline definition, &amp;ldquo;Pipeline script from SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SCM:&amp;nbsp;&lt;/strong&gt;Git&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository URL&lt;/strong&gt;: URL to remote repository&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Script Path:&lt;/strong&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="dev"&gt;Developer Environment Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="/w/guide/3328/deployment-automation#Installation1"&gt;Install ADM&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;li&gt;Override the default Automated Versioning Manager&amp;rsquo;s&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file with the copy from the repo located at&amp;nbsp;&lt;code&gt;devops/adm/version-manager.local.properties&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Adjust the&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file as necessary to match your local preferences
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;### Environment-specific properties
## REQUIRED. Username of the version control account
vcUsername=&amp;lt;remote-repo-username&amp;gt;
## REQUIRED. Password of the version control account
vcPassword=&amp;lt;remote-repo-password&amp;gt;
## REQUIRED. URL to access the remote repository
repoUrl=&amp;lt;remote-repo-url&amp;gt;
## REQUIRED. Path to the folder containing the local repository
localRepoPath=&amp;lt;local-repo-path&amp;gt;
## Path to the folder containing the Appian objects in the repository. This path is relative to the path of the local repository. If not specified, the Appian objects are checked out to and committed from the root of the local repository path.
## Assure that the path does not contain any preceding or trailing forward slashes. Example: appian/applications/Hello_World
appianObjectsRepoPath=appian/applications/&amp;lt;application-name&amp;gt;


### Action-specific properties
## REQUIRED. Valid choices are addContents, buildAllApps, buildSingleApp, or updateLocalRepo
action=addContents
## Path for the application ZIP file to add to version control. Used for the addContents action.
applicationPath=&amp;lt;path-to-local-application-ZIP&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Install&amp;nbsp;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="how_to_use"&gt;How to use&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Use git to update your&amp;nbsp;local repository with any&amp;nbsp;remote changes&lt;/li&gt;
&lt;li&gt;Use&amp;nbsp;&lt;a href="/w/guide/3328/deployment-automation#addContents"&gt;Version Manager&lt;/a&gt;&amp;nbsp;to add your Appian application/patch to the repo
&lt;ol&gt;
&lt;li&gt;Include any necessary Flyway migration files associated to the application changes&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Wait for the pipeline to be triggered or manually trigger it&lt;/li&gt;
&lt;li&gt;Use the&amp;nbsp;&lt;a href="https://plugins.jenkins.io/pipeline-stage-view"&gt;Jenkins pipeline dashboard&lt;/a&gt;&amp;nbsp;to monitor the automated tests and deployments&lt;/li&gt;
&lt;li&gt;In the &amp;ldquo;Promotion Decision&amp;rdquo; stage, either promote or abort the pipeline job&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="verify"&gt;Verify Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Verify the Jenkins job pipeline ran successfully and all stages are reported green&lt;/li&gt;
&lt;li&gt;Navigate to &amp;ldquo;Releases&amp;rdquo; in your GitHub repository and verify that a release has been made
&lt;ol&gt;
&lt;li&gt;The release should include the application zip as well as a custom import properties file, if specified in&amp;nbsp;&lt;code&gt;appian/properties&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="appendix"&gt;Appendix&lt;/h2&gt;
&lt;h3 id="structure"&gt;Code Repository File Structure&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/appian/devops-quickstart"&gt;Download Sample Code Repository File Structure&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;appian
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;applications
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;properties
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;devops
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0044.pastedimage1649095776037v1.png" /&gt;deploymentmanagement.prod.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/8267.pastedimage1649095826124v2.png" /&gt;deploymentmanagement.test.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/8081.pastedimage1649095827402v3.png" /&gt;deploymentmanagement.stag.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;adm
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.prod.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.stag.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.test.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;version-manager.local.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;version-manager.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;f4a
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;test_suites
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;QuickStartAcceptanceTest&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;QuickStartIntegrationTest&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;fitnesse-automation.acceptance.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;fitnesse-automation.integration.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;users.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="artifact-structure"&gt;&lt;/a&gt;Artifact Repository File Structure&lt;/h3&gt;
&lt;p&gt;Download &lt;a href="/b/appmarket/posts/deployment-automation-manager"&gt;ADM&lt;/a&gt; and &lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;. Rename the .zip files as adm.zip and f4a.zip respectively. Upload them to an Artifactory repo named appian-devops.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1588.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;appian-devops
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0753.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;adm.zip&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0753.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;f4a.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="security"&gt;Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It is recommended to configure the pipeline infrastructure to limit access to node machines executing the pipeline to ensure sensitive information required for execution is properly secured.&lt;/li&gt;
&lt;li&gt;The sample Jenkinsfile document relies on credentials stored in plaintext directly in the properties files or environment variables. This is intended for demonstration purposes only. It is recommended to store credentials in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime.&lt;/li&gt;
&lt;li&gt;For sensitive configuration properties, such as those used in the staging and production environments, it is recommended to store their values in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime. Consider updating the sample properties files to use a single tokenized file if all the values for each environment are stored in a separate system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Appian Cloud Considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All plugins needed by your Appian applications should be deployed to all the Appian environments before running the pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="environments"&gt;Environments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The pipeline is setup to automatically add git tags to keep track of the version of the applications that is deployed on each environment. This is simpler than using separate branches or a different system. It&amp;rsquo;s also fully automated and traceable via the git tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>Appian DevOps Quick Start</title><link>https://community.appian.com/success/w/article/3225/appian-devops-quick-start/revision/5</link><pubDate>Fri, 20 Oct 2023 15:16:38 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:503b7a31-6400-40ab-ad83-219e9e6a40e0</guid><dc:creator>matt.cosenza</dc:creator><comments>https://community.appian.com/success/w/article/3225/appian-devops-quick-start#comments</comments><description>Revision 5 posted to Article by matt.cosenza on 10/20/2023 3:16:38 PM&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;This document serves as a guide to configure a generic automated process for versioning and importing Appian applications using a defined DevOps pipeline. This guide has been assembled as a holistic process that covers automated versioning, application import/export, and testing. While the pipeline described can be used as-is for many different projects, it can also be adapted to fit other configurations and environments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#devops_overview"&gt;DevOps Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#what_is_devops"&gt;What is DevOps?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#what_is_devops_pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appian_devops_pipeline_overview"&gt;Appian DevOps Pipeline Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#why_devops_important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tools_devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how_devops_works"&gt;How does the Appian DevOps Pipeline work?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops_pipeline"&gt;Appian DevOps Pipeline&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#prereqs"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#setup"&gt;Pipeline Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dev"&gt;Developer Environment Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how_to_use"&gt;How to use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#verify"&gt;Verify Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appendix"&gt;Appendix&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#structure"&gt;Code Repository File Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#security"&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cloud"&gt;Appian Cloud Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#environments"&gt;Environments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="devops_overview"&gt;DevOps Overview&lt;/h2&gt;
&lt;h3 id="what_is_devops"&gt;What is DevOps?&lt;/h3&gt;
&lt;p&gt;Development and Operations (DevOps) is a set of practices and tools that help foster a culture of collaboration between development and operations to enable the rapid, frequent, and reliable delivery of software.&lt;/p&gt;
&lt;h3 id="what_is_devops_pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;Continuous Integration&lt;/a&gt;&amp;nbsp;(CI) and&amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Continuous_delivery"&gt;Continuous Delivery&lt;/a&gt;&amp;nbsp;(CD) describe a set of procedures many modern software companies follow in order to ensure their software is robust and compatible with current and previous versions. A&amp;nbsp;&lt;a href="https://devops.com/continuous-delivery-pipeline/"&gt;DevOps pipeline&lt;/a&gt;&amp;nbsp;breaks the CI and CD processes into discrete automated stages.&lt;/p&gt;
&lt;h2 id="appian_devops_pipeline_overview"&gt;Appian DevOps Pipeline Overview&lt;/h2&gt;
&lt;h3 id="why_devops_important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/h3&gt;
&lt;p&gt;Appian applications, though faster and simpler to build and maintain than traditional software applications, must also go through a basic life cycle that goes from conception to implementation and testing before they can be deployed to end users. Automating and modularizing this process makes Appian application development even faster and simpler.&lt;/p&gt;
&lt;h3 id="tools_devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/894x501/__key/communityserver-wikis-components-files/00-00-00-00-45/2260.tools.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Planning and Ticket Management:&amp;nbsp;&lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Development Platform:&amp;nbsp;&lt;a href="https://www.appian.com/"&gt;Appian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code Version Control System (VCS):&amp;nbsp;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Database Version Control System (VCS):&amp;nbsp;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pipeline Tool:&amp;nbsp;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Artifact Repository:&amp;nbsp;&lt;a href="https://jfrog.com/artifactory/"&gt;JFrog Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Secret Management:&amp;nbsp;&lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Packaging:&amp;nbsp;&lt;a href="/w/guide/3328/deployment-automation#Automated_Versioning_Manager"&gt;Appian Automated Versioning Manager (AVM)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Automated Testing:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.appian.com/suite/help/latest/Automated_Testing_for_Expression_Rules.html"&gt;Appian Expression Tests (AET)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Software Release Management:&amp;nbsp;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deployment Automation: &lt;a href="https://docs.appian.com/suite/help/latest/Deployment_Rest_API.html"&gt;Appian Deployment API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="how_devops_works"&gt;How does the Appian DevOps Pipeline work?&lt;/h3&gt;
&lt;p&gt;The recommended Appian DevOps Pipeline leverages&amp;nbsp;&lt;a href="https://trunkbaseddevelopment.com"&gt;trunk-based development&lt;/a&gt;. The Appian Dev environment can be interpreted as a &amp;ldquo;branch&amp;rdquo;. Adding the Appian Applications to the &amp;ldquo;master&amp;rdquo; branch in version control is the equivalent of &amp;ldquo;merging&amp;rdquo;. After the &amp;ldquo;merge&amp;rdquo;, the Appian Dev environment can be interpreted as a &amp;ldquo;new branch&amp;rdquo;. The goal is to &amp;ldquo;merge&amp;rdquo; frequently to the &amp;ldquo;master&amp;rdquo; branch to keep the spirit of &amp;ldquo;short-lived branches&amp;rdquo;.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/986x453/__key/communityserver-wikis-components-files/00-00-00-00-45/6237.process.png" /&gt;&lt;/div&gt;
&lt;h2 id="devops_pipeline"&gt;Appian DevOps Pipeline&lt;/h2&gt;
&lt;h3 id="prereqs"&gt;Prerequisites&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jfrog.com/artifactory/"&gt;Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt;&amp;nbsp;need to be accessible in the Jenkins workspace&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3328/deployment-automation"&gt;Appian Automated Deployment Manager (ADM)&lt;/a&gt;&amp;nbsp;(Only Appian Version Manager is leveraged in this Pipeline)&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="setup"&gt;Pipeline Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/appian/devops-quickstart/archive/master.zip"&gt;Download&lt;/a&gt;&amp;nbsp;or re-create the recommended&amp;nbsp;&lt;a href="#structure"&gt;file structure&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;Please refer to the documentation contained in the repository&amp;nbsp;&lt;code&gt;README.md&lt;/code&gt;&amp;nbsp;files for more detailed guidance&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Connect the local repository copy to a new Github repository&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/test_suites/QuickStart&amp;lt;Integration/Acceptance&amp;gt;Test/content.txt&lt;/code&gt;&amp;nbsp;files
&lt;pre class="ui-code"&gt;|set appian url to |https://&amp;lt;integration/acceptance-site-url&amp;gt;/suite |
|set appian version to |&amp;lt;site-url-version&amp;gt; |
|set appian locale to |en_US |
|login with username |&amp;lt;username-for-site&amp;gt; |&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update devops/deploymentmanager.properties files for each environment to specify site URL and API Key.
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="text"&gt;### Environment-specific properties
## REQUIRED. URL of the environment
url=[Enter URL of the appian site e.g. https://yourCloudSite.appiancloud.com/suite]
siteApiKey=[Enter the API key for the deployment service account created in Appian]
packageFileName=app-package.zip
### Import-specific properties
## REQUIRED Name for the deployment
deploymentName=[ Enter a name for the deployment, to appear in the deployment tab within Appian]
## REQUIRED Description for the deployment
deploymentDescription=[ Enter a description for the deployment, to appear in the deployment tab within Appian]&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/users.properties&lt;/code&gt;
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;# List of username/password combination with access to Appian environment
# Example: fitnesse.user=password
&amp;lt;username-for-site&amp;gt;=&amp;lt;password&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;The following parameters need to be accessible to the&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;&amp;nbsp;as environmental variables:
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOUSERNAME&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Username for remote repository&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOPASSWORD&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Password for remote repository.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYAPIKEY&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;API Key to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYURL&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;URL to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Create a generic repository in Artifactory to store the .zip files for ADM and FitNesse for Appian based on the recommended&amp;nbsp;&lt;a href="#artifact-structure"&gt;file structure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a Jenkins Job
&lt;ol&gt;
&lt;li&gt;Create a &amp;lsquo;New Item&amp;rsquo;
&lt;ol&gt;
&lt;li&gt;Pick a descriptive name, such as &amp;ldquo;My-App-QuickStart&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Select &amp;ldquo;Pipeline&amp;rdquo; Job&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;This project is parameterized&amp;rdquo; and add the following parameters:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;String&lt;/strong&gt;:&amp;nbsp;APPLICATIONNAME
&lt;ol&gt;
&lt;li&gt;Name of application being deployed (Should correspond directly with folder name in repository)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;Poll SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Cron"&gt;Schedule&lt;/a&gt;:&amp;nbsp;&lt;/strong&gt;&amp;ldquo;0 2 * * *&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;In the Pipeline definition, &amp;ldquo;Pipeline script from SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SCM:&amp;nbsp;&lt;/strong&gt;Git&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository URL&lt;/strong&gt;: URL to remote repository&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Script Path:&lt;/strong&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="dev"&gt;Developer Environment Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="/w/guide/3328/deployment-automation#Installation1"&gt;Install ADM&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;li&gt;Override the default Automated Versioning Manager&amp;rsquo;s&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file with the copy from the repo located at&amp;nbsp;&lt;code&gt;devops/adm/version-manager.local.properties&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Adjust the&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file as necessary to match your local preferences
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;### Environment-specific properties
## REQUIRED. Username of the version control account
vcUsername=&amp;lt;remote-repo-username&amp;gt;
## REQUIRED. Password of the version control account
vcPassword=&amp;lt;remote-repo-password&amp;gt;
## REQUIRED. URL to access the remote repository
repoUrl=&amp;lt;remote-repo-url&amp;gt;
## REQUIRED. Path to the folder containing the local repository
localRepoPath=&amp;lt;local-repo-path&amp;gt;
## Path to the folder containing the Appian objects in the repository. This path is relative to the path of the local repository. If not specified, the Appian objects are checked out to and committed from the root of the local repository path.
## Assure that the path does not contain any preceding or trailing forward slashes. Example: appian/applications/Hello_World
appianObjectsRepoPath=appian/applications/&amp;lt;application-name&amp;gt;


### Action-specific properties
## REQUIRED. Valid choices are addContents, buildAllApps, buildSingleApp, or updateLocalRepo
action=addContents
## Path for the application ZIP file to add to version control. Used for the addContents action.
applicationPath=&amp;lt;path-to-local-application-ZIP&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Install&amp;nbsp;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="how_to_use"&gt;How to use&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Use git to update your&amp;nbsp;local repository with any&amp;nbsp;remote changes&lt;/li&gt;
&lt;li&gt;Use&amp;nbsp;&lt;a href="/w/guide/3328/deployment-automation#addContents"&gt;Version Manager&lt;/a&gt;&amp;nbsp;to add your Appian application/patch to the repo
&lt;ol&gt;
&lt;li&gt;Include any necessary Flyway migration files associated to the application changes&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Wait for the pipeline to be triggered or manually trigger it&lt;/li&gt;
&lt;li&gt;Use the&amp;nbsp;&lt;a href="https://plugins.jenkins.io/pipeline-stage-view"&gt;Jenkins pipeline dashboard&lt;/a&gt;&amp;nbsp;to monitor the automated tests and deployments&lt;/li&gt;
&lt;li&gt;In the &amp;ldquo;Promotion Decision&amp;rdquo; stage, either promote or abort the pipeline job&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="verify"&gt;Verify Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Verify the Jenkins job pipeline ran successfully and all stages are reported green&lt;/li&gt;
&lt;li&gt;Navigate to &amp;ldquo;Releases&amp;rdquo; in your GitHub repository and verify that a release has been made
&lt;ol&gt;
&lt;li&gt;The release should include the application zip as well as a custom import properties file, if specified in&amp;nbsp;&lt;code&gt;appian/properties&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="appendix"&gt;Appendix&lt;/h2&gt;
&lt;h3 id="structure"&gt;Code Repository File Structure&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/appian/devops-quickstart"&gt;Download Sample Code Repository File Structure&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;appian
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;applications
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;properties
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;devops
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0044.pastedimage1649095776037v1.png" /&gt;deploymentmanagement.prod.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/8267.pastedimage1649095826124v2.png" /&gt;deploymentmanagement.test.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/8081.pastedimage1649095827402v3.png" /&gt;deploymentmanagement.stag.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;adm
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.prod.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.stag.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.test.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;version-manager.local.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;version-manager.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;f4a
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;test_suites
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;QuickStartAcceptanceTest&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0882.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;QuickStartIntegrationTest&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;fitnesse-automation.acceptance.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;fitnesse-automation.integration.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;users.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/2783.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="security"&gt;Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It is recommended to configure the pipeline infrastructure to limit access to node machines executing the pipeline to ensure sensitive information required for execution is properly secured.&lt;/li&gt;
&lt;li&gt;The sample Jenkinsfile document relies on credentials stored in plaintext directly in the properties files or environment variables. This is intended for demonstration purposes only. It is recommended to store credentials in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime.&lt;/li&gt;
&lt;li&gt;For sensitive configuration properties, such as those used in the staging and production environments, it is recommended to store their values in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime. Consider updating the sample properties files to use a single tokenized file if all the values for each environment are stored in a separate system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Appian Cloud Considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All plugins needed by your Appian applications should be deployed to all the Appian environments before running the pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="environments"&gt;Environments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The pipeline is setup to automatically add git tags to keep track of the version of the applications that is deployed on each environment. This is simpler than using separate branches or a different system. It&amp;rsquo;s also fully automated and traceable via the git tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>Appian DevOps Quick Start</title><link>https://community.appian.com/success/w/article/3225/appian-devops-quick-start/revision/4</link><pubDate>Fri, 20 Oct 2023 15:14:25 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:503b7a31-6400-40ab-ad83-219e9e6a40e0</guid><dc:creator>matt.cosenza</dc:creator><comments>https://community.appian.com/success/w/article/3225/appian-devops-quick-start#comments</comments><description>Revision 4 posted to Article by matt.cosenza on 10/20/2023 3:14:25 PM&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;This document serves as a guide to configure a generic automated process for versioning and importing Appian applications using a defined DevOps pipeline. This guide has been assembled as a holistic process that covers automated versioning, application import/export, and testing. While the pipeline described can be used as-is for many different projects, it can also be adapted to fit other configurations and environments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#devops_overview"&gt;DevOps Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#what_is_devops"&gt;What is DevOps?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#what_is_devops_pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appian_devops_pipeline_overview"&gt;Appian DevOps Pipeline Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#why_devops_important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tools_devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how_devops_works"&gt;How does the Appian DevOps Pipeline work?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops_pipeline"&gt;Appian DevOps Pipeline&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#prereqs"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#setup"&gt;Pipeline Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dev"&gt;Developer Environment Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how_to_use"&gt;How to use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#verify"&gt;Verify Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appendix"&gt;Appendix&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#structure"&gt;Code Repository File Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#security"&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cloud"&gt;Appian Cloud Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#environments"&gt;Environments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="devops_overview"&gt;DevOps Overview&lt;/h2&gt;
&lt;h3 id="what_is_devops"&gt;What is DevOps?&lt;/h3&gt;
&lt;p&gt;Development and Operations (DevOps) is a set of practices and tools that help foster a culture of collaboration between development and operations to enable the rapid, frequent, and reliable delivery of software.&lt;/p&gt;
&lt;h3 id="what_is_devops_pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;Continuous Integration&lt;/a&gt;&amp;nbsp;(CI) and&amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Continuous_delivery"&gt;Continuous Delivery&lt;/a&gt;&amp;nbsp;(CD) describe a set of procedures many modern software companies follow in order to ensure their software is robust and compatible with current and previous versions. A&amp;nbsp;&lt;a href="https://devops.com/continuous-delivery-pipeline/"&gt;DevOps pipeline&lt;/a&gt;&amp;nbsp;breaks the CI and CD processes into discrete automated stages.&lt;/p&gt;
&lt;h2 id="appian_devops_pipeline_overview"&gt;Appian DevOps Pipeline Overview&lt;/h2&gt;
&lt;h3 id="why_devops_important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/h3&gt;
&lt;p&gt;Appian applications, though faster and simpler to build and maintain than traditional software applications, must also go through a basic life cycle that goes from conception to implementation and testing before they can be deployed to end users. Automating and modularizing this process makes Appian application development even faster and simpler.&lt;/p&gt;
&lt;h3 id="tools_devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/894x501/__key/communityserver-wikis-components-files/00-00-00-00-45/2260.tools.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Planning and Ticket Management:&amp;nbsp;&lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Development Platform:&amp;nbsp;&lt;a href="https://www.appian.com/"&gt;Appian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code Version Control System (VCS):&amp;nbsp;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Database Version Control System (VCS):&amp;nbsp;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pipeline Tool:&amp;nbsp;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Artifact Repository:&amp;nbsp;&lt;a href="https://jfrog.com/artifactory/"&gt;JFrog Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Secret Management:&amp;nbsp;&lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Packaging:&amp;nbsp;&lt;a href="/w/guide/3328/deployment-automation#Automated_Versioning_Manager"&gt;Appian Automated Versioning Manager (AVM)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Automated Testing:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.appian.com/suite/help/latest/Automated_Testing_for_Expression_Rules.html"&gt;Appian Expression Tests (AET)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Software Release Management:&amp;nbsp;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deployment Automation: &lt;a href="https://docs.appian.com/suite/help/latest/Deployment_Rest_API.html"&gt;Appian Deployment API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="how_devops_works"&gt;How does the Appian DevOps Pipeline work?&lt;/h3&gt;
&lt;p&gt;The recommended Appian DevOps Pipeline leverages&amp;nbsp;&lt;a href="https://trunkbaseddevelopment.com"&gt;trunk-based development&lt;/a&gt;. The Appian Dev environment can be interpreted as a &amp;ldquo;branch&amp;rdquo;. Adding the Appian Applications to the &amp;ldquo;master&amp;rdquo; branch in version control is the equivalent of &amp;ldquo;merging&amp;rdquo;. After the &amp;ldquo;merge&amp;rdquo;, the Appian Dev environment can be interpreted as a &amp;ldquo;new branch&amp;rdquo;. The goal is to &amp;ldquo;merge&amp;rdquo; frequently to the &amp;ldquo;master&amp;rdquo; branch to keep the spirit of &amp;ldquo;short-lived branches&amp;rdquo;.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/986x453/__key/communityserver-wikis-components-files/00-00-00-00-45/6237.process.png" /&gt;&lt;/div&gt;
&lt;h2 id="devops_pipeline"&gt;Appian DevOps Pipeline&lt;/h2&gt;
&lt;h3 id="prereqs"&gt;Prerequisites&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jfrog.com/artifactory/"&gt;Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt;&amp;nbsp;need to be accessible in the Jenkins workspace&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3328/deployment-automation"&gt;Appian Automated Deployment Manager (ADM)&lt;/a&gt;&amp;nbsp;(Only Appian Version Manager is leveraged in this Pipeline)&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="setup"&gt;Pipeline Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/appian/devops-quickstart/archive/master.zip"&gt;Download&lt;/a&gt;&amp;nbsp;or re-create the recommended&amp;nbsp;&lt;a href="#structure"&gt;file structure&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;Please refer to the documentation contained in the repository&amp;nbsp;&lt;code&gt;README.md&lt;/code&gt;&amp;nbsp;files for more detailed guidance&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Connect the local repository copy to a new Github repository&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/test_suites/QuickStart&amp;lt;Integration/Acceptance&amp;gt;Test/content.txt&lt;/code&gt;&amp;nbsp;files
&lt;pre class="ui-code"&gt;|set appian url to |https://&amp;lt;integration/acceptance-site-url&amp;gt;/suite |
|set appian version to |&amp;lt;site-url-version&amp;gt; |
|set appian locale to |en_US |
|login with username |&amp;lt;username-for-site&amp;gt; |&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update devops/deploymentmanager.properties files for each environment to specify site URL and API Key.
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="text"&gt;### Environment-specific properties
## REQUIRED. URL of the environment
url=[Enter URL of the appian site e.g. https://yourCloudSite.appiancloud.com/suite]
siteApiKey=[Enter the API key for the deployment service account created in Appian]
packageFileName=app-package.zip
### Import-specific properties
## REQUIRED Name for the deployment
deploymentName=[ Enter a name for the deployment, to appear in the deployment tab within Appian]
## REQUIRED Description for the deployment
deploymentDescription=[ Enter a description for the deployment, to appear in the deployment tab within Appian]&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/users.properties&lt;/code&gt;
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;# List of username/password combination with access to Appian environment
# Example: fitnesse.user=password
&amp;lt;username-for-site&amp;gt;=&amp;lt;password&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;The following parameters need to be accessible to the&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;&amp;nbsp;as environmental variables:
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOUSERNAME&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Username for remote repository&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOPASSWORD&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Password for remote repository.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYAPIKEY&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;API Key to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYURL&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;URL to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Create a generic repository in Artifactory to store the .zip files for ADM and FitNesse for Appian based on the recommended&amp;nbsp;&lt;a href="#artifact-structure"&gt;file structure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a Jenkins Job
&lt;ol&gt;
&lt;li&gt;Create a &amp;lsquo;New Item&amp;rsquo;
&lt;ol&gt;
&lt;li&gt;Pick a descriptive name, such as &amp;ldquo;My-App-QuickStart&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Select &amp;ldquo;Pipeline&amp;rdquo; Job&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;This project is parameterized&amp;rdquo; and add the following parameters:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;String&lt;/strong&gt;:&amp;nbsp;APPLICATIONNAME
&lt;ol&gt;
&lt;li&gt;Name of application being deployed (Should correspond directly with folder name in repository)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;Poll SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Cron"&gt;Schedule&lt;/a&gt;:&amp;nbsp;&lt;/strong&gt;&amp;ldquo;0 2 * * *&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;In the Pipeline definition, &amp;ldquo;Pipeline script from SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SCM:&amp;nbsp;&lt;/strong&gt;Git&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository URL&lt;/strong&gt;: URL to remote repository&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Script Path:&lt;/strong&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="dev"&gt;Developer Environment Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="/w/guide/3328/deployment-automation#Installation1"&gt;Install ADM&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;li&gt;Override the default Automated Versioning Manager&amp;rsquo;s&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file with the copy from the repo located at&amp;nbsp;&lt;code&gt;devops/adm/version-manager.local.properties&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Adjust the&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file as necessary to match your local preferences
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;### Environment-specific properties
## REQUIRED. Username of the version control account
vcUsername=&amp;lt;remote-repo-username&amp;gt;
## REQUIRED. Password of the version control account
vcPassword=&amp;lt;remote-repo-password&amp;gt;
## REQUIRED. URL to access the remote repository
repoUrl=&amp;lt;remote-repo-url&amp;gt;
## REQUIRED. Path to the folder containing the local repository
localRepoPath=&amp;lt;local-repo-path&amp;gt;
## Path to the folder containing the Appian objects in the repository. This path is relative to the path of the local repository. If not specified, the Appian objects are checked out to and committed from the root of the local repository path.
## Assure that the path does not contain any preceding or trailing forward slashes. Example: appian/applications/Hello_World
appianObjectsRepoPath=appian/applications/&amp;lt;application-name&amp;gt;


### Action-specific properties
## REQUIRED. Valid choices are addContents, buildAllApps, buildSingleApp, or updateLocalRepo
action=addContents
## Path for the application ZIP file to add to version control. Used for the addContents action.
applicationPath=&amp;lt;path-to-local-application-ZIP&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Install&amp;nbsp;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="how_to_use"&gt;How to use&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Use git to update your&amp;nbsp;local repository with any&amp;nbsp;remote changes&lt;/li&gt;
&lt;li&gt;Use&amp;nbsp;&lt;a href="/w/guide/3328/deployment-automation#addContents"&gt;Version Manager&lt;/a&gt;&amp;nbsp;to add your Appian application/patch to the repo
&lt;ol&gt;
&lt;li&gt;Include any necessary Flyway migration files associated to the application changes&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Wait for the pipeline to be triggered or manually trigger it&lt;/li&gt;
&lt;li&gt;Use the&amp;nbsp;&lt;a href="https://plugins.jenkins.io/pipeline-stage-view"&gt;Jenkins pipeline dashboard&lt;/a&gt;&amp;nbsp;to monitor the automated tests and deployments&lt;/li&gt;
&lt;li&gt;In the &amp;ldquo;Promotion Decision&amp;rdquo; stage, either promote or abort the pipeline job&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="verify"&gt;Verify Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Verify the Jenkins job pipeline ran successfully and all stages are reported green&lt;/li&gt;
&lt;li&gt;Navigate to &amp;ldquo;Releases&amp;rdquo; in your GitHub repository and verify that a release has been made
&lt;ol&gt;
&lt;li&gt;The release should include the application zip as well as a custom import properties file, if specified in&amp;nbsp;&lt;code&gt;appian/properties&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="appendix"&gt;Appendix&lt;/h2&gt;
&lt;h3 id="structure"&gt;Code Repository File Structure&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/appian/devops-quickstart"&gt;Download Sample Code Repository File Structure&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;appian
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;applications
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;properties
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;devops
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1050.pastedimage1649095776037v1.png" /&gt;&lt;/div&gt;
deploymentmanagement.prod.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1300.pastedimage1649095826124v2.png" /&gt;&lt;/div&gt;
deploymentmanagement.test.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/4745.pastedimage1649095827402v3.png" /&gt;&lt;/div&gt;
deploymentmanagement.stag.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;adm
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;import-manager.prod.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;import-manager.stag.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;import-manager.test.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;version-manager.local.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;version-manager.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;f4a
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;test_suites
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;QuickStartAcceptanceTest&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;QuickStartIntegrationTest&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;fitnesse-automation.acceptance.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;fitnesse-automation.integration.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;users.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Artifact Repository File Structure&lt;/h3&gt;
&lt;p&gt;Download &lt;a href="/b/appmarket/posts/deployment-automation-manager"&gt;ADM&lt;/a&gt; and &lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;. Rename the .zip files as adm.zip and f4a.zip respectively. Upload them to an Artifactory repo named appian-devops.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;appian-devops
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;adm.zip&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;f4a.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="security"&gt;Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It is recommended to configure the pipeline infrastructure to limit access to node machines executing the pipeline to ensure sensitive information required for execution is properly secured.&lt;/li&gt;
&lt;li&gt;The sample Jenkinsfile document relies on credentials stored in plaintext directly in the properties files or environment variables. This is intended for demonstration purposes only. It is recommended to store credentials in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime.&lt;/li&gt;
&lt;li&gt;For sensitive configuration properties, such as those used in the staging and production environments, it is recommended to store their values in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime. Consider updating the sample properties files to use a single tokenized file if all the values for each environment are stored in a separate system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Appian Cloud Considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All plugins needed by your Appian applications should be deployed to all the Appian environments before running the pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="environments"&gt;Environments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The pipeline is setup to automatically add git tags to keep track of the version of the applications that is deployed on each environment. This is simpler than using separate branches or a different system. It&amp;rsquo;s also fully automated and traceable via the git tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>Appian DevOps Quick Start</title><link>https://community.appian.com/success/w/article/3225/appian-devops-quick-start/revision/3</link><pubDate>Fri, 20 Oct 2023 15:12:44 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:503b7a31-6400-40ab-ad83-219e9e6a40e0</guid><dc:creator>matt.cosenza</dc:creator><comments>https://community.appian.com/success/w/article/3225/appian-devops-quick-start#comments</comments><description>Revision 3 posted to Article by matt.cosenza on 10/20/2023 3:12:44 PM&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;This document serves as a guide to configure a generic automated process for versioning and importing Appian applications using a defined DevOps pipeline. This guide has been assembled as a holistic process that covers automated versioning, application import/export, and testing. While the pipeline described can be used as-is for many different projects, it can also be adapted to fit other configurations and environments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#devops_overview"&gt;DevOps Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#what_is_devops"&gt;What is DevOps?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#what_is_devops_pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appian_devops_pipeline_overview"&gt;Appian DevOps Pipeline Overview&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#why_devops_important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tools_devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how_devops_works"&gt;How does the Appian DevOps Pipeline work?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops_pipeline"&gt;Appian DevOps Pipeline&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#prereqs"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#setup"&gt;Pipeline Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dev"&gt;Developer Environment Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how_to_use"&gt;How to use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#verify"&gt;Verify Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appendix"&gt;Appendix&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#structure"&gt;Code Repository File Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#security"&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cloud"&gt;Appian Cloud Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#environments"&gt;Environments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="devops_overview"&gt;DevOps Overview&lt;/h2&gt;
&lt;h3 id="what_is_devops"&gt;What is DevOps?&lt;/h3&gt;
&lt;p&gt;Development and Operations (DevOps) is a set of practices and tools that help foster a culture of collaboration between development and operations to enable the rapid, frequent, and reliable delivery of software.&lt;/p&gt;
&lt;h3 id="what_is_devops_pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;Continuous Integration&lt;/a&gt;&amp;nbsp;(CI) and&amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Continuous_delivery"&gt;Continuous Delivery&lt;/a&gt;&amp;nbsp;(CD) describe a set of procedures many modern software companies follow in order to ensure their software is robust and compatible with current and previous versions. A&amp;nbsp;&lt;a href="https://devops.com/continuous-delivery-pipeline/"&gt;DevOps pipeline&lt;/a&gt;&amp;nbsp;breaks the CI and CD processes into discrete automated stages.&lt;/p&gt;
&lt;h2 id="appian_devops_pipeline_overview"&gt;Appian DevOps Pipeline Overview&lt;/h2&gt;
&lt;h3 id="why_devops_important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/h3&gt;
&lt;p&gt;Appian applications, though faster and simpler to build and maintain than traditional software applications, must also go through a basic life cycle that goes from conception to implementation and testing before they can be deployed to end users. Automating and modularizing this process makes Appian application development even faster and simpler.&lt;/p&gt;
&lt;h3 id="tools_devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/894x501/__key/communityserver-wikis-components-files/00-00-00-00-45/2260.tools.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Planning and Ticket Management:&amp;nbsp;&lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Development Platform:&amp;nbsp;&lt;a href="https://www.appian.com/"&gt;Appian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code Version Control System (VCS):&amp;nbsp;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Database Version Control System (VCS):&amp;nbsp;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pipeline Tool:&amp;nbsp;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Artifact Repository:&amp;nbsp;&lt;a href="https://jfrog.com/artifactory/"&gt;JFrog Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Secret Management:&amp;nbsp;&lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Packaging:&amp;nbsp;&lt;a href="/w/guide/3328/deployment-automation#Automated_Versioning_Manager"&gt;Appian Automated Versioning Manager (AVM)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Automated Testing:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.appian.com/suite/help/latest/Automated_Testing_for_Expression_Rules.html"&gt;Appian Expression Tests (AET)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Software Release Management:&amp;nbsp;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deployment Automation: &lt;a href="https://docs.appian.com/suite/help/latest/Deployment_Rest_API.html"&gt;Appian Deployment API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="how_devops_works"&gt;How does the Appian DevOps Pipeline work?&lt;/h3&gt;
&lt;p&gt;The recommended Appian DevOps Pipeline leverages&amp;nbsp;&lt;a href="https://trunkbaseddevelopment.com"&gt;trunk-based development&lt;/a&gt;. The Appian Dev environment can be interpreted as a &amp;ldquo;branch&amp;rdquo;. Adding the Appian Applications to the &amp;ldquo;master&amp;rdquo; branch in version control is the equivalent of &amp;ldquo;merging&amp;rdquo;. After the &amp;ldquo;merge&amp;rdquo;, the Appian Dev environment can be interpreted as a &amp;ldquo;new branch&amp;rdquo;. The goal is to &amp;ldquo;merge&amp;rdquo; frequently to the &amp;ldquo;master&amp;rdquo; branch to keep the spirit of &amp;ldquo;short-lived branches&amp;rdquo;.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/986x453/__key/communityserver-wikis-components-files/00-00-00-00-45/6237.process.png" /&gt;&lt;/div&gt;
&lt;h2 id="devops_pipeline"&gt;Appian DevOps Pipeline&lt;/h2&gt;
&lt;h3 id="prereqs"&gt;Prerequisites&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jfrog.com/artifactory/"&gt;Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt;&amp;nbsp;need to be accessible in the Jenkins workspace&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3328/deployment-automation"&gt;Appian Automated Deployment Manager (ADM)&lt;/a&gt;&amp;nbsp;(Only Appian Version Manager is leveraged in this Pipeline)&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="setup"&gt;Pipeline Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/appian/devops-quickstart/archive/master.zip"&gt;Download&lt;/a&gt;&amp;nbsp;or re-create the recommended&amp;nbsp;&lt;a href="#structure"&gt;file structure&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;Please refer to the documentation contained in the repository&amp;nbsp;&lt;code&gt;README.md&lt;/code&gt;&amp;nbsp;files for more detailed guidance&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Connect the local repository copy to a new Github repository&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/test_suites/QuickStart&amp;lt;Integration/Acceptance&amp;gt;Test/content.txt&lt;/code&gt;&amp;nbsp;files
&lt;pre class="ui-code"&gt;|set appian url to |https://&amp;lt;integration/acceptance-site-url&amp;gt;/suite |
|set appian version to |&amp;lt;site-url-version&amp;gt; |
|set appian locale to |en_US |
|login with username |&amp;lt;username-for-site&amp;gt; |&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update devops/deploymentmanager.properties files for each environment to specify site URL and API Key.
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="text"&gt;### Environment-specific properties
## REQUIRED. URL of the environment
url=[Enter URL of the appian site e.g. https://yourCloudSite.appiancloud.com/suite]
siteApiKey=[Enter the API key for the deployment service account created in Appian]
packageFileName=app-package.zip
### Import-specific properties
## REQUIRED Name for the deployment
deploymentName=[ Enter a name for the deployment, to appear in the deployment tab within Appian]
## REQUIRED Description for the deployment
deploymentDescription=[ Enter a description for the deployment, to appear in the deployment tab within Appian]&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/users.properties&lt;/code&gt;
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;# List of username/password combination with access to Appian environment
# Example: fitnesse.user=password
&amp;lt;username-for-site&amp;gt;=&amp;lt;password&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;The following parameters need to be accessible to the&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;&amp;nbsp;as environmental variables:
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOUSERNAME&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Username for remote repository&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOPASSWORD&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Password for remote repository.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYAPIKEY&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;API Key to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYURL&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;URL to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Create a generic repository in Artifactory to store the .zip files for ADM and FitNesse for Appian based on the recommended&amp;nbsp;&lt;a href="#artifact-structure"&gt;file structure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a Jenkins Job
&lt;ol&gt;
&lt;li&gt;Create a &amp;lsquo;New Item&amp;rsquo;
&lt;ol&gt;
&lt;li&gt;Pick a descriptive name, such as &amp;ldquo;My-App-QuickStart&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Select &amp;ldquo;Pipeline&amp;rdquo; Job&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;This project is parameterized&amp;rdquo; and add the following parameters:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;String&lt;/strong&gt;:&amp;nbsp;APPLICATIONNAME
&lt;ol&gt;
&lt;li&gt;Name of application being deployed (Should correspond directly with folder name in repository)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;Poll SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Cron"&gt;Schedule&lt;/a&gt;:&amp;nbsp;&lt;/strong&gt;&amp;ldquo;0 2 * * *&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;In the Pipeline definition, &amp;ldquo;Pipeline script from SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SCM:&amp;nbsp;&lt;/strong&gt;Git&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository URL&lt;/strong&gt;: URL to remote repository&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Script Path:&lt;/strong&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="dev"&gt;Developer Environment Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="/w/guide/3328/deployment-automation#Installation1"&gt;Install ADM&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;li&gt;Override the default Automated Versioning Manager&amp;rsquo;s&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file with the copy from the repo located at&amp;nbsp;&lt;code&gt;devops/adm/version-manager.local.properties&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Adjust the&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file as necessary to match your local preferences
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;### Environment-specific properties
## REQUIRED. Username of the version control account
vcUsername=&amp;lt;remote-repo-username&amp;gt;
## REQUIRED. Password of the version control account
vcPassword=&amp;lt;remote-repo-password&amp;gt;
## REQUIRED. URL to access the remote repository
repoUrl=&amp;lt;remote-repo-url&amp;gt;
## REQUIRED. Path to the folder containing the local repository
localRepoPath=&amp;lt;local-repo-path&amp;gt;
## Path to the folder containing the Appian objects in the repository. This path is relative to the path of the local repository. If not specified, the Appian objects are checked out to and committed from the root of the local repository path.
## Assure that the path does not contain any preceding or trailing forward slashes. Example: appian/applications/Hello_World
appianObjectsRepoPath=appian/applications/&amp;lt;application-name&amp;gt;


### Action-specific properties
## REQUIRED. Valid choices are addContents, buildAllApps, buildSingleApp, or updateLocalRepo
action=addContents
## Path for the application ZIP file to add to version control. Used for the addContents action.
applicationPath=&amp;lt;path-to-local-application-ZIP&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Install&amp;nbsp;&lt;a href="/w/guide/3313/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="how_to_use"&gt;How to use&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Use git to update your&amp;nbsp;local repository with any&amp;nbsp;remote changes&lt;/li&gt;
&lt;li&gt;Use&amp;nbsp;&lt;a href="/w/guide/3328/deployment-automation#addContents"&gt;Version Manager&lt;/a&gt;&amp;nbsp;to add your Appian application/patch to the repo
&lt;ol&gt;
&lt;li&gt;Include any necessary Flyway migration files associated to the application changes&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Wait for the pipeline to be triggered or manually trigger it&lt;/li&gt;
&lt;li&gt;Use the&amp;nbsp;&lt;a href="https://plugins.jenkins.io/pipeline-stage-view"&gt;Jenkins pipeline dashboard&lt;/a&gt;&amp;nbsp;to monitor the automated tests and deployments&lt;/li&gt;
&lt;li&gt;In the &amp;ldquo;Promotion Decision&amp;rdquo; stage, either promote or abort the pipeline job&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="verify"&gt;Verify Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Verify the Jenkins job pipeline ran successfully and all stages are reported green&lt;/li&gt;
&lt;li&gt;Navigate to &amp;ldquo;Releases&amp;rdquo; in your GitHub repository and verify that a release has been made
&lt;ol&gt;
&lt;li&gt;The release should include the application zip as well as a custom import properties file, if specified in&amp;nbsp;&lt;code&gt;appian/properties&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="appendix"&gt;Appendix&lt;/h2&gt;
&lt;h3 id="structure"&gt;Code Repository File Structure&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/appian/devops-quickstart"&gt;Download Sample Code Repository File Structure&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;appian
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;applications
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;properties
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;devops
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1050.pastedimage1649095776037v1.png" /&gt;&lt;/div&gt;
deploymentmanagement.prod.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1300.pastedimage1649095826124v2.png" /&gt;&lt;/div&gt;
deploymentmanagement.test.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/4745.pastedimage1649095827402v3.png" /&gt;&lt;/div&gt;
deploymentmanagement.stag.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;adm
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;import-manager.prod.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;import-manager.stag.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;import-manager.test.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;version-manager.local.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;version-manager.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;f4a
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;test_suites
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;QuickStartAcceptanceTest&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;QuickStartIntegrationTest&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;fitnesse-automation.acceptance.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;fitnesse-automation.integration.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;users.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="structure"&gt;Artifact Repository File Structure&lt;/h3&gt;
&lt;p&gt;Download &lt;a href="/b/appmarket/posts/deployment-automation-manager"&gt;ADM&lt;/a&gt; and &lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;. Rename the .zip files as adm.zip and f4a.zip respectively. Upload them to an Artifactory repo named appian-devops.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3034.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;appian-devops
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;adm.zip&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/3377.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;f4a.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="security"&gt;Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It is recommended to configure the pipeline infrastructure to limit access to node machines executing the pipeline to ensure sensitive information required for execution is properly secured.&lt;/li&gt;
&lt;li&gt;The sample Jenkinsfile document relies on credentials stored in plaintext directly in the properties files or environment variables. This is intended for demonstration purposes only. It is recommended to store credentials in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime.&lt;/li&gt;
&lt;li&gt;For sensitive configuration properties, such as those used in the staging and production environments, it is recommended to store their values in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime. Consider updating the sample properties files to use a single tokenized file if all the values for each environment are stored in a separate system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Appian Cloud Considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All plugins needed by your Appian applications should be deployed to all the Appian environments before running the pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="environments"&gt;Environments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The pipeline is setup to automatically add git tags to keep track of the version of the applications that is deployed on each environment. This is simpler than using separate branches or a different system. It&amp;rsquo;s also fully automated and traceable via the git tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;
</description></item><item><title>Appian DevOps Quick Start</title><link>https://community.appian.com/success/w/article/3225/appian-devops-quick-start/revision/2</link><pubDate>Wed, 02 Aug 2023 19:22:34 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:503b7a31-6400-40ab-ad83-219e9e6a40e0</guid><dc:creator>joel.larin</dc:creator><comments>https://community.appian.com/success/w/article/3225/appian-devops-quick-start#comments</comments><description>Revision 2 posted to Article by joel.larin on 8/2/2023 7:22:34 PM&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;This document serves as a guide to configure a generic automated process for versioning and importing Appian applications using a defined DevOps pipeline. This guide has been assembled as a holistic process that covers automated versioning, application import/export, and testing. While the pipeline described can be used as-is for many different projects, it can also be adapted to fit other configurations and environments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#devops-overview"&gt;DevOps Overview&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-is-devops"&gt;What is DevOps?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#what-is-devops-pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops-pipe-over"&gt;Appian DevOps Pipeline Overview&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#why-devops-important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tools-devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-devops-works"&gt;How does the Appian DevOps Pipeline work?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops-pipeline"&gt;Appian DevOps Pipeline&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#prereqs"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#setup"&gt;Pipeline Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dev"&gt;Developer Environment Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-to-use"&gt;How to use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#verify"&gt;Verify Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appendix"&gt;Appendix&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#structure"&gt;Code Repository File Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#security"&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cloud"&gt;Appian Cloud Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#environments"&gt;Environments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id="devops-overview"&gt;&lt;/a&gt;DevOps Overview&lt;/h2&gt;
&lt;h3&gt;&lt;a id="what-is-devops"&gt;&lt;/a&gt;What is DevOps?&lt;/h3&gt;
&lt;p&gt;Development and Operations (DevOps) is a set of practices and tools that help foster a culture of collaboration between development and operations to enable the rapid, frequent, and reliable delivery of software.&lt;/p&gt;
&lt;h3&gt;&lt;a id="what-is-devops-pipe"&gt;&lt;/a&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;Continuous Integration&lt;/a&gt;&amp;nbsp;(CI) and&amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Continuous_delivery"&gt;Continuous Delivery&lt;/a&gt;&amp;nbsp;(CD) describe a set of procedures many modern software companies follow in order to ensure their software is robust and compatible with current and previous versions. A&amp;nbsp;&lt;a href="https://devops.com/continuous-delivery-pipeline/"&gt;DevOps pipeline&lt;/a&gt;&amp;nbsp;breaks the CI and CD processes into discrete automated stages.&lt;/p&gt;
&lt;h2&gt;&lt;a id="devops-pipe-over"&gt;&lt;/a&gt;Appian DevOps Pipeline Overview&lt;/h2&gt;
&lt;h3&gt;&lt;a id="why-devops-important"&gt;&lt;/a&gt;Why is the Appian DevOps Pipeline Important?&lt;/h3&gt;
&lt;p&gt;Appian applications, though faster and simpler to build and maintain than traditional software applications, must also go through a basic life cycle that goes from conception to implementation and testing before they can be deployed to end users. Automating and modularizing this process makes Appian application development even faster and simpler.&lt;/p&gt;
&lt;h3&gt;&lt;a id="tools-devops"&gt;&lt;/a&gt;What tools are used by the Appian DevOps Pipeline?&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/894x501/__key/communityserver-wikis-components-files/00-00-00-00-45/tools.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Planning and Ticket Management:&amp;nbsp;&lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Development Platform:&amp;nbsp;&lt;a href="https://www.appian.com/"&gt;Appian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code Version Control System (VCS):&amp;nbsp;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Database Version Control System (VCS):&amp;nbsp;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pipeline Tool:&amp;nbsp;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Artifact Repository:&amp;nbsp;&lt;a href="https://jfrog.com/artifactory/"&gt;JFrog Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Secret Management:&amp;nbsp;&lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Packaging:&amp;nbsp;&lt;a href="/w/the-appian-playbook/198/deployment-automation#Automated_Versioning_Manager"&gt;Appian Automated Versioning Manager (AVM)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Automated Testing:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.appian.com/suite/help/18.3/Automated_Testing_for_Expression_Rules.html"&gt;Appian Expression Tests (AET)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/the-appian-playbook/97/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Software Release Management:&amp;nbsp;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deployment Automation: &lt;a href="https://docs.appian.com/suite/help/21.4/Deployment_Rest_API.html"&gt;Appian Deployment API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="how-devops-works"&gt;&lt;/a&gt;How does the Appian DevOps Pipeline work?&lt;/h3&gt;
&lt;p&gt;The recommended Appian DevOps Pipeline leverages&amp;nbsp;&lt;a href="https://trunkbaseddevelopment.com"&gt;trunk-based development&lt;/a&gt;. The Appian Dev environment can be interpreted as a &amp;ldquo;branch&amp;rdquo;. Adding the Appian Applications to the &amp;ldquo;master&amp;rdquo; branch in version control is the equivalent of &amp;ldquo;merging&amp;rdquo;. After the &amp;ldquo;merge&amp;rdquo;, the Appian Dev environment can be interpreted as a &amp;ldquo;new branch&amp;rdquo;. The goal is to &amp;ldquo;merge&amp;rdquo; frequently to the &amp;ldquo;master&amp;rdquo; branch to keep the spirit of &amp;ldquo;short-lived branches&amp;rdquo;.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/986x453/__key/communityserver-wikis-components-files/00-00-00-00-45/process.png" /&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id="devops-pipeline"&gt;&lt;/a&gt;Appian DevOps Pipeline&lt;/h2&gt;
&lt;h3&gt;&lt;a id="prereqs"&gt;&lt;/a&gt;Prerequisites&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jfrog.com/artifactory/"&gt;Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt;&amp;nbsp;need to be accessible in the Jenkins workspace&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/the-appian-playbook/198/deployment-automation"&gt;Appian Automated Deployment Manager (ADM)&lt;/a&gt;&amp;nbsp;(Only Appian Version Manager is leveraged in this Pipeline)&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/the-appian-playbook/97/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;a id="setup"&gt;&lt;/a&gt;Pipeline Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/appian/devops-quickstart/archive/master.zip"&gt;Download&lt;/a&gt;&amp;nbsp;or re-create the recommended&amp;nbsp;&lt;a href="#structure"&gt;file structure&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;Please refer to the documentation contained in the repository&amp;nbsp;&lt;code&gt;README.md&lt;/code&gt;&amp;nbsp;files for more detailed guidance&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Connect the local repository copy to a new Github repository&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/test_suites/QuickStart&amp;lt;Integration/Acceptance&amp;gt;Test/content.txt&lt;/code&gt;&amp;nbsp;files&lt;br /&gt;&lt;br /&gt;
&lt;pre class="ui-code"&gt;|set appian url to |https://&amp;lt;integration/acceptance-site-url&amp;gt;/suite |
|set appian version to |&amp;lt;site-url-version&amp;gt; |
|set appian locale to |en_US |
|login with username |&amp;lt;username-for-site&amp;gt; |&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Update devops/deploymentmanager.properties files for each environment to specify site URL and API Key.
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="text"&gt;### Environment-specific properties
## REQUIRED. URL of the environment
url=[Enter URL of the appian site e.g. https://yourCloudSite.appiancloud.com/suite]
siteApiKey=[Enter the API key for the deployment service account created in Appian]
packageFileName=app-package.zip
### Import-specific properties
## REQUIRED Name for the deployment
deploymentName=[ Enter a name for the deployment, to appear in the deployment tab within Appian]
## REQUIRED Description for the deployment
deploymentDescription=[ Enter a description for the deployment, to appear in the deployment tab within Appian]&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/users.properties&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;# List of username/password combination with access to Appian environment
# Example: fitnesse.user=password
&amp;lt;username-for-site&amp;gt;=&amp;lt;password&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;The following parameters need to be accessible to the&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;&amp;nbsp;as environmental variables:&lt;br /&gt;&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOUSERNAME&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Username for remote repository&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOPASSWORD&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Password for remote repository.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYAPIKEY&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;API Key to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYURL&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;URL to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Create a generic repository in Artifactory to store the .zip files for ADM and FitNesse for Appian based on the recommended&amp;nbsp;&lt;a href="#artifact-structure"&gt;file structure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a Jenkins Job
&lt;ol&gt;
&lt;li&gt;Create a &amp;lsquo;New Item&amp;rsquo;
&lt;ol&gt;
&lt;li&gt;Pick a descriptive name, such as &amp;ldquo;My-App-QuickStart&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Select &amp;ldquo;Pipeline&amp;rdquo; Job&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;This project is parameterized&amp;rdquo; and add the following parameters:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;String&lt;/strong&gt;:&amp;nbsp;APPLICATIONNAME
&lt;ol&gt;
&lt;li&gt;Name of application being deployed (Should correspond directly with folder name in repository)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;Poll SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Cron"&gt;Schedule&lt;/a&gt;:&amp;nbsp;&lt;/strong&gt;&amp;ldquo;0 2 * * *&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;In the Pipeline definition, &amp;ldquo;Pipeline script from SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SCM:&amp;nbsp;&lt;/strong&gt;Git&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository URL&lt;/strong&gt;: URL to remote repository&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Script Path:&lt;/strong&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;a id="dev"&gt;&lt;/a&gt;Developer Environment Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="/w/the-appian-playbook/198/deployment-automation#Installation1"&gt;Install ADM&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;li&gt;Override the default Automated Versioning Manager&amp;rsquo;s&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file with the copy from the repo located at&amp;nbsp;&lt;code&gt;devops/adm/version-manager.local.properties&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Adjust the&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file as necessary to match your local preferences&lt;br /&gt;&lt;br /&gt;
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;### Environment-specific properties
## REQUIRED. Username of the version control account
vcUsername=&amp;lt;remote-repo-username&amp;gt;
## REQUIRED. Password of the version control account
vcPassword=&amp;lt;remote-repo-password&amp;gt;
## REQUIRED. URL to access the remote repository
repoUrl=&amp;lt;remote-repo-url&amp;gt;
## REQUIRED. Path to the folder containing the local repository
localRepoPath=&amp;lt;local-repo-path&amp;gt;
## Path to the folder containing the Appian objects in the repository. This path is relative to the path of the local repository. If not specified, the Appian objects are checked out to and committed from the root of the local repository path.
## Assure that the path does not contain any preceding or trailing forward slashes. Example: appian/applications/Hello_World
appianObjectsRepoPath=appian/applications/&amp;lt;application-name&amp;gt;


### Action-specific properties
## REQUIRED. Valid choices are addContents, buildAllApps, buildSingleApp, or updateLocalRepo
action=addContents
## Path for the application ZIP file to add to version control. Used for the addContents action.
applicationPath=&amp;lt;path-to-local-application-ZIP&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Install&amp;nbsp;&lt;a href="/w/the-appian-playbook/97/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;How to use&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Use git to update your&amp;nbsp;local repository with any&amp;nbsp;remote changes&lt;/li&gt;
&lt;li&gt;Use&amp;nbsp;&lt;a href="/w/the-appian-playbook/198/deployment-automation#addContents"&gt;Version Manager&lt;/a&gt;&amp;nbsp;to add your Appian application/patch to the repo
&lt;ol&gt;
&lt;li&gt;Include any necessary Flyway migration files associated to the application changes&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Wait for the pipeline to be triggered or manually trigger it&lt;/li&gt;
&lt;li&gt;Use the&amp;nbsp;&lt;a href="https://plugins.jenkins.io/pipeline-stage-view"&gt;Jenkins pipeline dashboard&lt;/a&gt;&amp;nbsp;to monitor the automated tests and deployments&lt;/li&gt;
&lt;li&gt;In the &amp;ldquo;Promotion Decision&amp;rdquo; stage, either promote or abort the pipeline job&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;a id="verify"&gt;&lt;/a&gt;Verify Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Verify the Jenkins job pipeline ran successfully and all stages are reported green&lt;/li&gt;
&lt;li&gt;Navigate to &amp;ldquo;Releases&amp;rdquo; in your GitHub repository and verify that a release has been made
&lt;ol&gt;
&lt;li&gt;The release should include the application zip as well as a custom import properties file, if specified in&amp;nbsp;&lt;code&gt;appian/properties&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a id="appendix"&gt;&lt;/a&gt;Appendix&lt;/h2&gt;
&lt;h3&gt;&lt;a id="structure"&gt;&lt;/a&gt;Code Repository File Structure&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/appian/devops-quickstart"&gt;Download Sample Code Repository File Structure&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7853.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;appian
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7853.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;applications
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7853.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;properties
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7853.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;devops
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/8171.pastedimage1649095776037v1.png" /&gt;deploymentmanagement.prod.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7776.pastedimage1649095826124v2.png" /&gt;deploymentmanagement.test.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/0830.pastedimage1649095827402v3.png" /&gt;deploymentmanagement.stag.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7853.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;adm
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.prod.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.stag.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;import-manager.test.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;version-manager.local.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;version-manager.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7853.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;f4a
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7853.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;test_suites
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7853.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;QuickStartAcceptanceTest&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7853.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;QuickStartIntegrationTest&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;fitnesse-automation.acceptance.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;fitnesse-automation.integration.properties&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;users.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="artifact-structure"&gt;&lt;/a&gt;Artifact Repository File Structure&lt;/h3&gt;
&lt;p&gt;Download &lt;a href="/b/appmarket/posts/deployment-automation-manager"&gt;ADM&lt;/a&gt; and &lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;. Rename the .zip files as adm.zip and f4a.zip respectively. Upload them to an Artifactory repo named appian-devops.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7853.folder_2D00_open_2D00_o.png" /&gt;&amp;nbsp;appian-devops
&lt;ul&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;adm.zip&lt;/li&gt;
&lt;li&gt;&lt;img alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7183.file_2D00_text_2D00_o.png" /&gt;&amp;nbsp;f4a.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="security"&gt;&lt;/a&gt;Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It is recommended to configure the pipeline infrastructure to limit access to node machines executing the pipeline to ensure sensitive information required for execution is properly secured.&lt;/li&gt;
&lt;li&gt;The sample Jenkinsfile document relies on credentials stored in plaintext directly in the properties files or environment variables. This is intended for demonstration purposes only. It is recommended to store credentials in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime.&lt;/li&gt;
&lt;li&gt;For sensitive configuration properties, such as those used in the staging and production environments, it is recommended to store their values in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime. Consider updating the sample properties files to use a single tokenized file if all the values for each environment are stored in a separate system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="cloud"&gt;&lt;/a&gt;Appian Cloud Considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All plugins needed by your Appian applications should be deployed to all the Appian environments before running the pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="environments"&gt;&lt;/a&gt;Environments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The pipeline is setup to automatically add git tags to keep track of the version of the applications that is deployed on each environment. This is simpler than using separate branches or a different system. It&amp;rsquo;s also fully automated and traceable via the git tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: DevOps&lt;/div&gt;
</description></item><item><title>Appian DevOps Quick Start</title><link>https://community.appian.com/success/w/article/3225/appian-devops-quick-start/revision/1</link><pubDate>Wed, 02 Aug 2023 19:19:31 GMT</pubDate><guid isPermaLink="false">d3a83456-d57b-489c-a84c-4e8267bb592a:503b7a31-6400-40ab-ad83-219e9e6a40e0</guid><dc:creator>joel.larin</dc:creator><comments>https://community.appian.com/success/w/article/3225/appian-devops-quick-start#comments</comments><description>Revision 1 posted to Article by joel.larin on 8/2/2023 7:19:31 PM&lt;br /&gt;
&lt;div&gt;
&lt;p&gt;This document serves as a guide to configure a generic automated process for versioning and importing Appian applications using a defined DevOps pipeline. This guide has been assembled as a holistic process that covers automated versioning, application import/export, and testing. While the pipeline described can be used as-is for many different projects, it can also be adapted to fit other configurations and environments.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#devops-overview"&gt;DevOps Overview&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-is-devops"&gt;What is DevOps?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#what-is-devops-pipe"&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops-pipe-over"&gt;Appian DevOps Pipeline Overview&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#why-devops-important"&gt;Why is the Appian DevOps Pipeline Important?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tools-devops"&gt;What tools are used by the Appian DevOps Pipeline?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-devops-works"&gt;How does the Appian DevOps Pipeline work?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#devops-pipeline"&gt;Appian DevOps Pipeline&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#prereqs"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#setup"&gt;Pipeline Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dev"&gt;Developer Environment Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#how-to-use"&gt;How to use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#verify"&gt;Verify Setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#appendix"&gt;Appendix&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#structure"&gt;Code Repository File Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#security"&gt;Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cloud"&gt;Appian Cloud Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#environments"&gt;Environments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a id="devops-overview"&gt;&lt;/a&gt;DevOps Overview&lt;/h2&gt;
&lt;h3&gt;&lt;a id="what-is-devops"&gt;&lt;/a&gt;What is DevOps?&lt;/h3&gt;
&lt;p&gt;Development and Operations (DevOps) is a set of practices and tools that help foster a culture of collaboration between development and operations to enable the rapid, frequent, and reliable delivery of software.&lt;/p&gt;
&lt;h3&gt;&lt;a id="what-is-devops-pipe"&gt;&lt;/a&gt;What is a DevOps Pipeline and how does it relate to CI/CD?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;Continuous Integration&lt;/a&gt;&amp;nbsp;(CI) and&amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Continuous_delivery"&gt;Continuous Delivery&lt;/a&gt;&amp;nbsp;(CD) describe a set of procedures many modern software companies follow in order to ensure their software is robust and compatible with current and previous versions. A&amp;nbsp;&lt;a href="https://devops.com/continuous-delivery-pipeline/"&gt;DevOps pipeline&lt;/a&gt;&amp;nbsp;breaks the CI and CD processes into discrete automated stages.&lt;/p&gt;
&lt;h2&gt;&lt;a id="devops-pipe-over"&gt;&lt;/a&gt;Appian DevOps Pipeline Overview&lt;/h2&gt;
&lt;h3&gt;&lt;a id="why-devops-important"&gt;&lt;/a&gt;Why is the Appian DevOps Pipeline Important?&lt;/h3&gt;
&lt;p&gt;Appian applications, though faster and simpler to build and maintain than traditional software applications, must also go through a basic life cycle that goes from conception to implementation and testing before they can be deployed to end users. Automating and modularizing this process makes Appian application development even faster and simpler.&lt;/p&gt;
&lt;h3&gt;&lt;a id="tools-devops"&gt;&lt;/a&gt;What tools are used by the Appian DevOps Pipeline?&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/894x501/__key/communityserver-wikis-components-files/00-00-00-00-45/tools.png" /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Planning and Ticket Management:&amp;nbsp;&lt;a href="https://www.atlassian.com/software/jira"&gt;Jira&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Development Platform:&amp;nbsp;&lt;a href="https://www.appian.com/"&gt;Appian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Code Version Control System (VCS):&amp;nbsp;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Database Version Control System (VCS):&amp;nbsp;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pipeline Tool:&amp;nbsp;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Artifact Repository:&amp;nbsp;&lt;a href="https://jfrog.com/artifactory/"&gt;JFrog Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Secret Management:&amp;nbsp;&lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Packaging:&amp;nbsp;&lt;a href="/w/the-appian-playbook/198/deployment-automation#Automated_Versioning_Manager"&gt;Appian Automated Versioning Manager (AVM)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Automated Testing:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.appian.com/suite/help/18.3/Automated_Testing_for_Expression_Rules.html"&gt;Appian Expression Tests (AET)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/the-appian-playbook/97/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Software Release Management:&amp;nbsp;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deployment Automation: &lt;a href="https://docs.appian.com/suite/help/21.4/Deployment_Rest_API.html"&gt;Appian Deployment API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="how-devops-works"&gt;&lt;/a&gt;How does the Appian DevOps Pipeline work?&lt;/h3&gt;
&lt;p&gt;The recommended Appian DevOps Pipeline leverages&amp;nbsp;&lt;a href="https://trunkbaseddevelopment.com"&gt;trunk-based development&lt;/a&gt;. The Appian Dev environment can be interpreted as a &amp;ldquo;branch&amp;rdquo;. Adding the Appian Applications to the &amp;ldquo;master&amp;rdquo; branch in version control is the equivalent of &amp;ldquo;merging&amp;rdquo;. After the &amp;ldquo;merge&amp;rdquo;, the Appian Dev environment can be interpreted as a &amp;ldquo;new branch&amp;rdquo;. The goal is to &amp;ldquo;merge&amp;rdquo; frequently to the &amp;ldquo;master&amp;rdquo; branch to keep the spirit of &amp;ldquo;short-lived branches&amp;rdquo;.&lt;/p&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/986x453/__key/communityserver-wikis-components-files/00-00-00-00-45/process.png" /&gt;&lt;/div&gt;
&lt;h2&gt;&lt;a id="devops-pipeline"&gt;&lt;/a&gt;Appian DevOps Pipeline&lt;/h2&gt;
&lt;h3&gt;&lt;a id="prereqs"&gt;&lt;/a&gt;Prerequisites&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flywaydb.org/getstarted/firststeps/commandline"&gt;Flyway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jfrog.com/artifactory/"&gt;Artifactory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt;&amp;nbsp;need to be accessible in the Jenkins workspace&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/the-appian-playbook/198/deployment-automation"&gt;Appian Automated Deployment Manager (ADM)&lt;/a&gt;&amp;nbsp;(Only Appian Version Manager is leveraged in this Pipeline)&lt;/li&gt;
&lt;li&gt;&lt;a href="/w/the-appian-playbook/97/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;a id="setup"&gt;&lt;/a&gt;Pipeline Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/appian/devops-quickstart/archive/master.zip"&gt;Download&lt;/a&gt;&amp;nbsp;or re-create the recommended&amp;nbsp;&lt;a href="#structure"&gt;file structure&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;Please refer to the documentation contained in the repository&amp;nbsp;&lt;code&gt;README.md&lt;/code&gt;&amp;nbsp;files for more detailed guidance&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Connect the local repository copy to a new Github repository&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/test_suites/QuickStart&amp;lt;Integration/Acceptance&amp;gt;Test/content.txt&lt;/code&gt;&amp;nbsp;files&lt;br /&gt;&lt;br /&gt;
&lt;pre class="ui-code"&gt;|set appian url to |https://&amp;lt;integration/acceptance-site-url&amp;gt;/suite |
|set appian version to |&amp;lt;site-url-version&amp;gt; |
|set appian locale to |en_US |
|login with username |&amp;lt;username-for-site&amp;gt; |&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Update devops/deploymentmanager.properties files for each environment to specify site URL and API Key.
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="text"&gt;### Environment-specific properties
## REQUIRED. URL of the environment
url=[Enter URL of the appian site e.g. https://yourCloudSite.appiancloud.com/suite]
siteApiKey=[Enter the API key for the deployment service account created in Appian]
packageFileName=app-package.zip
### Import-specific properties
## REQUIRED Name for the deployment
deploymentName=[ Enter a name for the deployment, to appear in the deployment tab within Appian]
## REQUIRED Description for the deployment
deploymentDescription=[ Enter a description for the deployment, to appear in the deployment tab within Appian]&lt;/pre&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;devops/f4a/users.properties&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;# List of username/password combination with access to Appian environment
# Example: fitnesse.user=password
&amp;lt;username-for-site&amp;gt;=&amp;lt;password&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Update&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;The following parameters need to be accessible to the&amp;nbsp;&lt;code&gt;Jenkinsfile&lt;/code&gt;&amp;nbsp;as environmental variables:&lt;br /&gt;&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOUSERNAME&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Username for remote repository&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;REPOPASSWORD&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;Password for remote repository.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYAPIKEY&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;API Key to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;ARTIFACTORYURL&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;URL to access Artifactory repo containing ADM and F4A&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Create a generic repository in Artifactory to store the .zip files for ADM and FitNesse for Appian based on the recommended&amp;nbsp;&lt;a href="#artifact-structure"&gt;file structure&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a Jenkins Job
&lt;ol&gt;
&lt;li&gt;Create a &amp;lsquo;New Item&amp;rsquo;
&lt;ol&gt;
&lt;li&gt;Pick a descriptive name, such as &amp;ldquo;My-App-QuickStart&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Select &amp;ldquo;Pipeline&amp;rdquo; Job&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;This project is parameterized&amp;rdquo; and add the following parameters:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;String&lt;/strong&gt;:&amp;nbsp;APPLICATIONNAME
&lt;ol&gt;
&lt;li&gt;Name of application being deployed (Should correspond directly with folder name in repository)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Check the box &amp;ldquo;Poll SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Cron"&gt;Schedule&lt;/a&gt;:&amp;nbsp;&lt;/strong&gt;&amp;ldquo;0 2 * * *&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;In the Pipeline definition, &amp;ldquo;Pipeline script from SCM&amp;rdquo;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SCM:&amp;nbsp;&lt;/strong&gt;Git&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository URL&lt;/strong&gt;: URL to remote repository&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Script Path:&lt;/strong&gt;&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;a id="dev"&gt;&lt;/a&gt;Developer Environment Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="/w/the-appian-playbook/198/deployment-automation#Installation1"&gt;Install ADM&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;li&gt;Override the default Automated Versioning Manager&amp;rsquo;s&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file with the copy from the repo located at&amp;nbsp;&lt;code&gt;devops/adm/version-manager.local.properties&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Adjust the&amp;nbsp;&lt;code&gt;version-manager.properties&lt;/code&gt;&amp;nbsp;file as necessary to match your local preferences&lt;br /&gt;&lt;br /&gt;
&lt;pre class="ui-code"&gt;&lt;pre class="ui-code" data-mode="python"&gt;### Environment-specific properties
## REQUIRED. Username of the version control account
vcUsername=&amp;lt;remote-repo-username&amp;gt;
## REQUIRED. Password of the version control account
vcPassword=&amp;lt;remote-repo-password&amp;gt;
## REQUIRED. URL to access the remote repository
repoUrl=&amp;lt;remote-repo-url&amp;gt;
## REQUIRED. Path to the folder containing the local repository
localRepoPath=&amp;lt;local-repo-path&amp;gt;
## Path to the folder containing the Appian objects in the repository. This path is relative to the path of the local repository. If not specified, the Appian objects are checked out to and committed from the root of the local repository path.
## Assure that the path does not contain any preceding or trailing forward slashes. Example: appian/applications/Hello_World
appianObjectsRepoPath=appian/applications/&amp;lt;application-name&amp;gt;


### Action-specific properties
## REQUIRED. Valid choices are addContents, buildAllApps, buildSingleApp, or updateLocalRepo
action=addContents
## Path for the application ZIP file to add to version control. Used for the addContents action.
applicationPath=&amp;lt;path-to-local-application-ZIP&amp;gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Install&amp;nbsp;&lt;a href="/w/the-appian-playbook/97/automated-testing-with-fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;&amp;nbsp;locally&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;How to use&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Use git to update your&amp;nbsp;local repository with any&amp;nbsp;remote changes&lt;/li&gt;
&lt;li&gt;Use&amp;nbsp;&lt;a href="/w/the-appian-playbook/198/deployment-automation#addContents"&gt;Version Manager&lt;/a&gt;&amp;nbsp;to add your Appian application/patch to the repo
&lt;ol&gt;
&lt;li&gt;Include any necessary Flyway migration files associated to the application changes&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Wait for the pipeline to be triggered or manually trigger it&lt;/li&gt;
&lt;li&gt;Use the&amp;nbsp;&lt;a href="https://plugins.jenkins.io/pipeline-stage-view"&gt;Jenkins pipeline dashboard&lt;/a&gt;&amp;nbsp;to monitor the automated tests and deployments&lt;/li&gt;
&lt;li&gt;In the &amp;ldquo;Promotion Decision&amp;rdquo; stage, either promote or abort the pipeline job&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;a id="verify"&gt;&lt;/a&gt;Verify Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Verify the Jenkins job pipeline ran successfully and all stages are reported green&lt;/li&gt;
&lt;li&gt;Navigate to &amp;ldquo;Releases&amp;rdquo; in your GitHub repository and verify that a release has been made
&lt;ol&gt;
&lt;li&gt;The release should include the application zip as well as a custom import properties file, if specified in&amp;nbsp;&lt;code&gt;appian/properties&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a id="appendix"&gt;&lt;/a&gt;Appendix&lt;/h2&gt;
&lt;h3&gt;&lt;a id="structure"&gt;&lt;/a&gt;Code Repository File Structure&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/appian/devops-quickstart"&gt;Download Sample Code Repository File Structure&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7317.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;appian
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7317.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;applications
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7317.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;properties
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7317.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;devops
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/pastedimage1649095776037v1.png" /&gt;&lt;/div&gt;
deploymentmanagement.prod.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/pastedimage1649095826124v2.png" /&gt;&lt;/div&gt;
deploymentmanagement.test.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/320x240/__key/communityserver-wikis-components-files/00-00-00-00-45/pastedimage1649095827402v3.png" /&gt;&lt;/div&gt;
deploymentmanagement.stag.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7317.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;adm
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;import-manager.prod.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;import-manager.stag.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;import-manager.test.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;version-manager.local.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;version-manager.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7317.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;f4a
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7317.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;test_suites
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7317.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;QuickStartAcceptanceTest&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7317.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;QuickStartIntegrationTest&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;fitnesse-automation.acceptance.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;fitnesse-automation.integration.properties&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;users.properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;Jenkinsfile&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="artifact-structure"&gt;&lt;/a&gt;Artifact Repository File Structure&lt;/h3&gt;
&lt;p&gt;Download &lt;a href="/b/appmarket/posts/deployment-automation-manager"&gt;ADM&lt;/a&gt; and &lt;a href="/b/appmarket/posts/fitnesse-for-appian"&gt;FitNesse for Appian&lt;/a&gt;. Rename the .zip files as adm.zip and f4a.zip respectively. Upload them to an Artifactory repo named appian-devops.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/7317.folder_2D00_open_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;appian-devops
&lt;ul&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;adm.zip&lt;/li&gt;
&lt;li&gt;
&lt;div style="margin-bottom:3rem;margin-top:3rem;"&gt;&lt;img style="box-shadow:3px 3px 5px rgba(0, 0, 0, 0.1);" alt=" " src="/resized-image/__size/16x240/__key/communityserver-wikis-components-files/00-00-00-00-45/1031.file_2D00_text_2D00_o.png" /&gt;&lt;/div&gt;
&amp;nbsp;f4a.zip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="security"&gt;&lt;/a&gt;Security&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It is recommended to configure the pipeline infrastructure to limit access to node machines executing the pipeline to ensure sensitive information required for execution is properly secured.&lt;/li&gt;
&lt;li&gt;The sample Jenkinsfile document relies on credentials stored in plaintext directly in the properties files or environment variables. This is intended for demonstration purposes only. It is recommended to store credentials in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime.&lt;/li&gt;
&lt;li&gt;For sensitive configuration properties, such as those used in the staging and production environments, it is recommended to store their values in a secure system such as &lt;a href="https://www.vaultproject.io/"&gt;Hashicorp Vault&lt;/a&gt;. Update the Jenkinsfile stages to retrieve them at runtime. Consider updating the sample properties files to use a single tokenized file if all the values for each environment are stored in a separate system.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="cloud"&gt;&lt;/a&gt;Appian Cloud Considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All plugins needed by your Appian applications should be deployed to all the Appian environments before running the pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a id="environments"&gt;&lt;/a&gt;Environments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The pipeline is setup to automatically add git tags to keep track of the version of the applications that is deployed on each environment. This is simpler than using separate branches or a different system. It&amp;rsquo;s also fully automated and traceable via the git tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: DevOps&lt;/div&gt;
</description></item></channel></rss>