- 概要
- はじめに
- 概念
- UiPath CLI を使用する
- UiPath for Coding Agents
- 使用ガイド
- CI/CD レシピ
- コマンド リファレンス
- 概要
- 終了コード
- グローバル オプション
- uip codedagent
- uip docsai
- add-test-data-entity
- テスト データのキューを追加
- 追加-テスト-データ-バリエーション
- 分析
- 開発
- プロジェクトを作成
- 差分
- アクティビティを検索
- GET-ANALYZER-RULES
- get-default-activity-xaml
- エラーを取得
- 手動テスト用のテスト ケースを取得
- 手動テストステップを取得
- get-versions
- Get-workflow-example
- indicate-application
- 要素を示す
- inspect-package
- install-data-fabric-entities
- パッケージのインストールまたは更新
- list-data-fabric-entities
- list-workflow-examples
- パッケージ化
- 元に戻す
- ファイル名を実行
- 検索テンプレート
- スタートスタジオ
- 実行を停止
- UIA
- UIP トレース
- 移行
- 参照とサポート
UiPath CLI ユーザー ガイド
このページでは、CLI のインストール、外部アプリケーションでの認証、UiPath ソリューションのパッケージ化とパブリッシュ、Orchestrator へのデプロイ、および Test Manager スイートの実行を、宣言 的な Jenkinsfile で完全に説明しています。これをリポジトリのルートに配置し、一致する Jenkins 資格情報エントリを作成すると、パイプラインが実行されます。
基本原則 (認証、キャッシュ、ツールのプレインストール、バージョンのピン留め) については、「 方法: CI から Orchestrator にデプロイする」をご覧ください。このページでは、Jenkins 固有のビット (withCredentials、 stash / unstash、エージェントの選択) を含め、Jenkins 構文に焦点を当てています。
前提条件
Jenkinsfile をコピーする前に、以下を実行します。
- パイプラインに必要な
OR.*スコープを持つ外部アプリケーションを UiPath で作成します。「認証 — フロー 2」を参照してください。 - シークレットを Jenkins の資格情報に保存します。
- Jenkins の → 資格情報を System → Global Credentials (無制限) →管理します。
- ID が
UIPATH_CLIENT_IDとUIPATH_CLIENT_SECRETの 2 つの [シークレット テキスト] エントリを追加します。 - ID が
UIPATH_TENANT(テナント名。厳密にはシークレットではありませんが、資格情報が最も移植性の高い場所です) の [プレーン テキスト] または [シークレット テキスト] エントリを追加します。
- エージェントの要件。パイプラインは、Node.js 18+ のラベルが付いた
linuxのラベルが付いたエージェントが PATH 上にnpmと想定しています。Windows で実行する場合、またはコンテナーで実行する場合は、以下の 代替エージェント オプション をご覧ください。 - テスト ステージが必要な場合は、Test Manager プロジェクトとテスト セットをプロビジョニングします。
TEST_SET_KEYとPROJECT_KEYを追加の資格情報として (またはパイプライン パラメーターとして) 追加します。
Jenkinsfile
pipeline {
agent none
options {
timestamps()
buildDiscarder(logRotator(numToKeepStr: '30'))
disableConcurrentBuilds()
}
environment {
CLI_VERSION = '1.0.0'
SOLUTION_NAME = 'my-solution'
SOLUTION_DIR = 'my-solution'
OUTPUT_DIR = 'dist'
SOLUTION_VERSION = "1.2.0-ci.${env.BUILD_NUMBER}"
// npm global prefix for a user-local, no-sudo install
NPM_PREFIX = "${env.WORKSPACE}/.npm-global"
}
stages {
stage('Build') {
agent { label 'linux' }
steps {
checkout scm
sh '''#!/usr/bin/env bash
set -euo pipefail
mkdir -p "$NPM_PREFIX"
npm config set prefix "$NPM_PREFIX"
export PATH="$NPM_PREFIX/bin:$PATH"
if ! command -v uip >/dev/null; then
npm install -g "@uipath/cli@${CLI_VERSION}"
fi
uip --version
mkdir -p "$OUTPUT_DIR"
uip solution pack "$SOLUTION_DIR" "$OUTPUT_DIR" \
--name "$SOLUTION_NAME" \
--version "$SOLUTION_VERSION"
'''
// Carry the .zip to the Deploy stage, which runs on a fresh agent.
stash name: 'solution-zip', includes: "${OUTPUT_DIR}/*.zip"
archiveArtifacts artifacts: "${OUTPUT_DIR}/*.zip", fingerprint: true
}
}
stage('Deploy') {
agent { label 'linux' }
steps {
unstash 'solution-zip'
withCredentials([
string(credentialsId: 'UIPATH_CLIENT_ID', variable: 'UIPATH_CLIENT_ID'),
string(credentialsId: 'UIPATH_CLIENT_SECRET', variable: 'UIPATH_CLIENT_SECRET'),
string(credentialsId: 'UIPATH_TENANT', variable: 'UIPATH_TENANT')
]) {
sh '''#!/usr/bin/env bash
set -euo pipefail
mkdir -p "$NPM_PREFIX"
npm config set prefix "$NPM_PREFIX"
export PATH="$NPM_PREFIX/bin:$PATH"
if ! command -v uip >/dev/null; then
npm install -g "@uipath/cli@${CLI_VERSION}"
fi
uip login \
--client-id env.UIPATH_CLIENT_ID \
--client-secret env.UIPATH_CLIENT_SECRET \
--tenant "$UIPATH_TENANT"
ARTIFACT=$(find "$OUTPUT_DIR" -maxdepth 1 -name "*.zip" | head -1)
uip solution publish "$ARTIFACT"
uip solution deploy run \
--name "${SOLUTION_NAME}-${BUILD_NUMBER}" \
--package-name "$SOLUTION_NAME" \
--package-version "$SOLUTION_VERSION" \
--folder-name MySolution \
--folder-path Shared
'''
}
}
}
stage('Test') {
when {
expression { return env.TEST_SET_KEY?.trim() }
}
agent { label 'linux' }
steps {
withCredentials([
string(credentialsId: 'UIPATH_CLIENT_ID', variable: 'UIPATH_CLIENT_ID'),
string(credentialsId: 'UIPATH_CLIENT_SECRET', variable: 'UIPATH_CLIENT_SECRET'),
string(credentialsId: 'UIPATH_TENANT', variable: 'UIPATH_TENANT'),
string(credentialsId: 'TEST_SET_KEY', variable: 'TEST_SET_KEY'),
string(credentialsId: 'PROJECT_KEY', variable: 'PROJECT_KEY')
]) {
sh '''#!/usr/bin/env bash
set -euo pipefail
mkdir -p "$NPM_PREFIX"
npm config set prefix "$NPM_PREFIX"
export PATH="$NPM_PREFIX/bin:$PATH"
if ! command -v uip >/dev/null; then
npm install -g "@uipath/cli@${CLI_VERSION}"
fi
uip login \
--client-id env.UIPATH_CLIENT_ID \
--client-secret env.UIPATH_CLIENT_SECRET \
--tenant "$UIPATH_TENANT"
EXECUTION_ID=$(uip tm testsets run \
--test-set-key "$TEST_SET_KEY" \
--output-filter "Data.ExecutionId" \
--output plain)
echo "started execution $EXECUTION_ID"
if ! uip tm wait \
--execution-id "$EXECUTION_ID" \
--project-key "$PROJECT_KEY" \
--timeout 1800; then
code=$?
case "$code" in
2) echo "test run did not finish within 30 minutes" >&2; exit 2 ;;
*) echo "wait failed (exit $code)" >&2; exit "$code" ;;
esac
fi
uip tm report get \
--execution-id "$EXECUTION_ID" \
--project-key "$PROJECT_KEY"
FAILED=$(uip tm report get \
--execution-id "$EXECUTION_ID" \
--project-key "$PROJECT_KEY" \
--output-filter "Data.Failed" \
--output plain)
if [ "$FAILED" -gt 0 ]; then
echo "$FAILED test case(s) failed" >&2
exit 1
fi
'''
}
}
}
}
post {
always {
// Best-effort cleanup; uip logout only matters on a persistent agent.
node('linux') {
sh '''
if command -v uip >/dev/null; then
uip logout || true
fi
'''
}
}
}
}
pipeline {
agent none
options {
timestamps()
buildDiscarder(logRotator(numToKeepStr: '30'))
disableConcurrentBuilds()
}
environment {
CLI_VERSION = '1.0.0'
SOLUTION_NAME = 'my-solution'
SOLUTION_DIR = 'my-solution'
OUTPUT_DIR = 'dist'
SOLUTION_VERSION = "1.2.0-ci.${env.BUILD_NUMBER}"
// npm global prefix for a user-local, no-sudo install
NPM_PREFIX = "${env.WORKSPACE}/.npm-global"
}
stages {
stage('Build') {
agent { label 'linux' }
steps {
checkout scm
sh '''#!/usr/bin/env bash
set -euo pipefail
mkdir -p "$NPM_PREFIX"
npm config set prefix "$NPM_PREFIX"
export PATH="$NPM_PREFIX/bin:$PATH"
if ! command -v uip >/dev/null; then
npm install -g "@uipath/cli@${CLI_VERSION}"
fi
uip --version
mkdir -p "$OUTPUT_DIR"
uip solution pack "$SOLUTION_DIR" "$OUTPUT_DIR" \
--name "$SOLUTION_NAME" \
--version "$SOLUTION_VERSION"
'''
// Carry the .zip to the Deploy stage, which runs on a fresh agent.
stash name: 'solution-zip', includes: "${OUTPUT_DIR}/*.zip"
archiveArtifacts artifacts: "${OUTPUT_DIR}/*.zip", fingerprint: true
}
}
stage('Deploy') {
agent { label 'linux' }
steps {
unstash 'solution-zip'
withCredentials([
string(credentialsId: 'UIPATH_CLIENT_ID', variable: 'UIPATH_CLIENT_ID'),
string(credentialsId: 'UIPATH_CLIENT_SECRET', variable: 'UIPATH_CLIENT_SECRET'),
string(credentialsId: 'UIPATH_TENANT', variable: 'UIPATH_TENANT')
]) {
sh '''#!/usr/bin/env bash
set -euo pipefail
mkdir -p "$NPM_PREFIX"
npm config set prefix "$NPM_PREFIX"
export PATH="$NPM_PREFIX/bin:$PATH"
if ! command -v uip >/dev/null; then
npm install -g "@uipath/cli@${CLI_VERSION}"
fi
uip login \
--client-id env.UIPATH_CLIENT_ID \
--client-secret env.UIPATH_CLIENT_SECRET \
--tenant "$UIPATH_TENANT"
ARTIFACT=$(find "$OUTPUT_DIR" -maxdepth 1 -name "*.zip" | head -1)
uip solution publish "$ARTIFACT"
uip solution deploy run \
--name "${SOLUTION_NAME}-${BUILD_NUMBER}" \
--package-name "$SOLUTION_NAME" \
--package-version "$SOLUTION_VERSION" \
--folder-name MySolution \
--folder-path Shared
'''
}
}
}
stage('Test') {
when {
expression { return env.TEST_SET_KEY?.trim() }
}
agent { label 'linux' }
steps {
withCredentials([
string(credentialsId: 'UIPATH_CLIENT_ID', variable: 'UIPATH_CLIENT_ID'),
string(credentialsId: 'UIPATH_CLIENT_SECRET', variable: 'UIPATH_CLIENT_SECRET'),
string(credentialsId: 'UIPATH_TENANT', variable: 'UIPATH_TENANT'),
string(credentialsId: 'TEST_SET_KEY', variable: 'TEST_SET_KEY'),
string(credentialsId: 'PROJECT_KEY', variable: 'PROJECT_KEY')
]) {
sh '''#!/usr/bin/env bash
set -euo pipefail
mkdir -p "$NPM_PREFIX"
npm config set prefix "$NPM_PREFIX"
export PATH="$NPM_PREFIX/bin:$PATH"
if ! command -v uip >/dev/null; then
npm install -g "@uipath/cli@${CLI_VERSION}"
fi
uip login \
--client-id env.UIPATH_CLIENT_ID \
--client-secret env.UIPATH_CLIENT_SECRET \
--tenant "$UIPATH_TENANT"
EXECUTION_ID=$(uip tm testsets run \
--test-set-key "$TEST_SET_KEY" \
--output-filter "Data.ExecutionId" \
--output plain)
echo "started execution $EXECUTION_ID"
if ! uip tm wait \
--execution-id "$EXECUTION_ID" \
--project-key "$PROJECT_KEY" \
--timeout 1800; then
code=$?
case "$code" in
2) echo "test run did not finish within 30 minutes" >&2; exit 2 ;;
*) echo "wait failed (exit $code)" >&2; exit "$code" ;;
esac
fi
uip tm report get \
--execution-id "$EXECUTION_ID" \
--project-key "$PROJECT_KEY"
FAILED=$(uip tm report get \
--execution-id "$EXECUTION_ID" \
--project-key "$PROJECT_KEY" \
--output-filter "Data.Failed" \
--output plain)
if [ "$FAILED" -gt 0 ]; then
echo "$FAILED test case(s) failed" >&2
exit 1
fi
'''
}
}
}
}
post {
always {
// Best-effort cleanup; uip logout only matters on a persistent agent.
node('linux') {
sh '''
if command -v uip >/dev/null; then
uip logout || true
fi
'''
}
}
}
}
チュートリアル
最上位のセットアップ
- 上部にある
agent noneは、パイプラインに既定のエージェントがないことを宣言しています。各ステージは、agent { label 'linux' }で独自のものを選択します。これにより、ビルドを大容量エージェントに配置し、インフラストラクチャがロックダウンされたエージェントに分散している場合は、そのようにデプロイできます。 options—timestamps()はすべてのコンソール行に[2026-04-24T10:30:12]プレフィックスを追加するため、長時間の実行のデバッグがはるかに簡単になります。disableConcurrentBuilds()、2 つのデプロイが同じ Orchestrator フォルダーに競合することが防止されます。environmentブロック — 他のレシピと同じパターンです: ピンCLI_VERSION、BUILD_NUMBERからSOLUTION_VERSIONを計算し、 npm のグローバルプレフィックスをワークスペースにルーティングするため、インストールはビルドごとに行われ、sudoは必要ありません。
ビルド ステージ
checkout scm— Jenkins は、宣言型パイプラインでこれを明示的に必要とします。- インストール手順 — 他のプラットフォームと同じ
if ! command -v uipガードです。workspace-local npm プレフィックス ($NPM_PREFIX) は、すべてのビルドがクリーンに開始されることを意味します。実行間でキャッシュが行われない。Jenkins エージェントが永続的で、CLI をキャッシュする場合は、ジョブキャッシャープラグインを使用するか、${env.WORKSPACE}ではなくエージェント上のパスにNPM_PREFIXを設定します。 - パックステップ — 明示的なバージョンでストレート
uip solution pack。 stash name: 'solution-zip'— これはジェンキンス特有の作品です。GitHub Actions 成果物や Azure Pipelinespublishとは異なり、stashはパイプラインの実行にスコープが設定され、ワークスペースを保持することなく、ステージ間で存続します。stash は glob (${OUTPUT_DIR}/*.zip) を使用するため、生成したファイル名uip solution pack取得します。.zipを必要とするすべてのステージは、開始時にunstash 'solution-zip'を呼び出します。stash/unstashに関する Jenkins ドキュメントを参照してください。archiveArtifacts—.zipのコピーもビルドページに表示され、人間がダウンロードすることができます。fingerprint: trueを使用すると、Jenkins は複数のジョブにわたって追跡できます。
デプロイ ステージ
unstash 'solution-zip'ワークスペースに.zipを復元します。新しいエージェントと組み合わせることで、「ビルドコンテキスト」と「デプロイコンテキスト」が明確に分離されます。withCredentialsは、3 つの資格情報エントリを、shブロックに表示される環境変数にバインドします。クロージャはクレデンシャルセーフ境界です — 値はコンソールログでマスクされ、このブロックの外側のステップにリークされることはありません。Orchestrator と通信するすべてのuip呼び出しに使用します。uip loginはenv.UIPATH_CLIENT_ID/env.UIPATH_CLIENT_SECRETを使用します —env.VAR_NAMEプレフィックスはwithCredentialsによって設定された変数を読み取ります。「認証 — 環境」を参照してください。VAR_NAMEプレフィックス。シークレットをコマンドラインに直接補間しないでください (--client-secret "$UIPATH_CLIENT_SECRET") — レンダリングされたシェルコマンドに埋め込まれ、一部のログ設定ではコンソール出力に埋め込まれます。- パブリッシュ + デプロイ — その後
uip solution publishuip solution deploy run。--name "${SOLUTION_NAME}-${BUILD_NUMBER}"により、各デプロイを Jenkins ビルドまでさかのぼることができます。
テストステージ
when { expression { return env.TEST_SET_KEY?.trim() } }によるゲート — TEST_SET_KEY資格情報を設定しない (または空のままにする) と、ステージはスキップされます。シェルブロックは、「 方法:CLIからテストを実行する 」 →パターンの検証→待機 する正規の起動です。
uip tm testsets runが起動し、ExecutionIdが返されます。- 実行が終了ステートに達するまでブロック
uip tm wait。waitでは、終了2コードはタイムアウトを意味します(認証の失敗ではなく、ドメイン固有のコードの再利用です)。 uip tm report getData.Failedを読み取り、テストが失敗するとシェルは1終了します。
投稿 { always }
ベストエフォートuip logout一時的なエージェントでは、これは不要です。永続エージェントでは、ワークスペースローカルの .uipath/ フォルダーがクリアされるため、同じワークスペース上の後続のジョブで古いセッションが再利用されません。|| true は、uip がインストールされていない (インストール前にビルドが失敗した) 場合、エラーを飲み込みます。
一般的なバリエーション
エージェントのバリエーション
- Windows エージェント —
shをbatに置き換え、bash スクリプトをcmd.exeまたは PowerShell に変換します。env.プレフィックスとすべてのuipコマンドは同一です。周囲のシェルのみが変更されます。「 UiPath CLI のインストール — Windows」をご覧ください。 - Dockerエージェント —
agent { docker { image 'node:20' } }、エージェント構成がゼロのビルドごとに新しいノードランタイムを提供します。ルートフルイメージにsudo-freeグローバルnpmをインストールする必要がある場合は、args '-u root'を追加します。それ以外の場合は、上記のように NPM プレフィックスを$WORKSPACE/.npm-globalに設定し、特権ダンスをスキップします。 - Kubernetes プラグイン —
node:20コンテナーでポッド テンプレートを使用し、/root/.npm-globalを PVC としてマウントして、ビルド間で CLI をキャッシュします。
環境間でプロモートする
各環境を独自のステージに変換し、同じ stashを再利用します。
stage('Deploy stage') {
agent { label 'linux' }
steps {
unstash 'solution-zip'
withCredentials([string(credentialsId: 'UIPATH_STAGE_CLIENT_ID', variable: 'UIPATH_CLIENT_ID'), ...]) {
sh '...deploy to stage tenant...'
}
}
}
stage('Approval') {
steps {
input message: 'Deploy to production?', ok: 'Deploy'
}
}
stage('Deploy prod') {
agent { label 'linux' }
steps {
unstash 'solution-zip'
withCredentials([string(credentialsId: 'UIPATH_PROD_CLIENT_ID', variable: 'UIPATH_CLIENT_ID'), ...]) {
sh '...deploy to prod tenant...'
}
}
}
stage('Deploy stage') {
agent { label 'linux' }
steps {
unstash 'solution-zip'
withCredentials([string(credentialsId: 'UIPATH_STAGE_CLIENT_ID', variable: 'UIPATH_CLIENT_ID'), ...]) {
sh '...deploy to stage tenant...'
}
}
}
stage('Approval') {
steps {
input message: 'Deploy to production?', ok: 'Deploy'
}
}
stage('Deploy prod') {
agent { label 'linux' }
steps {
unstash 'solution-zip'
withCredentials([string(credentialsId: 'UIPATH_PROD_CLIENT_ID', variable: 'UIPATH_CLIENT_ID'), ...]) {
sh '...deploy to prod tenant...'
}
}
}
input手順では、人間が [デプロイ] をクリックするまでパイプラインを一時停止します。Jenkins の マトリックス承認戦略 を使用して、承認できるユーザーを制限します。「使い方」のより詳細な説明 : ソリューションをパッケージ化してパブリッシュする — 1 つのパッケージを複数のテナントに昇格させます。
ロールバック
パラメーター化されたジョブ ( Jenkins → New Item → Pipeline → を追加します このプロジェクトは、パラメーター (文字列) → "ROLLBACK_VERSION" →パラメーター化され 、保護されたステージを追加します。
stage('Rollback') {
when { expression { return params.ROLLBACK_VERSION?.trim() } }
agent { label 'linux' }
steps {
withCredentials([/* UIPATH_* credentials */]) {
sh '''#!/usr/bin/env bash
set -euo pipefail
# …install + login…
uip solution deploy run \
--name "${SOLUTION_NAME}-rollback" \
--package-name "$SOLUTION_NAME" \
--package-version "$ROLLBACK_VERSION" \
--folder-name MySolution \
--folder-path Shared
'''
}
}
environment {
ROLLBACK_VERSION = "${params.ROLLBACK_VERSION}"
}
}
stage('Rollback') {
when { expression { return params.ROLLBACK_VERSION?.trim() } }
agent { label 'linux' }
steps {
withCredentials([/* UIPATH_* credentials */]) {
sh '''#!/usr/bin/env bash
set -euo pipefail
# …install + login…
uip solution deploy run \
--name "${SOLUTION_NAME}-rollback" \
--package-name "$SOLUTION_NAME" \
--package-version "$ROLLBACK_VERSION" \
--folder-name MySolution \
--folder-path Shared
'''
}
}
environment {
ROLLBACK_VERSION = "${params.ROLLBACK_VERSION}"
}
}
[パラメーターを指定して構築] を使用して [構築] ページからトリガーします。破壊的なロールバック (アンインストール + 成果物の削除) については、「 方法: ソリューションをパックして発行する — ロールバック」を参照してください。
よくある落とし穴
withCredentialsスコーピング。認証情報はクロージャー内でのみ利用可能です。uip loginをwithCredentials内で呼び出し、uip solution publishを外部で呼び出した場合、2 番目のコマンドにはセッションがありません。CLI ブロック全体を 1 つのwithCredentials内に保持します。- エージェントを変更する前に
stashしてください。あるステージで宣言されたstashは、エージェントが切り替わる前にスタッシュ・ステップが完了していた場合にのみ、後のステージで使用できます。Buildステージのシェル ブロックがstashより前に 0 以外から出た場合、後のステージはunstashで失敗します。このレシピのようにstashshブロックの外に置くことで、シェルの結果に関係なく、クリーンなエージェントで動作するようになります。 - 間違ったタイミングで
|| true。postのuip logout || trueは、唯一の障害モードが「uipがインストールされなかった」であるため安全です。初期の段階で|| trueを唐辛子にしないでください—それは本当の失敗を隠します。 shストリクト モードです。shブロックのすべての bash スクリプトを#!/usr/bin/env bashとset -euo pipefailで開始します。既定の Jenkins シェルは/bin/shです。これはpipefailをサポートしていません。スクリプトパターン — 厳密なシェルオプション を参照してください。- Groovyの複数行の文字列。シェル本体にはトリプルシングルクォート文字列 (
'''...''') を優先します —$VARを補間しないため、変数は Groovy ではなく bash で展開されます。これにより、一般的なクラスの「変数が空である」というバグが回避されます。パイプラインのコンパイル時にGroovyに入力させたい値については、${env.SOME_VAR}明示的に使用してください。
参照
- 方法: CI から Orchestrator にデプロイ する — プラットフォームに依存しないガイダンス。
- 方法: ソリューションをパッケージ化してパブリッシュする — バージョン管理とロールバック
- 方法: CLI からテストを実行する — 起動→待機→検証パターン。
- CI/CD レシピ: Azure Pipelines、 GitHub Actions、 GitLab CI — 他のプラットフォームの同じパイプライン。