{"id":196739,"date":"2025-06-18T13:27:18","date_gmt":"2025-06-18T13:27:18","guid":{"rendered":"https:\/\/innovationspace.ansys.com\/knowledge\/?post_type=topic&#038;p=196739"},"modified":"2025-06-18T14:26:59","modified_gmt":"2025-06-18T14:26:59","slug":"automating-ansys-scade-suite-workflows-with-github-actions","status":"publish","type":"topic","link":"https:\/\/innovationspace.ansys.com\/knowledge\/forums\/topic\/automating-ansys-scade-suite-workflows-with-github-actions\/","title":{"rendered":"Automating Ansys SCADE Suite workflows with GitHub Actions"},"content":{"rendered":"<p style=\"text-align: center\">\n    <img decoding=\"async\" src=\"https:\/\/innovationspace.ansys.com\/knowledge\/wp-content\/uploads\/sites\/4\/2025\/06\/scade-042-banner.jpeg\" style=\"max-height: 700px !important\" \/><br \/>\n    <em><\/em>\n<\/p>\n<p>Continuous Integration (CI) and Continuous Deployment (CD) are critical in modern software development. In a <a href=\"https:\/\/innovationspace.ansys.com\/knowledge\/forums\/topic\/setting-up-a-continuous-integration-continuous-delivery-ci-cd-workflow-with-scade\/\">previous article<\/a>, we covered ways of setting up CI\/CD pipelines with Ansys SCADE.<\/p>\n<p>Today, we will dive into the GitHub flavor of this process, using our open-source <a href=\"https:\/\/github.com\/ansys\/scade-actions\">Ansys SCADE Actions<\/a> for GitHub. We will set up and run a GitHub Actions pipeline on the Cruise Control example model provided with the SCADE Suite product, using a self-hosted runner to perform automated actions.<\/p>\n<h3  id=\"PREREQUISITES\">Prerequisites<\/h3>\n<p>Before setting up the GitHub workflow, ensure that you have:<\/p>\n<ul>\n<li>A GitHub repository containing a SCADE Suite model<\/li>\n<li>Basic knowledge of <a href=\"https:\/\/docs.github.com\/en\/actions\">GitHub Actions<\/a><\/li>\n<li>A <a href=\"https:\/\/docs.github.com\/en\/actions\/hosting-your-own-runners\/managing-self-hosted-runners\/about-self-hosted-runners\">self-hosted runner<\/a> with SCADE Suite installed (this will be used to launch SCADE in batch mode to perform automatic actions on the model).<\/li>\n<\/ul>\n<h3  id=\"SETTING-UP-THE-SELF-HOSTED-RUNNER\">Setting up the self-hosted runner<\/h3>\n<p>Ansys SCADE requires a self-hosted runner so that the GitHub Actions pipeline can run automated actions by invoking SCADE in batch mode.<\/p>\n<p>Follow these steps to set up your runner:<\/p>\n<ul>\n<li>Navigate to your GitHub repository and go to <em>Settings &gt; Actions &gt; Runners<\/em>.<\/li>\n<li>Select <em>New self-hosted runner<\/em> and choose your operating system.<\/li>\n<li>Follow the provided instructions to install and configure a Windows runner.<\/li>\n<li>Ensure that SCADE Suite is installed and accessible from the runner environment.<\/li>\n<\/ul>\n<p>Creating a single self-hosted runner is enough to get started. As you scale up your SCADE CI\/CD activities and the volume of jobs increases, you may want to create additional runners to spread the workload.<\/p>\n<h3  id=\"SCADE-SUITE-GITHUB-ACTIONS-WORKFLOW\">SCADE Suite GitHub Actions workflow<\/h3>\n<p>We will now create a GitHub Actions workflow, stored under <code>.github\/workflows\/scade-ci.yml<\/code> that automates the process of checking, analyzing, and testing a SCADE model.<\/p>\n<p>Our workflow will perform four sequential tasks on our model. Each of these tasks launches SCADE in batch mode on our model and produces a report that is archived on the workflow run for later reference. Here is the sequence of actions:<\/p>\n<ul>\n<li><code>scade-check<\/code>: validate the integrity of the SCADE model.<\/li>\n<li><code>scade-metrics<\/code>: compute model complexity and quality metrics.<\/li>\n<li><code>test-execute<\/code>: run automated model tests.<\/li>\n<li><code>suite-report<\/code>: generate human-readable documentation detailing the model&#8217;s architecture and structure, down to individual operator inputs and outputs.<\/li>\n<\/ul>\n<p>Below is a screenshot that shows a successful run of this workflow on the <em>CruiseControl<\/em> example model provided with SCADE Suite. Notice the artifacts attached to the workflow in the bottom half of the image:<\/p>\n<p style=\"text-align: center\">\n    <img decoding=\"async\" src=\"https:\/\/innovationspace.ansys.com\/knowledge\/wp-content\/uploads\/sites\/4\/2025\/06\/scade-042-workflow.png\" style=\"max-height: 800px !important\" \/><br \/>\n    <em><\/em>\n<\/p>\n<p>And here is the complete YAML file describing the workflow:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #ffffff;overflow:auto;width:auto;background:none;border:none;padding:.2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span><\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span>ci-scade-actions\r\n\r\n<span style=\"color: #000080\">on<\/span>:<span style=\"color: #bbbbbb\"> <\/span>\r\n<span style=\"color: #bbbbbb\">  <\/span><span style=\"color: #000080\">pull_request<\/span>:<span style=\"color: #bbbbbb\"> <\/span>\r\n<span style=\"color: #bbbbbb\">  <\/span><span style=\"color: #000080\">push<\/span>:<span style=\"color: #bbbbbb\"> <\/span>\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">tags<\/span>:<span style=\"color: #bbbbbb\"> <\/span>\r\n<span style=\"color: #bbbbbb\">      <\/span>-<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;*&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">branches<\/span>:<span style=\"color: #bbbbbb\"> <\/span>\r\n<span style=\"color: #bbbbbb\">      <\/span>-<span style=\"color: #bbbbbb\"> <\/span>main\r\n<span style=\"color: #bbbbbb\">  <\/span><span style=\"color: #000080\">workflow_dispatch<\/span>:<span style=\"color: #bbbbbb\"> <\/span>\r\n\r\n<span style=\"color: #000080\">jobs<\/span>:\r\n<span style=\"color: #bbbbbb\">  <\/span><span style=\"color: #000080\">scade-check<\/span>:\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Check<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">SCADE<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Suite<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Model&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">outputs<\/span>:\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">scade-directory<\/span>:<span style=\"color: #bbbbbb\"> <\/span>${{ steps.get-scade-dir.outputs.scade-directory}}\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">runs-on<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #008080\">self-hosted<\/span>,<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&#039;SCADE&#039;<\/span>]\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">strategy<\/span>:\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">matrix<\/span>:\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">os<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #008080\">windows-latest<\/span>]\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">scade-version<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #bb8844\">&#039;25.1&#039;<\/span>]\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">fail-fast<\/span>:<span style=\"color: #bbbbbb\"> <\/span>false\r\n\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">steps<\/span>:\r\n<span style=\"color: #bbbbbb\">      <\/span>-<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Clone<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Project&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">uses<\/span>:<span style=\"color: #bbbbbb\"> <\/span>actions\/checkout@v4\r\n<span style=\"color: #bbbbbb\">      <\/span>-<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Get<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">SCADE<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Installation<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Directory&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">uses<\/span>:<span style=\"color: #bbbbbb\"> <\/span>ansys\/scade-actions\/get-scade-dir@v2\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">id<\/span>:<span style=\"color: #bbbbbb\"> <\/span>get-scade-dir\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">with<\/span>:\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">scade-version<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;25.1&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">      <\/span>-<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Check<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Model&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">uses<\/span>:<span style=\"color: #bbbbbb\"> <\/span>ansys\/scade-actions\/suite-check@v2\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">id<\/span>:<span style=\"color: #bbbbbb\"> <\/span>suite-check\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">with<\/span>:\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">scade-dir<\/span>:<span style=\"color: #bbbbbb\"> <\/span>${{steps.get-scade-dir.outputs.scade-directory}}\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">project<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;CruiseControl\/CruiseControl\/CruiseControl.etp&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">configuration<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;KCG&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">      <\/span>-<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Upload<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Checker<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">report<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">artifacts&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">uses<\/span>:<span style=\"color: #bbbbbb\"> <\/span>actions\/upload-artifact@v4\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">with<\/span>:\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;scade-suite-check-report&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">path<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;${{<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">steps.suite-check.outputs.report}}&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">retention-days<\/span>:<span style=\"color: #bbbbbb\"> <\/span>7\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">if-no-files-found<\/span>:<span style=\"color: #bbbbbb\"> <\/span>error\r\n\r\n<span style=\"color: #bbbbbb\">  <\/span><span style=\"color: #000080\">scade-metrics<\/span>:\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Compute<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Metrics&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">runs-on<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #008080\">self-hosted<\/span>,<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&#039;SCADE&#039;<\/span>]\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">outputs<\/span>:\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">scade-directory<\/span>:<span style=\"color: #bbbbbb\"> <\/span>${{ needs.scade-check.outputs.scade-directory}}\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">strategy<\/span>:\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">matrix<\/span>:\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">os<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #008080\">windows-latest<\/span>]\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">scade-version<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #bb8844\">&#039;25.1&#039;<\/span>]\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">fail-fast<\/span>:<span style=\"color: #bbbbbb\"> <\/span>false\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">needs<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #008080\">scade-check<\/span>]\r\n\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">steps<\/span>:\r\n<span style=\"color: #bbbbbb\">      <\/span>-<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Compute<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Metrics&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">uses<\/span>:<span style=\"color: #bbbbbb\"> <\/span>ansys\/scade-actions\/suite-metrics@v2\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">id<\/span>:<span style=\"color: #bbbbbb\"> <\/span>suite-metrics\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">with<\/span>:\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">scade-dir<\/span>:<span style=\"color: #bbbbbb\"> <\/span>${{needs.scade-check.outputs.scade-directory}}\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">configuration<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;MetricRule&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">project<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;CruiseControl\/CruiseControl\/CruiseControl.etp&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">      <\/span>-<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Upload<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Checker<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">report<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">artifacts&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">uses<\/span>:<span style=\"color: #bbbbbb\"> <\/span>actions\/upload-artifact@v4\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">with<\/span>:\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;metrics&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">path<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;${{<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">steps.suite-metrics.outputs.report}}&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">retention-days<\/span>:<span style=\"color: #bbbbbb\"> <\/span>7\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">if-no-files-found<\/span>:<span style=\"color: #bbbbbb\"> <\/span>error\r\n\r\n<span style=\"color: #bbbbbb\">  <\/span><span style=\"color: #000080\">test-execute<\/span>:\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Execute<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Tests&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">runs-on<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #008080\">self-hosted<\/span>,<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&#039;SCADE&#039;<\/span>]\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">outputs<\/span>:\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">scade-directory<\/span>:<span style=\"color: #bbbbbb\"> <\/span>${{ needs.scade-metrics.outputs.scade-directory}}\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">strategy<\/span>:\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">matrix<\/span>:\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">os<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #008080\">windows-latest<\/span>]\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">scade-version<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #bb8844\">&#039;25.1&#039;<\/span>]\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">fail-fast<\/span>:<span style=\"color: #bbbbbb\"> <\/span>false\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">needs<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #008080\">scade-metrics<\/span>]\r\n\r\n<span style=\"color: #bbbbbb\">    <\/span><span style=\"color: #000080\">steps<\/span>:\r\n<span style=\"color: #bbbbbb\">      <\/span>-<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Execute<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Tests&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">uses<\/span>:<span style=\"color: #bbbbbb\"> <\/span>ansys\/scade-actions\/test-execute@v2\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">with<\/span>:\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">scade-dir<\/span>:<span style=\"color: #bbbbbb\"> <\/span>${{needs.scade-metrics.outputs.scade-directory}}\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">configuration<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Test&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">test-project<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;CruiseControl\/CruiseControl_Test\/CruiseControl_Test.etp&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">results-project<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;CruiseControl\/CruiseControl_Result\/CruiseControl_Result.etp&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">junit-report<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;junit-reports\/Model.xml&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">      <\/span>-<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Upload<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">JUnit<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">report<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">to<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">artifacts&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">uses<\/span>:<span style=\"color: #bbbbbb\"> <\/span>actions\/upload-artifact@v4\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">with<\/span>:\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;junit-report&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">path<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;junit-reports\\\\Model.xml&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">retention-days<\/span>:<span style=\"color: #bbbbbb\"> <\/span>7\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">if-no-files-found<\/span>:<span style=\"color: #bbbbbb\"> <\/span>error\r\n\r\n<span style=\"color: #bbbbbb\">  <\/span><span style=\"color: #000080\">suite-report<\/span>:\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Create<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Report&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">runs-on<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #008080\">self-hosted<\/span>,<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&#039;SCADE&#039;<\/span>]\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">strategy<\/span>:\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">matrix<\/span>:\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">os<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #008080\">windows-latest<\/span>]\r\n<span style=\"color: #bbbbbb\">          <\/span><span style=\"color: #000080\">scade-version<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #bb8844\">&#039;25.1&#039;<\/span>]\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">fail-fast<\/span>:<span style=\"color: #bbbbbb\"> <\/span>false\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">needs<\/span>:<span style=\"color: #bbbbbb\"> <\/span>[<span style=\"color: #008080\">test-execute<\/span>]\r\n\r\n<span style=\"color: #bbbbbb\">  <\/span><span style=\"color: #000080\">steps<\/span>:\r\n<span style=\"color: #bbbbbb\">    <\/span>-<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Create<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">Report&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">uses<\/span>:<span style=\"color: #bbbbbb\"> <\/span>ansys\/scade-actions\/suite-report@v2\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">id<\/span>:<span style=\"color: #bbbbbb\"> <\/span>suite-report\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">with<\/span>:\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">scade-dir<\/span>:<span style=\"color: #bbbbbb\"> <\/span>${{ needs.test-execute.outputs.scade-directory }}\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">project<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;CruiseControl\/CruiseControl\/CruiseControl.etp&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">configuration<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;RTF&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">    <\/span>-<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;Upload<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">the<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">document<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">to<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">artifacts&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">uses<\/span>:<span style=\"color: #bbbbbb\"> <\/span>actions\/upload-artifact@v4\r\n<span style=\"color: #bbbbbb\">      <\/span><span style=\"color: #000080\">with<\/span>:\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">name<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;scade-suite-report&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">path<\/span>:<span style=\"color: #bbbbbb\"> <\/span><span style=\"color: #bb8844\">&quot;${{<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">steps.suite-report.outputs.report<\/span><span style=\"color: #008080\"> <\/span><span style=\"color: #bb8844\">}}&quot;<\/span>\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">retention-days<\/span>:<span style=\"color: #bbbbbb\"> <\/span>7\r\n<span style=\"color: #bbbbbb\">        <\/span><span style=\"color: #000080\">if-no-files-found<\/span>:<span style=\"color: #bbbbbb\"> <\/span>error\r\n<\/pre>\n<\/div>\n<p>Let&#8217;s break down the contents of this file.<\/p>\n<p>First, we define a <strong>name<\/strong> for our workflow in the <code>name:<\/code> section. We&#8217;ll simply call it <code>ci-scade-actions<\/code>.<\/p>\n<p>Next, we define what <strong>triggers<\/strong> our workflow in the <code>on:<\/code> section. We want it to run on:<\/p>\n<ul>\n<li><strong>Pull Requests<\/strong>: ensures changes are validated before merging.<\/li>\n<li><strong>Push Events<\/strong>: any push to the main branch or to a tag.<\/li>\n<li><strong>Manual triggers<\/strong>: Through <code>workflow_dispatch<\/code>. This allows manual triggering via the GitHub web interface, API or CLI (useful for testing).<\/li>\n<\/ul>\n<p>Finally, we get the main part: listing the <strong>jobs<\/strong> that compose the workflow and how they chain together (<code>jobs:<\/code> section). Each job in the sequence depends on the previous one (<code>needs:<\/code> section). This means it won&#8217;t run unless the previous job is finished and successful.<\/p>\n<p>Below is some detail on the steps performed by each job:<\/p>\n<ul>\n<li><code>scade-check<\/code>:\n<ul>\n<li>Clone the repository onto the runner machine.<\/li>\n<li>Determine the SCADE installation directory (<code>get-scade-dir<\/code>).<\/li>\n<li>Verify semantic correctness of the SCADE model (<code>suite-check<\/code> on the main operator, <code>CruiseControl.etp<\/code>).<\/li>\n<li>Upload validation report for archival.<\/li>\n<\/ul>\n<\/li>\n<li><code>scade-metrics<\/code>:\n<ul>\n<li>Compute metrics using configuration &#8220;MetricRule&#8221;, defined inside the model.<\/li>\n<li>Upload the generated metrics report for archival.<\/li>\n<\/ul>\n<\/li>\n<li><code>test-execute<\/code>:\n<ul>\n<li>Execute tests (<code>test-execute<\/code>).<\/li>\n<li>Store results in JUnit XML format.<\/li>\n<li>Upload test results for archival.<\/li>\n<\/ul>\n<\/li>\n<li><code>suite-report<\/code>:\n<ul>\n<li>Create a model documentation report using the &#8220;RTF&#8221; configuration, defined inside the model.<\/li>\n<li>Upload the report as an artifact for archival.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3  id=\"CONCLUSION\">Conclusion<\/h3>\n<p>In this article, we used <strong>Ansys SCADE Actions for GitHub<\/strong> to automate the verification, testing, and reporting of a SCADE Suite model in a CI\/CD pipeline<a href=\"https:\/\/innovationspace.ansys.com\/knowledge\/wp-content\/uploads\/sites\/4\/2025\/06\/scade-042-automation.gif\">.<\/a> Such pipelines ensure that safety-critical software is rigorously validated with every code change, improving development efficiency and reliability.<\/p>\n<p>Ready to get started on your own models? Visit the <a href=\"https:\/\/actions.scade.docs.pyansys.com\/version\/stable\/index.html\">Ansys SCADE Actions documentation<\/a>.<\/p>\n<h3  id=\"ABOUT-THE-AUTHOR\">About the author<\/h3>\n<table style=\"max-width: 1000px;border: none !important\">\n<tr>\n<td style=\"padding: 0px 10px;border: none !important\">\n<p style=\"text-align: center\">\n    <img decoding=\"async\" src=\"https:\/\/innovationspace.ansys.com\/knowledge\/wp-content\/uploads\/sites\/4\/2025\/06\/scade-042-author-1.png\" style=\"max-height: 150px !important\" \/><br \/>\n                <em><\/em>\n<\/p>\n<\/td>\n<td style=\"padding: 0px 10px;border: none !important\">\n<p><strong>Ludovic Oddos<\/strong> (<a href=\"https:\/\/www.linkedin.com\/in\/ludovicoddos\/\">LinkedIn<\/a>) is a Lead Product Specialist at Ansys. He has been supporting SCADE field engagements, in many industries, for more than 15 years. He has deep expertise in embedded software and its integration into various target environments.<\/p>\n<\/td>\n<\/tr>\n<\/table>\n","protected":false},"template":"","class_list":["post-196739","topic","type-topic","status-publish","hentry","topic-tag-ci-cd","topic-tag-continuous-delivery","topic-tag-continuous-integration","topic-tag-github","topic-tag-scade","topic-tag-suite"],"aioseo_notices":[],"acf":[],"custom_fields":[{"0":{"_edit_lock":["1750263946:1769"],"_edit_last":["1769"],"_aioseo_title":[null],"_aioseo_description":[null],"_aioseo_keywords":["a:0:{}"],"_aioseo_og_title":[null],"_aioseo_og_description":[null],"_aioseo_og_article_section":[""],"_aioseo_og_article_tags":["a:0:{}"],"_aioseo_twitter_title":[null],"_aioseo_twitter_description":[null],"filter_by_optics_product":["Lumerical"],"_filter_by_optics_product":["field_64fb192ba3121"],"application_name":[""],"_application_name":["field_64a80903c8e15"],"family":[""],"_family":["field_64a809229a857"],"siebel_km_number":[""],"_siebel_km_number":["field_63ecbffce60db"],"salesforce_km_number":[""],"_salesforce_km_number":["field_63ecc018e60dc"],"km_published_date":[""],"_km_published_date":["field_64c77704499dd"],"product_version":[""],"_product_version":["field_64c776cb4fd2e"],"_bbp_forum_id":["27825"],"_bbp_topic_id":["196743"],"_bbp_author_ip":["20.82.84.9"],"_bbp_last_reply_id":["0"],"_bbp_last_active_id":["196740"],"_bbp_last_active_time":["2025-06-18 13:27:18"],"_bbp_reply_count":["0"],"_bbp_reply_count_hidden":["0"],"_bbp_voice_count":["0"],"_btv_view_count":["752"],"_bbp_likes_count":["5"]},"test":"solution"}],"_links":{"self":[{"href":"https:\/\/innovationspace.ansys.com\/knowledge\/wp-json\/wp\/v2\/topics\/196739","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/innovationspace.ansys.com\/knowledge\/wp-json\/wp\/v2\/topics"}],"about":[{"href":"https:\/\/innovationspace.ansys.com\/knowledge\/wp-json\/wp\/v2\/types\/topic"}],"version-history":[{"count":4,"href":"https:\/\/innovationspace.ansys.com\/knowledge\/wp-json\/wp\/v2\/topics\/196739\/revisions"}],"predecessor-version":[{"id":196743,"href":"https:\/\/innovationspace.ansys.com\/knowledge\/wp-json\/wp\/v2\/topics\/196739\/revisions\/196743"}],"wp:attachment":[{"href":"https:\/\/innovationspace.ansys.com\/knowledge\/wp-json\/wp\/v2\/media?parent=196739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}