Cách xây dựng Unity3D-Project cho Holo-Lens bằng Jenkins và MsBuild trên Windows


1

Mục tiêu

Chúng tôi muốn thiết lập các Bản dựng tự động cho các Dự án Unity của chúng tôi bằng MSBuild và MSBuild-Plug-In trên Jenkins.

Cấu hình của tôi

Build-Step theo như

Build a Visual Studio project or solution using MSBuild


MSBuild Version                    VisualStudio-MSBuild-15

MSBuild Build File                 E:\Jenkins\workspace\000_BUILD\<MyProjectName>

Command Line Arguments             /m /p:Configuration=Release /p:Plattform=x86

Pass build variables as properties [x]

Do not use chcp command            [ ]

và cấu hình MSBuild là Cấu hình MSBuild

nơi tôi đang sử dụng MSBuild từ bản cài đặt VisualStudio 2017 của chúng tôi.
Điều này dẫn đến kết thúc một lệnh bó như

cmd.exe /C " chcp 1252 & E:\VisualStudio\MSBuild\15.0\Bin\msbuild.exe /m /p:Configuration=Release /p:Platform=x86 "E:\Jenkins\workspace\000_BUILDS\MY_PROJECT\My Project.sln" " && exit %%ERRORLEVEL%%

Chỉ cần nói điều này để làm rõ rằng câu hỏi của tôi không trực tiếp phụ thuộc vào Jenkins.


Vấn đề của tôi:

Tôi nhận được 72 thông báo lỗi, hầu hết trong số chúng trông giống như (dịch từ tiếng Đức)

2> Thuộc tính \ HộiInfo.cs (8,12): lỗi CS0246: Không tìm thấy Loại hoặc không gian tên "Hội đồng Tiêu đề" (có thể không sử dụng Direktive hoặc Hội nghị).

một số trong số họ cũng thích (dịch từ tiếng Đức)

2> Thuộc tính \ HộiInfo.cs (9,32): lỗi CS0518: Loại được xác định trước "System.String" không được xác định hoặc nhập.


Có lẽ là một gợi ý? Nếu tôi xây dựng cùng một dự án (tôi đã dừng công việc jenkins sau khi rút từ git xong) trực tiếp trong VisualStudio, nó sẽ ném 2 Cảnh báo về một số cuộc gọi không được chấp nhận nhưng AppPackage được xây dựng mà không có lỗi.

Và một điều kỳ lạ :
Sau khi tôi xây dựng dự án thành công một lần trong VisualStudio, thì tôi cũng có thể xây dựng dự án bằng MSBuild từ dòng lệnh, nhận cùng một đầu ra (2 Cảnh báo nhưng không có lỗi) và đã xây dựng AppPackage của tôi.


CÂU HỎI

Tôi đang làm gì sai?
VisualStudio từ GUI làm gì khác với những gì MSBuild làm từ dòng lệnh?
Tôi có thể thiếu một bước hoặc một tùy chọn cho MSbuild không?


Tôi nghĩ bạn nên sử dụng unityeditor.exe để xây dựng một dự án thống nhất từ ​​dòng lệnh. Vì mục đích này, bạn sẽ phải tạo một lớp đặc biệt sẽ được gọi bởi unity.
npocmaka

Tất nhiên điều này đã xảy ra trước bước này. Nếu không, sẽ không có tệp
.sln nào

ahaam..Ok sau đó. Bất kỳ tiến bộ về điều này? Tôi cũng muốn sử dụng msbuild với sự thống nhất (về cơ bản cho mã analisys vì tôi không biết cách tạo dòng lệnh fxCop, nhưng msbuild biết ...)
npocmaka

Này @npocmaka Tôi thực sự đã giải quyết vấn đề này khá lâu rồi;) Tôi đã dành chút thời gian để trả lời câu hỏi của mình vì vậy vui lòng xem bên dưới;)
derHugo

Câu trả lời:


1

Vấn đề là tôi đã không khôi phục Nuget-Gói trước khi xây dựng bằng MSBuild. (Mở Visual-Studio trong GUI, có vẻ như sẽ tự động thực hiện bước này.)

Vì vậy, đây là giải pháp hoàn chỉnh từ gói dự án Unity đến gói ứng dụng Holo-Lens cuối cùng đã hoạt động với tôi:

Tạo gói Unity CommandLineBuild

Trước hết để có thể xây dựng một dự án Unity thông qua dòng lệnh bạn cần một lớp đặc biệt.

Điều này phải được đặt trong /Assets/Editordự án của bạn:

using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System;

namespace JENKINS
{
    public class AutoBuilder : ScriptableObject
    {
        static string[] SCENES = FindEnabledEditorScenes();

        // Use real app name here
        /* Anyway the App will have the name as configured within the Unity-Editor
           This Appname is just for the Folder in which to Build */
        static string APP_NAME;
        static string TARGET_DIR;

