exponenta event banner

Разработка Jenkins Build Jobs с использованием непрерывной интеграции в проекте DO-178C/DO-331

Проект DO-178C включает в себя пример структуры, показывающей, как можно разрабатывать задания Jenkins по построению, использующие непрерывную интеграцию (CI) для полной автоматизации выполнения действий по проверке программного обеспечения. Структура Jenkins CI поставляется с готовой к запуску работой, которая выполняет следующие задачи:

  • Создает отчет о требованиях из каждого набора требований в папке DO_02_Requirements.

  • Создает отчет описания конструкции системы из каждой модели в папке DO_03_Design.

  • Проверяет каждую модель на соответствие высокоуровневым требованиям к программному обеспечению.

  • Проверка соответствия каждой модели стандартам модели программного обеспечения (DO_01_Planning>standards>MB_11_23_SMS>MB_11_23_SMS.docx).

  • Анализ каждой модели на предмет обнаружения ошибок конструкции.

  • Создает код из каждой модели.

  • Проверка созданного кода.

  • Проверяет, соответствует ли созданный код стандартам кода программного обеспечения (DO_01_Planning>standards>MB_11_08_SCS>MB_11_08_SCS.docx).

  • Анализирует сгенерированный код на наличие дефектов программного обеспечения.

  • Проверяет сформированный код в соответствии с высокоуровневыми требованиями к программному обеспечению, которые он реализует.

  • Генерирует низкоуровневые тесты из каждой модели, когда охват высокоуровневых тестов является неполным.

  • Проверяет сформированный код на соответствие требованиям к низкоуровневому программному обеспечению, не охваченному высокоуровневыми тестами.

  • Оценка общего охвата тестов, используемых для проверки созданного кода.

Примечание

Если вы хотите запустить CI на нескольких хостах или в облаке, обратитесь в команду MathWorks CI. Для продуктов компилятора и продуктов преобразования, таких как Embedded Coder ®, Simulink ® Design Verifier™ и Simulink Code Inspector™, могут потребоваться клиентские лицензии (Client Access Licenses, CAL).

Для получения дополнительной информации об использовании структуры Jenkins™ CI в - 178C проект, см.:

Настройка файла задания построения Дженкинса

Шаблон DO-178C и демонстрационный проект предоставляют готовый к использованию файл построения задания Дженкинса. DODemoTask.m, которые можно использовать для выполнения действий проверки и проверки в рабочем процессе конструирования на основе модели. Используя существующий файл задания сборки Дженкинса, можно легко настроить действия проверки и проверки для проекта.

Для создания пользовательского задания построения необходимо:

Укажите проект и модели для задания создания Дженкинса

В continuous_integation>job папка, DODemoTask.m файл определяет задания, выполняемые построением Дженкинса. Этот файл также используется для определения DO-178C проекта и моделей, с которыми выполняются задания.

Метод setupJob(), которая выполняется в начале и в конце каждого задания, выполняет следующие функции:

  • Функция loadProject() загружает проект.

  • Функция getModelNames() извлекает путь для модели (моделей), с которой выполняются задания.

  • Использует дополнительные функции для выполнения фоновых задач, таких как регистрация каталога задания построения, задача и очистка задания, а также очистка кэша.

    methods
        function setupJob(this)
            % Equivalent to (TestClassSetup) of matlab.unittest.TestCase.
            this.JobDir = fileparts(mfilename('fullpath'));
            this.ReportDir = regexprep(this.JobDir, 'job$', 'reports');
            addpath(this.JobDir);
            this.clearCache();
            this.loadProject();
            this.getModelNames();
        end
        
        function setupTask(this)
            % Equivalent to (TestMethodSetup) of matlab.unittest.TestCase.
        end
        
        function cleanupTask(this)
            % Equivalent to (TestMethodTeardown) of matlab.unittest.TestCase.
        end
        
        function cleanupJob(this)
            % Equivalent to (TestClassTeardown) of matlab.unittest.TestCase.
            this.closeProject();
            this.restoreDir();
        end
    end
    
    methods % For use by setupJob.
        function clearCache(this)
            % The MATLAB Compiler Runtime (MCR) cache can cause errors with
            % Polyspace in certain installations. Delete the entire cache
            % to avoid running into this problem.
            cacheDir = fullfile(tempdir, getenv('username'));
            if exist(cacheDir, 'dir')
                rmdir(cacheDir, 's');
            end
        end
        
        function loadProject(this)
            prj = dir(fullfile(this.JobDir, '..', '..', '*.prj'));
            this.ProjectDir = prj.folder;
            this.ProjectName = prj.name;
            this.Project = matlab.project.loadProject(fullfile(this.ProjectDir, this.ProjectName));
        end
        
        function getModelNames(this)                    
            this.ModelNames = find_mdlrefs('Flight_Control');
        end
    end
    
    methods % For use by setupTask.
    end
    
    methods % For use by cleanupTask.
    end
    
    methods % For use by cleanupJob.
        function closeProject(this)
            this.Project.close();
        end
        
        function restoreDir(this)
            cd(this.JobDir);
        end
    end

