# CI/CD trong Unity

# Tổng quan về CI/CD

### CI (Continuous Integration)

****Khái niệm:****<span style="white-space:pre-wrap;"> Là thực hiện tự động hoá việc tích hợp cấc thay đổi từ một hoặc nhiều vào một kho chứa (repository) chung duy nhất.</span>

****Mục tiêu:****<span style="white-space:pre-wrap;"> Tự động hoá một quy trình khi developer commit và push code lên repository. Quy trình này thường bao gồm:</span>  
<span style="white-space:pre-wrap;">- </span>****Checkout code:****<span style="white-space:pre-wrap;"> Lấy mã nguồn mới nhất</span>  
<span style="white-space:pre-wrap;">- </span>****Build:****<span style="white-space:pre-wrap;"> Build thành file sản phẩm có thể chạy được (apk, exe,...)</span>  
<span style="white-space:pre-wrap;">- </span>****Test:****<span style="white-space:pre-wrap;"> Chạy kiểm thử để đảm bảo các thay đổi không gây ra lỗi.</span>

****Lợi ích:****<span style="white-space:pre-wrap;"> Phát hiện sớm các xung đột và lỗi tích hợp, đảm bảo code ở nhánh chính luôn ở trạng thái ổn định và có thể build được.</span>

### CD (Continuous Delivery/Deployment)

****Khái niệm:****<span style="white-space:pre-wrap;"> Mở rộng từ CI, CD là tự động hoá việc phát hành phầm mềm đã được build và kiểm tử thành công. CD có 2 khái niệm con:</span>  
<span style="white-space:pre-wrap;">- </span>****Continuous Delivery:****<span style="white-space:pre-wrap;"> Sau khi CI thành công. Sản phẩm sẽ được tự động đóng gói và chuẩn bị sẵn sàng cho triển khai ra môi trường thực tế. Tuy nhiên, bước triển khai ra môi trường thực tếcần có sự phê duyệt thủ công.</span>  
<span style="white-space:pre-wrap;">- </span>****Continuous Deployment:**** Hệ thống tự động triển khai phiên bản build thành công ra môi trường production màkhông cần phê duyệt thủ công.

****Mục tiêu:****Giảm thiểu rủi ro và công sứctrong quá trình phát triển sản phẩm. Đảm bảo mọi bản build thành công đều có thể đượcphát hành một cách nhanh chóng và đáng tin cậy.

****Lợi ích:****Tăng tốcphát triển tính năng và bản vá lỗi tới người dùng,giảm thiểu lỗido con người trong quá trình phát triển thủ công.

### Tại sao cần CI/CD

Phát triển game với Unity có những đặc thù kiến CI/CD trở nên cực kỳ hữu ích:  
<span style="white-space:pre-wrap;">- </span>****Tối ưu thời gian:**** Với những dự án lớn, nhiều assets thường sẽ mất nhiều thời gian để build. Việc tự động hoá giúp giải phóng máy tính của developer, build bằng các máy chuyên dụng.  
<span style="white-space:pre-wrap;">- </span>****Build đa nền tảng:**** Unity hỗ trợ build đa nền tảng. CI/CD cho phép tự động hoá việc build cho tất cả các nền tảng một cách nhất quán.  
<span style="white-space:pre-wrap;">- </span>****Quản lý môi trường build:****<span style="white-space:pre-wrap;"> Mỗi nền tảng yêu cầu các SDK và cấu hình môi trường riêng. CI/CD giúp đảm bảo môi trường build luôn được thiết lập đúng và nhất quán.</span>  
<span style="white-space:pre-wrap;">- </span>****Đảm bảo chất lượng:****<span style="white-space:pre-wrap;"> Tự động chạy Unity Test Framework trong pipeline CI giúp phát hiện lỗi sớm hơn.</span>  
<span style="white-space:pre-wrap;">- </span>****Cải thiện sự hợp tác:****<span style="white-space:pre-wrap;"> Đảm bảo rằng mọi thành viên trong team luôn làm việc trên một code base có thể build được và đã qua kiểm thử cơ bản.</span>  
<span style="white-space:pre-wrap;">- </span>****Phát hành nhanh chóng và nhất quán:****<span style="white-space:pre-wrap;"> Tự động hoá việc tạp các bản build cho QA, beta testers hoặc phát hành chính thức lên các cửa hàng ứng dụng.</span>