        [MenuItem("Custom/CI/Windows Mixed Reality Build (UWP)")]
        public static void PerformWindowsMixedRealityBuild()
        {
            APP_NAME = GetArg("-appName");
            TARGET_DIR = GetArg("-buildFolder");
            Debug.Log("Jenkins-Build: APP_NAME: " + APP_NAME + " TARGET_DIR: " + TARGET_DIR);

            GenericBuild(SCENES, TARGET_DIR + "/" + APP_NAME, BuildTargetGroup.WSA, BuildTarget.WSAPlayer, BuildOptions.AllowDebugging);
        }

        private static string[] FindEnabledEditorScenes()
        {
            List<string> EditorScenes = new List<string>();

            foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes)
            {
                if (!scene.enabled) continue;
                EditorScenes.Add(scene.path);
            }

            return EditorScenes.ToArray();
        }

        private static void GenericBuild(string[] scenes, string app_target, BuildTargetGroup build_target_group, BuildTarget build_target, BuildOptions build_options)
        {
            EditorUserBuildSettings.SwitchActiveBuildTarget(build_target_group, BuildTarget.WSAPlayer);

            string res = BuildPipeline.BuildPlayer(scenes, app_target, build_target, build_options);
            if (res.Length > 0)
            {
                throw new Exception("BuildPlayer failure: " + res);
            }
        }

        /**
         * Get Arguments from the command line by name
         */
        private static string GetArg(string name)
        {
            var args = System.Environment.GetCommandLineArgs();

            for (int i = 0; i < args.Length; i++)
            {
                if (args[i] == name && args.Length > i + 1)
                {
                    return args[i + 1];
                }
            }

            return null;
        }
    }
}

Nhưng vì bạn không muốn nhập gói này cho mọi dự án bạn có, hãy để Jenkins nhập nó một cách nhanh chóng.

Do đó tôi đã tạo lớp trong một dự án trống AutoBuilder.cs trong một Unity-Project trống

và xuất nó dưới dạng AutoBuilder.unityproject:

  1. right-clickbật Assetsvà bấm vàoExport package... nhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đây
  2. Chọn một vị trí để lưu nó vào
    (Tôi đặt của tôi ở dưới E:\UnityPackage\AutoBuilder.unitypackage.)

Xây dựng các bước

Các Unity-PluginMSBuild-Pluginđã không làm việc tốt cho tôi vì vậy tôi làm tất cả các bước trong một loạt file chuyên dụng.

1. Nhập AutoBuild.unitypackage vào dự án

Đầu tiên chúng ta cần nhập trước khi tạo unitypackage cho dự án nhân bản thực tế.

Chạy

<\Path\To\Your\Unity\Installation\>Editor\Unity.exe -quit -batchmode -username 'xxxxxxxxxxxxx' -password 'xxxxxxxxxxx' -logFile uniytImportLog.txt -importPackage E:\UnityPackage\AutoBuilder.unitypackage

Unity - Hướng dẫn: Đối số dòng lệnh

  • -quit: Thực hiện thoát Unity sau khi kết thúc quá trình nhập
  • -batchmode: Không mở / tải GUI và thoát 1 lỗi bất kỳ
  • (tùy chọn) -username-password: Cung cấp thông tin đăng nhập của bạn để Unity có thể tra cứu Giấy phép của bạn (nếu cần)
  • (tùy chọn) -logFile: Viết đầu ra vào logFile (vì Unity trong batchmode sẽ không hiển thị nó!)
  • -importPackage: Cuối cùng hãy nói cho Unity biết phải làm gì; trong trường hợp này, nhập tệp unitypackage của chúng tôi (Thay đổi tệp này thành vị trí bạn đã lưu trữ AutoBuilder.unitypackage)

2. Chạy Unity-Build to Visual-Studio-Solution (.sln)

Bây giờ dự án đã sẵn sàng để được xây dựng thông qua dòng lệnh để .slngiải pháp.

Chạy

<\Path\To\Your\Unity\Installation\>Editor\Unity.exe -quit -batchmode -username 'xxxxxxxxxxxxx' -password 'xxxxxxxxxxx' -logFile uniytBuildLog.txt -buildTarget wsaplayer -executeMethod JENKINS.AutoBuilder.PerformWindowsMixedRealityBuild  -appName %JOB_NAME% -buildFolder %WORKSPACE%\00_BUILD

Unity - Hướng dẫn: Đối số dòng lệnh

  • -quit: Thực hiện thoát Unity sau khi kết thúc quá trình nhập
  • -batchmode: Không mở / tải GUI và thoát 1 lỗi bất kỳ
  • (tùy chọn) -username-password: Cung cấp thông tin đăng nhập của bạn để Unity có thể tra cứu Giấy phép của bạn (nếu cần)
  • (tùy chọn) -logFile: Viết đầu ra vào logFile (vì Unity trong batchmode sẽ không hiển thị nó!)
  • -buildTarget: Chuyển sang mục tiêu xây dựng theo trước khi tải dự án. Đối với các gói ứng dụng, vdwsaplayer
  • -executeMethod: Cuối cùng hãy nói cho Unity biết phải làm gì; trong trường hợp này thực thi phương thức từ lớp AutoBuilder đã nhập trước của chúng tôi
  • -appName %JOB_NAME%-buildFolder %WORKSPACE%\00_BUILD: Phương thức chúng ta gọi mất / yêu cầu đối số từ dòng lệnh.
    • -appNameNghe có vẻ hơi sai vì nó thực sự chỉ là thư mục con mà Unity sẽ xây dựng. %JOB_NAME%là biến môi trường Jenkins toàn cầu cho tên của Công việc thực tế.
    • -buildFolderlà thư mục chính mà Unity sẽ xây dựng. %WORKSPACE%là biến môi trường Jenkins toàn cầu cho thư mục không gian làm việc thực tế của Công việc.