Можно использовать функцию getModelNames() для получения имен моделей либо из модели верхнего уровня, либо из определенных папок проекта.

Чтобы извлечь имена моделей из модели верхнего уровня, выполните следующие действия.

  1. Все модели в проекте рассматриваются как ссылочные, если они не зарегистрированы как модели верхнего уровня. Определить местонахождение isTopModel и введите имя модели верхнего уровня в проекте. Обратите внимание, что модель верхнего уровня может быть:

    • Ссылка только на одну модель конструкции.

    • Ссылочная модель в тестовом кабельном жгуте.

    В этом примере: Flight_Control определяется как модель верхнего уровня.

         methods 
            function result = isTopModel(this, model)
                allTopModels = {'Flight_Control'};
                result = any(strcmpi(allTopModels, model));
            end
        end
  2. Функция поиска getModelNames() и для find_mdlrefsвведите имя модели верхнего уровня. Обратите внимание, что модель верхнего уровня соответствует модели, предусмотренной для isTopModel.

            function getModelNames(this)
                this.ModelNames = find_mdlrefs('Flight_Control');
            end

    Задание построения Дженкинса выполняет задания для всех моделей в модели верхнего уровня.

Чтобы получить имена моделей из папки каталога проекта, выполните следующие действия.

  1. В функции getModelNames()введите имя папки проекта, в которой сохраняются модели. В этом примере имена моделей извлекаются из папки DO_03_Design.

            function getModelNames(this)
                  designDir = fullfile(this.ProjectDir, 'DO_03_Design');
                  dirList = dir(designDir);
            end

    Задание построения Дженкинса выполняет задания для всех моделей в папке каталога проекта.

Можно также исключить извлечение имен моделей из определенных папок проекта, а также имен моделей, содержащих определенные символы, например ".«и».svn". В этом примере функция не возвращает имена моделей в папках проекта common и sample_model или имена моделей, которые содержат ".".

        function getModelNames(this)
             %Ignore common, sample_model, and names that are not a folder
             such as ".", "..", and ".svn".
           
             ignoreDir = arrayfun(@(x) (x.isdir == 0) || strcmpi(x.name, 
             'sample_model') || strcmpi(x.name, 'common') || 
             
             contains(x.name, '.'), dirList);
                 dirList = dirList(~ignoreDir);
                 this.ModelNames = arrayfun(@(x) (x.name), dirList, 
                    'UniformOutput', false);
        end

Определение задач, выполняемых заданием построения Дженкинса

TaskSequence имущества DODemoTasks класс определяет задачи работы проверки и проверки и заказ, в котором они выполняют во время Дженкинса, строят работу. Можно добавлять и удалять задания и изменять порядок их выполнения. Успешное выполнение задания зависит от лицензирования продукта. Ошибка при отсутствии лицензии на продукт.