### Các thành phần của hệ thống CI/CD cho Unity.

<span style="white-space:pre-wrap;">- </span>****Version Control System:****<span style="white-space:pre-wrap;"> Hệ thống quản lý phiên bản (GitHub, Gitlab, Bitbucket...). Đây là nơi lưu trữ code cũng như điểm khởi đầu để kích hoạt pipeline CI/CD/</span>  
****- CI/CD platform:****<span style="white-space:pre-wrap;"> Dịch vụ hoặc phần mềm điều phối toàn bộ quy trình (Jenkins, Gitlab CI/CD, Github Action, Unity Cloud Build, Azure DevOps...)</span>  
<span style="white-space:pre-wrap;">- </span>****Build Agent/Runner:****<span style="white-space:pre-wrap;"> Máy tính (vật lý hoặc ảo) được cài đặt Unity Editor, các SDK cần thiết và phần mềm của CI/CD platform để thực thi các công việc build và test.</span>  
<span style="white-space:pre-wrap;">- </span>****Testing Framework:****<span style="white-space:pre-wrap;"> Unity Test Framework để viết test và chạy các bài kiểm thử tự động.</span>  
<span style="white-space:pre-wrap;">- </span>****Artifact Storage****: Nơi lưu trữ các sản phẩm được build.

# Chuẩn bị hệ thống cho CI/CD

### Version Control System

Sử dụng các hệ thống quản lý source code thông thường như GitHub, Gitlab.

### CI/CD platform

#### Options