LƯU Ý
Trước hai bước cuối cùng sau đây, bạn phải biết cách .slntệp được gọi sau Unity-Build.

Tôi sẽ giả sử từ đây một cái gì đó giống như YourProject.slnđược lưu trữ cho biến App_Namevì nó được định nghĩa trong Unity:

Chuyển đến Edit-> Project Settings-> Player Settings Chuyển đến Chỉnh sửa -> Cài đặt dự án -> Cài đặt trình phát và thay đổiProduct Name Thay đổi tên sản phẩm


3. Khôi phục gói Nuget (Đây chủ yếu là bước tôi đã bỏ lỡ trước đó)

Để khôi phục các gói nuget (Visual-Studio thường tự động thực hiện việc này khi mở giải pháp trong GUI) chạy

cmd.exe /C " chcp 1252 & <Path\To\Your\Visual-Studio\Installation>\MSBuild\15.0\Bin\msbuild.exe /m /t:restore /p:Configuration=Release /p:Platform=x86 "%WORKSPACE%\00_BUILD\%JOB_NAME%\%App_Name%" "

Tham chiếu dòng lệnh MSBuild

  • /m: Chỉ định số lượng tối đa các quy trình đồng thời sẽ sử dụng khi xây dựng. Nếu bạn không bao gồm công tắc này, giá trị mặc định là 1. Nếu bạn bao gồm công tắc này mà không chỉ định giá trị, MSBuild sẽ sử dụng tối đa số lượng bộ xử lý trong máy tính.
  • /t: Xây dựng các mục tiêu được chỉ định trong dự án.
  • /p: Đặt hoặc ghi đè các thuộc tính cấp dự án đã chỉ định, trong đó tên là tên thuộc tính và giá trị là giá trị thuộc tính. (-> cho Holo-Lens, nó Configuration=ReleasePlattform=x86)
  • WORKSPACE: Biến môi trường toàn cầu của Jenkins cho thư mục không gian làm việc thực tế của Công việc
  • 00_BUILD: chúng tôi đã trao thông số này làm tham số -buildFoldercho bước xây dựng Unity.
  • JOB_NAME: Biến môi trường toàn cầu của Jenkins cho tên Công việc thực tế
  • App_Name: như đã đề cập trước tên của Visual-Studio-Solution ( .sln)

Điều này sẽ chỉ làm khôi phục và chưa xây dựng dự án.

4. Xây dựng gói ứng dụng cuối cùng bằng MSBuild

Tôi không thích MSBuild-Pluginjenkins vì vậy tôi đã tạo nó trong một tệp bó và sử dụng lệnh được tạo bởi Plugin trước đó. Nhưng thực hiện nó trong một tệp bó giúp tôi linh hoạt hơn về mặt định nghĩa, ví dụ như tệp đích.

cmd.exe /C " chcp 1252 & <Path\To\Your\Visual-Studio\Installation>\MSBuild\15.0\Bin\msbuild.exe /m /t:build /p:Configuration=Release /p:Platform=x86 "%WORKSPACE%\00_BUILD\%JOB_NAME%\%App_Name%" "

Tham chiếu dòng lệnh MSBuild

  • /m: Chỉ định số lượng tối đa các quy trình đồng thời sẽ sử dụng khi xây dựng. Nếu bạn không bao gồm công tắc này, giá trị mặc định là 1. Nếu bạn bao gồm công tắc này mà không chỉ định giá trị, MSBuild sẽ sử dụng tối đa số lượng bộ xử lý trong máy tính.
  • /t: Xây dựng các mục tiêu được chỉ định trong dự án.
  • /p: Đặt hoặc ghi đè các thuộc tính cấp dự án đã chỉ định, trong đó tên là tên thuộc tính và giá trị là giá trị thuộc tính. (-> cho Holo-Lens, nó Configuration=ReleasePlattform=x86)
  • WORKSPACE: Biến môi trường toàn cầu của Jenkins cho thư mục không gian làm việc thực tế của Công việc
  • 00_BUILD: chúng tôi đã trao thông số này làm tham số -buildFoldercho bước xây dựng Unity.
  • JOB_NAME: Biến môi trường toàn cầu của Jenkins cho tên Công việc thực tế
  • App_Name: như đã đề cập trước tên của Visual-Studio-Solution ( .sln)

Sau khi hoàn thành, bạn nên có gói ứng dụng cuối cùng bên dưới

%WORKSPACE%\000_BUILD\%JOB_NAME%\%App_Name%\AppPackages
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.