Чтобы настроить задание построения Дженкинса для выполнения подмножества заданий:

  1. Найдите TaskSequence , которое определяет задачи задания и порядок их выполнения во время задания построения. В этом примере: taskGenReqReport выполняет сначала и taskMergeCodeCoverage выполняется последним.

        properties
            TaskSequence = ["taskGenReqReport"
                            "taskGenSDD"
                            "taskVerifyModel2Reqs"
                            "taskCheckModelStds"
                            "taskDetectDesignErrs"
                            "taskGenSrcCode"
                            "taskVerifySrcCode2Model"
                            "taskCheckCodeStds"
                            "taskProveCodeQuality"
                            "taskVerifyObjCode2Reqs"
                            "taskGenLowLevelTests"
                            "taskVerifyObjCode2LowLevelTests"
                            "taskMergeCodeCoverage"];
        end
    

    Задания в TaskSequence свойству соответствуют следующие методы задачи:

    • taskGenReqReport()

    • taskGenSDD()

    • taskVerifyModel2Reqs()

    • taskCheckModelStds()

    • taskDetectDesignErrs()

    • taskGenSrcCode()

    • taskVerifySrcCode2Model()

    • taskCheckCodeStds()

    • taskProveCodeQuality()

    • taskVerifyObjCode2Reqs()

    • taskGenLowLevelTests()

    • taskVerifyObjCode2LowLevelTests()

    • taskMergeCodeCoverage()

  2. При необходимости измените TaskSequence таким образом, остаются только эти задания:

    • taskVerifyModel2Reqs - Выполняет моделирование для проверки соответствия моделей требованиям. Требуется Test™ Simulink и Coverage™ Simulink.

    • taskGenSrcCode - генерирует код из моделей.

    • taskVerifyObjCode2Reqs - Выполняет моделирование программного обеспечения в цикле (SIL) и процессора в цикле (PIL) для проверки генерируемого кода на соответствие требованиям.

        properties
            TaskSequence = ["taskVerifyModel2Reqs"
                            "taskGenSrcCode"
                            "taskVerifyObjCode2Reqs"];
        end
    

  3. (Необязательно) Найдите и удалите следующие методы задачи:

    • taskGenReqReport()

    • taskGenSDD()

    • taskCheckModelStds()

    • taskDetectDesignErrs()

    • taskVerifySrcCode2Model()

    • taskCheckCodeStds()

    • taskProveCodeQuality()

    • taskGenLowLevelTests()

    • taskVerifyObjCode2LowLevelTests()

    • taskMergeCodeCoverage()

  4. Просмотрите остальные методы задач, которые соответствуют задачам, определенным в TaskSequence собственность. Эти задачи выполняются для каждой модели в проекте.

    taskVerifyModel2Reqs ()

    Проверяет каждую зарегистрированную модель в соответствии с высокоуровневыми требованиями к программному обеспечению, которые она реализует, путем вызова:

    • Все модели в ссылочной модели

      verifyModel2Reqs('MODEL', [], [], 'CI')

    • Все модели в модели верхнего уровня

      verifyModel2Reqs('MODEL', 'TreatAsTopMdl', [], 'CI')

    Результат каждой итерации определяется на основе возвращенных результатов проверки и отчетов Simulink Test and Simulink Coverage Model Coverage:

    • Результат: -1 (FAIL), если в тестовом случае произошла ошибка или сбой, 0 (WARN), если в тестовом случае имеется предупреждение, или 1 (PASS).

    • Общий результат: -1 (FAIL), если отчет Simulink Test или отчет Model Coverage не были успешно сгенерированы. В противном случае это 1 (PASS).

            function taskVerifyModel2Reqs(this)
                % This test point checks if Simulink Test and Model Coverage
                % Reports generated from models are successfully created by
                % "verifyModel2Reqs".
                
                outcome = 1;
                exception = '';
                counter = 0;
                try
                    % Test generation of Simulink Test and Model Coverage
                    % Reports (for HLR Simulation Tests) from models in the
                    % project.
                    title = 'HLR Simulation Tests';
                    headers = {'Model Name', 'Num Pass', 'Num Warn', 'Num Fail',
                        'Outcome'};
                    data = {};
                    for i = 1:numel(this.ModelNames)
                        if exist(fullfile(this.ProjectDir, 'DO_03_Design',
                            this.ModelNames{i}, 'test_cases', 'HLR', 
                            [this.ModelNames{i}, '_REQ_Based_Test.mldatx']),
                            'file')
                            
                            if this.isTopModel(this.ModelNames{i})
                                res = verifyModel2Reqs(this.ModelNames{i},
                                'TreatAsTopMdl', [], 'CI');
                            else
                                res = verifyModel2Reqs(this.ModelNames{i},
                                [], [], 'CI');
                            end
                            
                            data(i,:) = {this.ModelNames{i}, res.NumPass,
                                res.NumWarn, res.NumFail, res.Outcome};
                            
                            msg = ['One or more high-level tests failed on ',
                                this.ModelNames{i}, '.'];
                            [outcome, exception, counter] = this.verifyOutcome
                            (res.Outcome, msg, exception, outcome, counter);
                            
                            file = fullfile(this.ProjectDir, 'DO_03_Design',
                            this.ModelNames{i}, 'verification_results',
                            'simulation_results', 'HLR', [this.ModelNames{i},
                                '_REQ_Based_Test_Report.pdf']);
                            
                            msg = ['Simulation Test Report not created: ',
                                this.ModelNames{i}, '_REQ_Based_Test_Report.pdf.'];
                            [outcome, exception, counter] = this.verifyFile(file,
                            msg, exception, outcome, counter);
                            
                            file = fullfile(this.ProjectDir, 'DO_03_Design',
                            this.ModelNames{i}, 'verification_results',
                            'model_coverages', 'HLR', [this.ModelNames{i},
                                '_REQ_Based_Model_Coverage_Report.html']);
                            
                            msg = ['Model Coverage Report not created: ',
                                this.ModelNames{i}, '_REQ_Based_Model_Coverage_Report.html.'];
                            [outcome, exception, counter] = this.verifyFile(file,
                            msg, exception, outcome, counter);
                        
                        else
                            data(i,:) = {this.ModelNames{i}, [], [], [], []};
                        end
                    end
                    
                    % Capture summary table data.
                    this.TaskResults('taskVerifyModel2Reqs') = {title, headers, data};
                    
                    % Capture task execution outcome.
                    this.TaskOutcomes('taskVerifyModel2Reqs') = outcome;
                    this.TaskExceptions('taskVerifyModel2Reqs') = exception;
                    
                catch ME
                    % Throw exception if an error occurs.
                    rethrow(ME);
                end
            end

    taskGenSrcCode ()

    Генерирует код из каждой зарегистрированной модели путем вызова:

    • Все модели в ссылочной модели

      genSrcCode('MODEL')

    • Все модели в модели верхнего уровня

      genSrcCode('MODEL', 'TreatAsTopMdl')

    Результат каждой итерации: -1 (FAIL), если отчет создания кода не был успешно создан. В противном случае это 1 (PASS).

            function taskGenSrcCode(this)
                % This test point checks if Code Generation Reports generated
                % from models are successfully created by "genSrcCode".
                
                outcome = 1;
                exception = '';
                counter = 0;
                try
                    % Test generation of Code Generation Reports from models in
                    % the project.
                   
                    for i = 1:numel(this.ModelNames)
                        if this.isTopModel(this.ModelNames{i})
                            genSrcCode(this.ModelNames{i}, 'TreatAsTopMdl');
                            file = fullfile(this.ProjectDir, 'DO_04_Code',
                            'specification', [this.ModelNames{i}, '_ert_rtw'],
                            'html', [this.ModelNames{i}, '_codegen_rpt.html']);
                        else
                            genSrcCode(this.ModelNames{i});
                            file = fullfile(this.ProjectDir, 'DO_04_Code',
                            'specification', 'slprj', 'ert', this.ModelNames{i},
                            'html', [this.ModelNames{i}, '_codegen_rpt.html']);
                        end
                        
                        msg = ['Code Generation Report not created: ',
                            this.ModelNames{i}, '_codegen_rpt.html.'];
                        [outcome, exception, counter] = this.verifyFile
                        (file, msg, exception, outcome, counter);
                    end
                    
                    % Capture execution outcome.
                    this.TaskOutcomes('taskGenSrcCode') = outcome;
                    this.TaskExceptions('taskGenSrcCode') = exception;
                
                catch ME
                    % Throw exception if an error occurs.
                    rethrow(ME);
                end
            end

    taskVerifyObjCode2Reqs ()

    Проверяет код, сгенерированный из каждой зарегистрированной модели, в соответствии с высокоуровневыми требованиями к программному обеспечению, которые она реализует, путем вызова:

    • Все модели в ссылочной модели

      verifyObjCode2Reqs('MODEL', 'SIL', [], [], [], 'CI')

    • Все модели в модели верхнего уровня

      verifyObjCode2Reqs('MODEL', 'SIL', [], 'TreatAsTopMdl', [], 'CI')

    Результат каждой итерации определяется на основе возвращенных результатов проверки и отчетов Simulink Test and Simulink Coverage Model Coverage:

    • Результат: -1 (FAIL), если в тестовом случае произошла ошибка или сбой, 0 (WARN), если в тестовом случае имеется предупреждение, или 1 (PASS).

    • Общий результат: -1 (FAIL), если отчет Simulink Test или отчет Model Coverage не были успешно сгенерированы. В противном случае это 1 (PASS).

            function taskVerifyObjCode2Reqs(this)
                % This test point checks if Simulink Test and Code Coverage
                % Reports generated from models are successfully created by
                % "verifyObjCode2Reqs".
                
                outcome = 1;
                exception = '';
                counter = 0;
                try
                    % Test generation of Simulink Test and Code Coverage
                    % Reports (for HLR EOC Tests) from models in the project.
                    title = 'HLR SIL Tests';
                    headers = {'Model Name', 'Num Pass', 'Num Warn', 'Num Fail',
                        'Outcome'};
                    data = {};
                    
                    for i = 1:numel(this.ModelNames)
                        if exist(fullfile(this.ProjectDir, 'DO_03_Design', 
                            this.ModelNames{i}, 'test_cases', 'HLR', 
                            [this.ModelNames{i}, '_REQ_Based_Test.mldatx']), 'file')
                           
                            if this.isTopModel(this.ModelNames{i})
                                res = verifyObjCode2Reqs(this.ModelNames{i},
                                'SIL', [], 'TreatAsTopMdl', [], 'CI');
                            else
                                res = verifyObjCode2Reqs(this.ModelNames{i},
                                'SIL', [], [], [], 'CI');
                            end
                            
                            data(i,:) = {this.ModelNames{i}, res.NumPass, 
                                res.NumWarn, res.NumFail, res.Outcome};
                           
                            msg = ['High-level SIL test cases failed on ',
                                this.ModelNames{i}, '.'];
                            [outcome, exception, counter] = this.verifyOutcome
                            (res.Outcome, msg, exception, outcome, counter);
                            
                            file = fullfile(this.ProjectDir, 'DO_04_Code',
                            'verification_results', 'eoc_test_results', 
                            this.ModelNames{i}, 'host', 'HLR', 'instrumented', 
                            [this.ModelNames{i}, '_INSTR_SIL_REQ_Based_Test_Report.pdf']);
                            
                            msg = ['EOC Test Report not created: ', 
                                this.ModelNames{i}, '_INSTR_SIL_REQ_Based_Test_Report.pdf.'];
                            [outcome, exception, counter] = this.verifyFile
                            (file, msg, exception, outcome, counter);
                            
                            file = fullfile(this.ProjectDir, 'DO_04_Code',
                            'verification_results', 'code_coverages', 
                            this.ModelNames{i}, 'host', 'HLR', [this.ModelNames{i},
                                '_REQ_Based_Code_Coverage_Report.html']);
                            
                            msg = ['Code Coverage Report not created: ', 
                                this.ModelNames{i}, '_REQ_Based_Code_Coverage_Report.html.'];
                            [outcome, exception, counter] = this.verifyFile
                            (file, msg, exception, outcome, counter);
                        else
                            data(i,:) = {this.ModelNames{i}, [], [], [], []};
                        end
                    end
                    
                    % Capture summary table data.
                    this.TaskResults('taskVerifyObjCode2Reqs') = {title, headers, data};
                    
                    % Capture execution outcome.
                    this.TaskOutcomes('taskVerifyObjCode2Reqs') = outcome;
                    this.TaskExceptions('taskVerifyObjCode2Reqs') = exception;
               
                catch ME
                    % Throw exception if an error occurs.
                    rethrow(ME);
                end
            end