****Cloud-based:****  
<span style="white-space:pre-wrap;">– </span>****Github Actions****: Hệ thống CI/CD của Github (free 2000min/month)  
<span style="white-space:pre-wrap;">– </span>****Gitlab CI/CD****: Hệ thống CI/CD của Gitlab (free 400min/month)  
<span style="white-space:pre-wrap;">– </span>****Azure DevOps****: Hệ thống CI/CD của Microsoft tương thích với các hệ thống sử dụng hệ sinh thái Azure (free 1800min/month)  
<span style="white-space:pre-wrap;">– </span>****Unity Cloud Build****: Hệ thống CI/CD của chính Unity (free 200min/month

****Self-hosted****  
****– Gitlab****  
****– Azure****  
****– Jenkins****

#### Choice

<span style="white-space:pre-wrap;">Lựa chọn sử dụng self-hosted với </span>****Jenkins****.

Lý do:  
– Mã nguồn mở, miễn phí.  
– Là công cụ phổ biến =&gt; cộng đồng lớn =&gt; nhiều hỗ trợ.  
– Khả năng mở rộng cao (Hỗ trợ nhiều plugins)  
– Hỗ trợ đa nền tảng.  
****– Có thể cài trên Docker, tận dụng hệ thống XPEnology có sẵn.****

### Build Agent/Runner

Sử dụng máy tính chạy Windows 10, Macbook Air M1 có sẵn.

### Testing Framework

Unity Test Framework (chưa sử dụng – có thể tích hợp sau)

### Artifact Strorage

Sử dụng Synology Drive có sẵn và Google Drive.

# Cài đặt Jenkins Master trên Docker

Jenkins này được cài đặt trên Docker trên server XPEnology.

### Step 1: Cài đặt Jenkins.

Lần 1 mình có cài trực tiếp thông qua Container Manager trên DSM nhưng sau khi cài xong không thể truy cập đến Container đang chạy.

Lần 2 cài thông qua lệnh docker run sau đây  
`<span class="editor-theme-code">docker run \</span>`  
`<span class="editor-theme-code">  --name Jenkins-Controller \</span>`  
`<span class="editor-theme-code">  --detach \</span>`  
**`<strong class="editor-theme-bold editor-theme-code">--volume /volume1/docker/Jenkins:/var/jenkins \</strong>`**  
`<span class="editor-theme-code">  --publish 8080:8080 \</span>`  
`<span class="editor-theme-code">--publish 50000:50000 \</span>`  
`<span class="editor-theme-code">  jenkins/jenkins:lts-jdk21</span>`

**Đặc biệt**, dòng lệnh “`<span class="editor-theme-code">--volume /volume1/docker/Jenkins:/var/jenkins \</span>`<span style="white-space:pre-wrap;">” dùng để ánh xạ thư mục host và container. Đảm bảo mọi dữ liệu của Jenkins được lưu trữ vào thư mục </span>`<span class="editor-theme-code">/volume1/docker/Jenkins</span>`<span style="white-space:pre-wrap;"> trên DSM và sẽ không bị mất đi khi container dừng hoặc xoá.</span>

### Step 2: Cài đặt Plugin

<span style="white-space:pre-wrap;">Tại đây do chưa tìm hiểu được để cấu hình CI/CD cho Unity cần những plugin nào nên mình chọn </span>**“Install suggested plugins”**.

Các plugin cần thiết có thể cài đặt sau.

Đã cài thêm  
<span style="white-space:pre-wrap;">– </span>**Blue Ocean:**<span style="white-space:pre-wrap;"> Một giao diện hiện đại, trực quan, giúp dễ dàng quản lý và sử dụng Jenkins</span>  
<span style="white-space:pre-wrap;">– </span>**Email Extension:**<span style="white-space:pre-wrap;"> Gửi email thông báo.</span>  
<span style="white-space:pre-wrap;">– </span>**Discord Notify:**<span style="white-space:pre-wrap;"> Gửi thông báo qua discord.</span>

### Step 3: Cài đặt Jenkins URL

Tạo chứng chỉ SSL  
<span style="white-space:pre-wrap;">– Trên DSM truy cập </span>**Control Panel -&gt; Security -&gt; Certificate.**  
<span style="white-space:pre-wrap;">– Tạo một Certificate mới với domain name là tên miền muốn tạo certificate (ở đây là </span>`<span class="editor-theme-code">jenkins.thanhdv.com</span>`).

<span style="white-space:pre-wrap;">Tạo Reverse Proxy để xử lý truy cập. Cho phép truy cập qua </span>`<span class="editor-theme-code">jenkins.thanhdv.com</span>`<span style="white-space:pre-wrap;"> thay vì </span>`<span class="editor-theme-code">thanhdv.com:8080</span>`  
<span style="white-space:pre-wrap;">– Trên DSM truy cập </span>**Control Panel -&gt; Login Portal -&gt; Advanced -&gt; Reverse Proxy**<span style="white-space:pre-wrap;"> và tạo mới.</span>  
– General:  
\+ Description: Đặt tên gợi nhớ, mô tả (ở đây mình đặt là Jenkins)  
– Source (Setup cho truy cập từ bên ngoài)  
\+ Protocol: HTTPS  
\+ Hostname: jenkins.thanhdv.com  
\+ Port: 443  
\+ Enable HSTS: Bật để tăng bảo mật.  
– Destination  
\+ Protocol: HTTP (vì Jenkins trong docker đang chạy HTTP)  
\+ Hostname: localhost  
\+ Port: 8080 (8080 là mặc định. Nếu thay bằng port được setup trong lúc cài đặt Container).

Gán chứng chỉ cho Reverse Proxy  
<span style="white-space:pre-wrap;">– Quay lại </span>**Control Panel -&gt; Security -&gt; Certificate.**  
– Config chứng chỉ jenkins.thanhdv.com đã tạo ở trên cho dịch vụ jenkins.thanhdv.com.

<span style="white-space:pre-wrap;">Điền </span>`<span class="editor-theme-code">https://jenkins.thanhdv.com</span>`<span style="white-space:pre-wrap;"> vào </span>**Jenkins URL**<span style="white-space:pre-wrap;"> nếu đang trong quá trình cài đặt ban đầu hoặc truy cập </span>**Manage Jenkins -&gt; System -&gt; Jenkins Location -&gt; Jenkins URL**

# Cài đặt Jenkins Agent trên Windows 10

### Step 1: Cài đặt phần mềm cần thiết

****JDK:****<span style="white-space:pre-wrap;"> JDK là cần thiết để chạy tiến trình của Jenkins Agent. Tại đây mình sử dụng JDK 21.</span>

****Git****: Git để cập nhật code tử các repo

****VSCode****: Code editor để sửa code nếu cần thiết.

****Unity****: UnityHub, Unity Editor, và các module cần thiết

Và cuối cùng là tạo thư mục làm việc riêng cho JenkinsAgent (ở đây là C:\\JenkinsAgent)

### Step 2: Tạo Node Agent trong Jenkins Controller

<span style="white-space:pre-wrap;">Truy cập </span>****Manage****<span style="white-space:pre-wrap;"> </span>****Jenkins -&gt; Nodes****<span style="white-space:pre-wrap;"> và tạo một Node mới.</span>

****Lưu ý:****  
<span style="white-space:pre-wrap;">– </span>****Permanent Agent**** phù hợp với case hiện có. Tức là một agent luôn sẵn sàng. Để phân biệt với Dynamic Agents.  
<span style="white-space:pre-wrap;">– </span>****Number of executors:****<span style="white-space:pre-wrap;"> số lượng build đồng thời có thể chạy trên agent.</span>  
<span style="white-space:pre-wrap;">– </span>****Remote root directory:****<span style="white-space:pre-wrap;"> đường dẫn đến thư mục làm việc đã tạo ở bước trên </span>`<span class="editor-theme-code">C:\JenkinsAgent</span>`.  
<span style="white-space:pre-wrap;">– </span>****Labels****: Nhãn phân loại các agent. Sau này trong Jenkins file sẽ dùng label để chị định job chạy trên agent nào (`<span class="editor-theme-code">agent { label 'windows && unity' }</span>`)  
<span style="white-space:pre-wrap;">– </span>****Usage****<span style="white-space:pre-wrap;"> là cách Jenkins lên lịch sử dụng agent này.</span>  
<span style="white-space:pre-wrap;">– </span>****Launch method:****<span style="white-space:pre-wrap;"> phương thức kết nối.</span>  
<span style="white-space:pre-wrap;">– </span>****Availability****: Kiểm soát khi nào Jenkins bắt đầu, kết thúc agent này.

### Step 3: Kết nối Agent

<span style="white-space:pre-wrap;">Truy cập vào node vừa tạo thông qua </span>****Manage****<span style="white-space:pre-wrap;"> </span>****Jenkins -&gt; Nodes****<span style="white-space:pre-wrap;"> ta sẽ thấy hướng dẫn kết nối bằng command line.</span>

Chọn command line phù hợp rồi chạy trên máy Agent qua cmd.

Khi chạy lệnh “`<span class="editor-theme-code">curl.exe -sO https://jenkins.thanhdv.com/jnlpJars/agent.jar & java -jar agent.jar -url https://jenkins.thanhdv.com/ -secret 73a6b19....e63df7 -name "Unity-WindowsAgent" -webSocket -workDir "C:\JenkinsAgent"</span>`<span style="white-space:pre-wrap;">” gặp lỗi không thể kết nối do truy cập thông qua reverse proxy. Để khắc phục thì không truy cập thông qua reverse proxy nữa mà truy cập qua port như thông thường. Thay </span>`<span class="editor-theme-code">https://jenkins.thanhdv.com</span>`<span style="white-space:pre-wrap;"> bằng </span>`<span class="editor-theme-code">http://thanhdv.com:8080</span>`

Lệnh chính xác cần chạy là  
`<span class="editor-theme-code">curl.exe -sO http://thanhdv.com:8080/jnlpJars/agent.jar & java -jar agent.jar -url http://thanhdv.com:8080/ -secret 73a6b193f2a487ccf1ccf5b494691be0319371e44ed67c4bab29835363e63df7 -name "Unity-WindowsAgent" -webSocket -workDir "C:\JenkinsAgent"</span>`

### Step 4: Chạy JenkinsAgent như một service của Windows (tuỳ chọn)

<span style="white-space:pre-wrap;">Lệnh trên chỉ chạy khi cửa sổ cmd đang bật gây bất tiện. Thế nên để sử dụng một cách thuận thiện hơn mình sẽ cài đặt nó như một service sử dụng </span>****WinSW****

Tải WinSW trên Github và lưu vào folder của Jenkins Agent (C:\\JenkinsAgent)  
<span style="white-space:pre-wrap;">Đổi tên file sao cho có ý nghĩa, ví dụ như </span>`<span class="editor-theme-code">jenkins-agent.exe</span>`

<span style="white-space:pre-wrap;">Tải file agent.jar qua đường dẫn trên </span>`<span class="editor-theme-code">http://thanhdv.com:8080/jnlpJars/agent.jar</span>`<span style="white-space:pre-wrap;"> có thể thấy ở command line. Lưu vào cùng thư mục làm việc với WinSW</span>

Tạo file xml với nội dung như sau:  
`<span class="editor-theme-code"><service></span>`  
`<span class="editor-theme-code">  <id>JenkinsAgentUnityWin</id> <name>Jenkins Agent (Unity Windows)</name> <description>Chạy Jenkins agent để build Unity trên máy Windows này, kết nối tới Jenkins Controller.</description></span>`  
`<span class="editor-theme-code">  <executable>%JAVA_HOME%\bin\java.exe</executable></span>`  
`<span class="editor-theme-code">  <arguments>-Xmx512m -jar agent.jar -url http://thanhdv.com:8080/ -secret 73a6b193f2a487ccf1ccf5b494691be0319371e44ed67c4bab29835363e63df7 -name "Unity-WindowsAgent" -webSocket -workDir "C:\JenkinsAgent"</arguments></span>`  
`<span class="editor-theme-code">  <log mode="roll-by-size"></span>`  
`<span class="editor-theme-code">    <sizeThreshold>10240</sizeThreshold> <keepFiles>5</keepFiles> </log></span>`  
`<span class="editor-theme-code">  <workingdirectory>C:\JenkinsAgent</workingdirectory></span>`  
`<span class="editor-theme-code"></service></span>`  
  
Lưu ý:  
File xml cần đặt tên giống với file exe phía trên (chỉ khác phần mở rộng xml và exe).  
**`<strong class="editor-theme-bold editor-theme-code"><executable></strong>`**<span style="white-space:pre-wrap;"> là đường dẫn đến java.exe. Nếu chưa có biến môi trường JAVA\_HOME thì cần thêm vào trong Windows.</span>  
**`<strong class="editor-theme-bold editor-theme-code"><arguments></strong>`**<span style="white-space:pre-wrap;"> chứa đầy đủ các tham số trên command line. Phần từ phía sau ký tự &amp;</span>  
**`<strong class="editor-theme-bold editor-theme-code"><workingdirectory></strong>`**<span style="white-space:pre-wrap;"> là đường dẫn đến thư mục làm việc của Jenkins Agent.</span>

Cài đặt service  
– Mở cmd trong cửa sổ thư mục của JenkinsAgent hoặc dùng lệnh cd để chuyển đến thư mục làm việc của JenkinsAgent  
<span style="white-space:pre-wrap;">– Chạy lệnh </span>`<span class="editor-theme-code">.\jenkins-agent.exe install</span>`<span style="white-space:pre-wrap;"> để cài đặt.</span>  
<span style="white-space:pre-wrap;">– Chạy tiếp lệnh </span>`<span class="editor-theme-code">.\jenkins-agent.exe start</span>`<span style="white-space:pre-wrap;"> để chạy service (Hoặc chạy trong của sổ services.msc tìm tới tên service </span>`<span class="editor-theme-code">Jenkins Agent (Unity Windows)</span>`<span style="white-space:pre-wrap;"> setup trong file xml)</span>  
– Kiểm tra trên Jenkins (****Manage Jenkins****<span style="white-space:pre-wrap;"> -&gt; </span>****Nodes****) nếu thấy nodes online tức là đã thành công.  
<span style="white-space:pre-wrap;">– Setup service auto restart. Trong cửa sổ </span>****services.msc -&gt; Recovery****. Chuyển tất cả các trường “****First failure****“, “****Second failure****“, “****Subsequent failures****” thành “****Restart the Service****“

****Lưu ý:****  
<span style="white-space:pre-wrap;">– Gỡ cài đặt service bằng lệnh </span>`<span class="editor-theme-code">.\jenkins-agent.exe uninstall</span>`  
– Nếu chạy service gặp lỗi có thể kiểm tra các file log trong thư mục cài đặt của service (trong trường hợp này là C:\\JenkinsAgent)

# Cài đặt Jenkins Agent trên Proxmox VE

### Step 1: Khởi tạo Container

- <span style="white-space:pre-wrap;">Tải template: Trên PVE tải template </span>**Ubuntu 24.04**[![image.png](https://knowledge.thanhdv.com/uploads/images/gallery/2026-01/scaled-1680-/image.png)](https://knowledge.thanhdv.com/uploads/images/gallery/2026-01/image.png)
- Tại CT với template Ubuntu vừa tải về
    - CPU: 2 - 4 core
    - RAM: 2048 MB (Swap 512 MB)
    - Disk: 16GB (có thể mở rộng thêm nếu cần)
    - <span style="white-space:pre-wrap;">Network: sử dụng </span>**Static IP**<span style="white-space:pre-wrap;"> dạng 192.168.1.100/24 (</span>**nhớ điền Gateway**<span style="white-space:pre-wrap;"> 192.168.1.1)</span>
- Ok, Create and Start container vừa tạo.

### Step 2: Thiết lập môi trường cho Agent

Đăng nhập vào Agent với quyền root và mật khẩu đã tạo.

- Cài đặt các tools cần thiết:
    - `<span class="editor-theme-code">apt update && apt upgrade -y // Update các package đã có trong hệ thống.</span>`
    - `<span class="editor-theme-code">apt install openjdk-17-jdk git curl -y // Cài đặt JDK, Git, curl</span>`
- Tạo user riêng cho jenkins
    - `<span class="editor-theme-code">adduser jenkins // Tạo user tên là jenkins</span>`
- <span style="white-space:pre-wrap;">Tạo thư mục làm việc và cấp quyền cho </span>`<span class="editor-theme-code">jenkins</span>`
    - `<span class="editor-theme-code">mkdir -p /var/jenkins_home // Tạo thư mục jenkins_home </span>`
    - `<span class="editor-theme-code">chown -R jenkins:jenkins /var/jenkins_home // Cấp quyền cho user jenkins</span>`
- Chuyển SSH từ Socket sang Service (Mặc định SSH sẽ ở socket, chỉ hoạt động khi có yêu cầu. Để tránh gặp lỗi trong quá trình tự động thì nên chuyển sang Service)
    - `<span class="editor-theme-code">systemctl stop ssh.socket </span>`  
        `<span class="editor-theme-code">systemctl disable ssh.socket </span>`  
        `<span class="editor-theme-code">systemctl enable ssh.service </span>`  
        `<span class="editor-theme-code">systemctl start ssh.service</span>`

### Step 3: Thiết lập SSH Key

Tạo SSH Key để Jenkins Master có thể ra lệnh cho Agent mà không cần nhập mật khẩu mỗi khi cần build.

```sh
# Chuyển sang user jenkins
su - jenkins
# Tạo key (không đặt passphrase)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa

# Tự cấp quyền cho chính mình (Authorized Keys)
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

# Hiển thị Private Key để copy vào Jenkins Master
cat id_rsa
```

### Step 4: Tạo Node mới trên Jenkins Master

- <span style="white-space:pre-wrap;">Tạo Credentials mới loại </span>**SSH Username with private key**<span style="white-space:pre-wrap;"> với Private Key vừa lấy ở bước trên.</span>
    - Chú ý domain là global
- Tạo Node. Jenkins Master &gt; Manage Jenkins &gt; Node &gt; New Node
    - **Remote root directory**<span style="white-space:pre-wrap;">: </span>`<span class="editor-theme-code">/var/jenkins_home</span>`<span style="white-space:pre-wrap;"> (thư mục làm việc đã tạo ở trên)</span>
    - **Label**: label bất kỳ để dùng trong jenkinsfile.
    - **Host**: IP của Agent đã tạo ở Bước 1.
    - **Host Key Verification Strategy:**<span style="white-space:pre-wrap;"> Chọn </span>**"Non-verifying Verification Strategy"**.
- Ok tạo Node. Nếu có respond như hình thì tức là đã tạo và kết nối thành công. Nếu không thì kiểm tra log để biết vấn đề.[![image.png](https://knowledge.thanhdv.com/uploads/images/gallery/2026-01/scaled-1680-/nHBimage.png)](https://knowledge.thanhdv.com/uploads/images/gallery/2026-01/nHBimage.png)

### Step 5: Update Jenkinsfile

- Thay đổi chính so với Agent Windows:
    - `<span class="editor-theme-code">bat</span>`<span style="white-space:pre-wrap;"> &gt; </span>`<span class="editor-theme-code">sh</span>`
    - `<span class="editor-theme-code">del /F /Q</span>`<span style="white-space:pre-wrap;"> &gt; </span>`<span class="editor-theme-code">rm -f</span>`