unagirabbit's blog

気づいたことをメモしています

【Jenkins】Pipeline script from SCMでCheckout SCMをスキップする

Pipeline ScriptをSCMからCheckoutするように設定した場合、
デフォルトのoptionsだとWORKSPACEにScriptのリポジトリがCheckoutされます。

pipeline {
    agent any
    stages {
        stage("A") {
            steps {
                echo "A"
            }
        }
    }
}

一度Checkoutされると以降はUpdateになりますが、
stepsdeleteDirしたり、.gitフォルダーを消すと再度Checkoutしてくれます。

このScriptのCheckoutは、optionsskipDefaultCheckoutを設定すれば飛ばせます。
Scriptのリポジトリが不要ならCheckoutしないようにしておくのが良いでしょう。

pipeline {
    agent any
    options {
        skipDefaultCheckout()
    }
    stages {
        stage("A") {
            steps {
                echo "A"
            }
        }
    }
}

jenkins.io

DOTSを学ぶためのリンク紹介

Unity DOTS

DOTSを学ぶためのリンク紹介

そもそもDOTSとはなにか

Unity公式ページ

ハイパフォーマンスなマルチスレッド対応のData-Oriented Technology Stack(DOTS)
unity.com

DOTSを結び付ける https://unity3d.com/jp/how-to/DOTS-resource-listunity3d.com

Unite Tokyo 2019のセッション資料

スライドだけではなく講演の動画を見ながらの方が良いです。

たのしいDOTS 〜初級から上級まで〜 learning.unity3d.jp

大量のオブジェクトを含む広いステージでも大丈夫、そうDOTSならね learning.unity3d.jp

DOTSの機能について知る

JobSystemについて

Job System とは blogs.unity3d.com

【Unity】C# Job Systemを自分なりに解説してみる tsubakit1.hateblo.jp

Unity:安全な並列処理をする C# Job System について学ぶ simplestar-tech.hatenablog.com

マニュアル docs.unity3d.com

Burst Compilerについて

C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜 learning.unity3d.jp

マニュアル docs.unity3d.com

ECSについて

CPUを使い切れ!Entity Component System(通称ECS)が切り開く新しいプログラミング learning.unity3d.jp

UnityのECSを理解する その1(初心者向け) eorf.hatenablog.com

ECS初学者に向けてのTips集 learning.unity3d.jp

マニュアル https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/ECSSamples/Documentation/index.mdgithub.com

DOTSサンプルプロジェクトたち

github.com

unity.com

ScriptableBuildPipelineでAssetBundleをビルド

初めてのScriptableBuildPipeline

learning.unity3d.jp

具体的にカスタムビルドパイプラインを作るために必要になる知識と具体的なカスタム例

learning.unity3d.jp

ブラックボックスなAssetBundleのビルドステップをカスタムして、
カスタムしたタスクを差し込んだり不要なステップを無くしたりできます。
スクリプトデバッグが行えるのでカスタムは楽だと思います。

Pipelineは3つのプリセットが用意されていますので、
これを参考にカスタムしていくのが良いでしょう。

  • PlayerScriptsOnly
    スクリプトのビルドのみを行う
  • AssetBundleCompatible
    AssetBundleのビルドを行う
  • AssetBundleBuiltInShaderExtraction
    ビルトインシェーダーの重複を排除したAssetBundleのビルドを行う

ただし現時点ではAssetBundleManifestを出力してくれません。
元はAdressable Assetのためのものですからね。

環境

Unity:2019.3.1f1
Scriptable Build Pipeline:1.5.6

DefaultBuildTasksでプリセットのパイプラインを作成し、
パラメーターを渡すだけでサクッと試せます。

1. Pipelineで実行するタスク(IBuildTask)のリストを作成

プリセットでAssetBundleのビルドに必要なタスクのリストを取得できます。
タスクは自由に追加/削除する事ができ順番に実行されます。