Определение нового метода задачи

Для определения нового метода задачи рекомендуется изменить существующую задачу в DODemoTasks.m для достижения намеченной цели работы. При создании новой задачи важно, чтобы вы:

  • Укажите уникальное имя задания. Например:

    function taskCustomNamingStandards(this)

  • Зафиксируйте результаты анализа с помощью:

    • TaskResults для результатов каждой итерации задания.

    • TaskOutcomes для общих результатов выполнения, если применимо.

    • TaskExceptions для исключений при возникновении ошибки.

                    % Capture summary table data.
                    this.TaskResults('taskCustomNamingStandards') = {title, headers, data};
                    
                    % Capture execution outcome.
                    this.TaskOutcomes('taskCustomNamingStandards') = outcome;
                    this.TaskExceptions('taskCustomNamingStandards') = exception;
               
                catch ME
                    % Throw exception if an error occurs.
                    rethrow(ME);
                end
            end

  • Добавить новую задачу в TaskSequence собственность.

        properties
            TaskSequence = ["taskVerifyModel2Reqs"
                            "taskCheckModelStds"
                            "taskGenSrcCode"
                            "taskVerifyObjCode2Reqs"
                            "taskCustomNamingStandards"];
        end
    

Тестовое задание сборки

После настройки файла задания сборки важно протестировать задание перед настройкой проекта сборки в Jenkins. В этом примере используется runJob() для тестирования сборки.

  1. Для тестирования всего задания сборки в командной строке MATLAB ® введите:

    runJob(DODemoTasks)

    Чтобы проверить одну задачу в задании построения, включите имя задачи в качестве входных данных для runJob(). Например, для тестирования VerifyModel2Reqs(), в командной строке MATLAB введите:

    runJob(DODemoTasks, 'taskVerifyModel2Reqs')

  2. Результаты задания сборки отображаются в окне команды MATLAB. Убедитесь, что задание выполнено успешно.

    Теперь можно установить Jenkins, создать проект сборки Jenkins, выполнить сборку в Jenkins и просмотреть результаты.

Установка Jenkins и настройка службы Jenkins с разрешением на запуск MATLAB

Использование структуры CI в проекте DO-178C требует от Дженкинса. Чтобы установить Дженкинса:

  1. В веб-браузере перейдите в www.jenkins.io и запустите загруженную программу установки. Для завершения установки следуйте инструкциям мастера установки.

  2. На панели управления Дженкинса откройте Управление Дженкинсом > Управление подключаемыми модулями.

  3. На вкладке Доступные выберите и установите следующие подключаемые модули, относящиеся к MathWorks:

    • MATLAB

    • Отображение сводки

Дженкинс устанавливается как служба Windows ®. По умолчанию служба Дженкинса запускается с использованием локальной системной учетной записи, не имеющей разрешения на запуск MATLAB. Чтобы использовать учетную запись с соответствующими привилегиями, необходимо перезапустить службу Дженкинса. Для запуска сервиса Дженкинса с необходимыми полномочиями:

  1. Откройте приложение Windows Services и найдите службу Дженкинса.

  2. Щелкните правой кнопкой мыши Дженкинса и выберите Свойства.

  3. В диалоговом окне «Свойства Дженкинса» откройте вкладку «Вход» и выберите «Эта учетная запись».

  4. Введите данные учетной записи пользователя. В зависимости от настроек системы может потребоваться только указать пароль.

  5. Нажмите кнопку ОК. Закройте диалоговое окно свойств Дженкинса и перезагрузите компьютер.

    Теперь можно создать проект построения Дженкинса.