// AssetBundleCompatibleのタスクリストを取得する
var tasks = DefaultBuildTasks.Create(DefaultBuildTasks.Preset.AssetBundleCompatible);

2. タスクに必要なパラメーター(IContextObject)を作成

タスクにはパラメーター(IContextObject)を必要とするものもあります。
何のIContextObjectが必要かはタスクの実装を見るのが早いでしょう。

public class SwitchToBuildPlatform : IBuildTask
{
    // 一部抜粋
    // IBuildParametersの入力が必要
    [InjectContext(ContextUsage.In)]
    IBuildParameters m_Parameters;
}

AssetBundleCompatibleのタスクでは2つだけで良いです。

// [IBundleBuildParameters]
// プラットフォームや成果物の出力先などPipelineで必須となるパラメーター
var buildParams = new BundleBuildParameters(buildTarget, BuildPipeline.GetBuildTargetGroup(buildTarget), Application.streamingAssetsPath);

// [IBundleBuildContent]
// ビルドする[AssetBundleBuild]をセットする
var bundleBuilds = ContentBuildInterface.GenerateAssetBundleBuilds();
var bundleBuildContent = new BundleBuildContent(bundleBuilds);

3. BuildTasksRunnerにタスクとパラメーターを渡して実行

BuildTasksRunnerにタスクのリストとパラメーターを渡します。
パラメーターはBuildContextにセットする必要があります。

var buildContext = new BuildContext();
buildContext.SetContextObject(parameters);
buildContext.SetContextObject(bundleBuildContent);
var buildResult = BuildTasksRunner.Run(tasks, buildContext);

まとめ

「読み方さえ分かっていれば中身は結構シンプル」
具体的なカスタム事例はDeep-Dive into Scriptable Build Pipeline参照です。
とりあえずはスクリプトコンパイルをスキップする所だけ試すでも良いかと。
実際のプロダクションへの導入とPlayerのビルドを試していきたと思います。

using UnityEngine;
using UnityEditor;
using UnityEditor.Build.Content;
using UnityEditor.Build.Pipeline;
using UnityEditor.Build.Pipeline.Interfaces;

public static class BuildScriptablePipelineTest
{
    public static void BundlePipeline()
    {
        var buildTarget = EditorUserBuildSettings.activeBuildTarget;
        // --- 1.Pipelineのタスクリストを作成(IBuildTask) --- //
        // Presetからパイプラインのタスクを作成
        // カスタムしたタスクがあれば追加する
        var tasks = DefaultBuildTasks.Create(DefaultBuildTasks.Preset.AssetBundleCompatible);

        // --- 2.Pipelineの実行に必要なパラメーターを設定する(IContextObject) --- //
        // [IBundleBuildParameters]ビルドに必要な基本的なパラメーターを設定します
        var buildParams = new BundleBuildParameters(buildTarget, BuildPipeline.GetBuildTargetGroup(buildTarget), Application.streamingAssetsPath);
        // // scriptInfo(TypeDB)があるならスクリプトコンパイルをスキップできる!
        // buildParams.ScriptInfo = null;
        // // キャッシュサーバはデフォルトtrueなので必要に応じて変更
        // buildParams.UseCache = true;
        // buildParams.CacheServerPort = 8126;
        // buildParams.CacheServerHost = "ホスト";
        // // 圧縮タイプ
        // buildParams.BundleCompression = UnityEngine.BuildCompression.LZMA;

        // [IBundleBuildContent]ビルドするAssetBundleやSceneを設定します
        // 個別に指定する場合はIEnumerable<AssetBundleBuild>で実装
        var bundleBuilds = ContentBuildInterface.GenerateAssetBundleBuilds();
        var bundleBuildContent = new BundleBuildContent(bundleBuilds);

        // 他に必要な[ContextObject]はContentPipelineが作成してくれる

        // --- 3.Tasksを渡してPipelineを実行する(BuildTasksRunner) --- //
        IBundleBuildResults results;
        var buildResult = ContentPipeline.BuildAssetBundles(buildParams, bundleBuildContent, out results, tasks);
    }
}

資料

Scriptable Build Pipeline / Usage Examples

docs.unity3d.com

【Unity 2019】コード補完が効かない時

環境

Unity 2019.4.5f1

Preferencesでcsprojを出力するようにする

[Edit] -> [Preferences] -> [External Tools]
Generate .csproj filesの項目で必要なpackagesにチェックを入れてください。
その後Regenerate project filesでcsprojを出力します。
出力されないようなら[Assets] -> [Open C# Project]もしておいてください。

【Jenkins】Pipelineで並列ビルドを無効にするオプション

概要

並列ビルドを無効にするにはoptionsdisableConcurrentBuilds()を追加します。

注意点として、
JenkinsはJobが並列実行される時、WORKSPACEを自動で分けてくれます。
通常時 -> ${JENKINS_HOME}/workspace/{job-name}
並列時 -> ${JENKINS_HOME}/workspace/{job-name@2}

このWORKSPACE分けはJobが実行されたタイミングで行わるため、
Pipelineの中で並列かをチェックしても${WORKSPACE}は振り分け済みです。

pipeline{
    agent any
    options{
        lock 'hoge'
    }
    stages{
        stage('stage1'){
            steps{
                // 意図しないcloneになっているかも
                git branch: 'main', url: 'hoge.git'
            }
        }
    }
}

WORKSPACE分けてほしくないという時はdisableConcurrentBuildsを使います。

pipeline{
    agent any
    options{
        disableConcurrentBuilds()
    }
    stages{
        stage('stage1'){
            steps{
                echo 'hello'
            }
        }
    }
}

親ジョブを作りlockで制御させるのもありです。

pipeline{
    agent any
    stages{
        stage('stage1'){
            options{
                lock 'hoge'
            }
            steps{
                build job: 'other_job'
            }
        }
    }
}

【Jenkins】VSCodeからJenkinsのPipelineを編集/ビルドする

他に良いプラグインがありました。

unagirabbit.hatenablog.com

JenkinsのPipelineをテストするとき、都度ページを開いてビルドするのは手間ですよね。
jenkins-runnerは手元で編集しているPipelineを指定のJenkins上で実行する事ができます。
Jobの設定を上書きしてしまうので、テスト用のJobで試すのが良いでしょう。
新しいPipelineを書いてみよう、という時に大変重宝しています。

jenkins-runner

詳しくはGitHubをご覧ください。 github.com

できること

  • VSCode上だけでPipelineのトライアルアンドエラー!

  • 複数のJenkinsとJobを登録してテスト

  • パラメーターを指定してのビルド

  • 構文エラーをEditor上でハイライト

  • ビルド出力をVSCodeの出力に表示

インストールと設定

1. 拡張機能Jenkins Runnerをインストール

MarketPlaceのページはこちら
https://marketplace.visualstudio.com/items?itemName=dave-hagedorn.jenkins-runner

2. settingsにJenkinsのホストとJobの設定を行う

Jenkinsのホスト

JenkinsのURLを設定します。
セキュリティを有効にしている場合はuserとpasswordを設定してください。

"jenkins-runner.hostConfigs": {
    "local": {
        "url": "http://localhost:8080"
    },
    "local-secure": {
        "url": "http://localhost:8090",
        "user": "ユーザー名",
        "password": "パスワード"
    }
}

Jobの設定

"jenkins-runner.jobs": {
    "test 1 - defaults": {
        "isDefault": true, // コマンドでデフォルト実行するならtrue
        "runWith": ["local", "local-secure"], // hostConfigsで設定したホスト名
        "name": "test-pipeline", // ビルドするJobの名前
    },
    "test 1 - other params": {
        "runWith": "local-secure",
        "name": "test-pipeline",
        "parameters": {
            "param1": "Hello World!"
        }
    }
}

3. VSCodeのコマンドからJenkins Runnerを実行

Default Jobの方だとisDefaulttrueにしたものが実行されます。