Создание проекта Jenkins CI

При создании проекта Дженкинса соответствующими данными необходимо управлять с помощью системы управления конфигурацией. Вместе с системным администратором интегрируйте файлы проекта в систему управления конфигурацией.

Чтобы создать проект Дженкинса для запуска задания построения, выполните следующие действия.

  1. Убедитесь, что проект добавлен в систему управления конфигурацией.

  2. Откройте панель управления Дженкинса и щелкните Создать элемент. В поле Введите имя элемента укажите имя проекта. В этом примере введите DODemoTasks.

  3. Выберите проект Freestyle и нажмите кнопку ОК.

  4. (Необязательно) На вкладке «Общие» введите описание проекта.

  5. На вкладке Управление исходным кодом выберите Subversion и выполните следующие действия.

    • В поле URL-адрес репозитория укажите расположение репозитория системы управления версиями. Чтобы получить эту информацию из DO-178C проекта, перейдите на вкладку Проект и просмотрите содержимое системы управления версиями. Например, при использовании Apache Subversion™ в качестве системы управления конфигурацией щелкните SVN Details, чтобы получить URL-адрес репозитория подрывной версии.

    • (Необязательно) При необходимости используйте учетные данные для добавления пользователей, имеющих доступ к репозиторию подрывной версии.

    • В поле Каталог локального модуля проверьте, что значение равно "."- не включать предложения. Это значение извлекает проект непосредственно в рабочую область Дженкинса.

    Screen capture of the Jenkins source code management tab.

  6. (Необязательно) Используйте параметры на вкладке «Триггеры построения», чтобы указать способ запуска задания построения. В этом примере не выбирайте параметр, поскольку задание выполняется вручную. Если один из параметров не выбран, необходимо вручную запустить задание построения.

  7. Откройте вкладку Среда построения (Build Environment) и выберите:

    • Удалить рабочую область перед началом построения

    • Добавление меток времени в выходные данные консоли

    • Используйте версию MATLAB. Для корня MATLAB укажите полный путь к папке установки MATLAB. Для определения пути в командной строке MATLAB введите:

       matlabroot()

  8. Откройте вкладку Сборка и выберите Добавить шаг сборки > Выполнить команду MATLAB. В поле Command введите:

    cd('.\continuous_integration\job'); runJob(DODemoTasks);

    Если применимо, замените DODemoTasks с именем вашей работы по построению Дженкинса.

  9. Откройте вкладку Действия после сборки и определите следующие действия после сборки:

    • Чтобы архивировать артефакты, выберите Добавить действие после построения > Архивировать артефакты. В поле Файлы для архивирования введите:

      **\*.slxc, continuous_integration\reports\*.xml

    • Чтобы опубликовать сводные отчеты XML, щелкните Добавить действие после построения > Опубликовать сводные отчеты XML. В поле Файлы для разбора введите:

      continuous_integration\reports\*.xml

  10. Нажмите кнопку Сохранить. DODemoTasks проект указан на панели управления Дженкинса. Чтобы внести изменения в проект, выберите проект и нажмите кнопку «» Настроить «».

    Теперь можно выполнить сборку в Дженкинсе и просмотреть результаты.

Выполнение задания Jenkins CI и анализ результатов

Чтобы выполнить задание построения и просмотреть результаты, выполните следующие действия.

  1. На панели управления Дженкинса щелкните значок DODemoTasks проект.

  2. Нажмите кнопку «Построить сейчас», чтобы выполнить задание вручную.

  3. Завершенные задания добавляются на панель История построения (Build History). Выберите только что выполненную сборку и просмотрите результаты.

    Результаты сохраняются в continuous_integration>reports папка проекта:

    • Сводка построения - общие результаты для каждой задачи задания построения Дженкинса.

    • Сводка результатов проверки - результаты для отдельных итераций задач с детализированными результатами в табличном формате.

См. также

| | (Simulink Check)