我尝试在 plantuml 网络服务器上运行以下代码。
@startuml
package "CI/CD and Monitoring System" {
state "CI/CD Pipeline" {
[*] --> Idle
state Idle {
--> Running : Start Build
}
state Running {
--> Completed : Build Successful
--> Failed : Build Failed
}
state Completed {
--> Deployed : Deployment Successful
}
state Failed {
--> RollbackInitiated : Rollback Triggered
}
state RollbackInitiated {
--> Idle : Rollback Completed
}
state "Testing" as Testing {
--> TestingInProgress : Start Testing
}
state TestingInProgress {
--> TestingCompleted : Testing Successful
--> TestingFailed : Testing Failed
}
state TestingCompleted {
--> Deployment
}
state TestingFailed {
--> RollbackInitiated : Rollback Testing
}
state "Deployment" as Deployment {
--> DeploymentInProgress : Start Deployment
}
state DeploymentInProgress {
--> Deployed : Deployment Successful
--> DeploymentFailed : Deployment Failed
}
state DeploymentFailed {
--> RollbackInitiated : Rollback Deployment
}
state Deployed
state "Rollback" as Rollback {
--> Idle : Rollback Completed
}
}
state "Monitoring System" {
[*] --> Monitoring
state Monitoring {
--> AlertTriggered : Anomaly Detected
}
state AlertTriggered {
--> IncidentCreated : Alert Acknowledged
--> AlertResolved : Incident Resolved
}
state IncidentCreated {
--> IncidentResolved : Issue Addressed
}
state AlertResolved {
--> Monitoring : Issue Resolved
}
}
User --> Monitoring
Developer --> CI/CD Pipeline
OperationsTeam --> Monitoring
QualityAssurance --> CI/CD Pipeline
}
@enduml
我期待一个状态图/转换图,但它不断抛出错误:
我尝试使用 chatgpt 寻求帮助,但它不断返回我给它的相同代码。
这段代码有什么问题?
原因是 PlantUML 语法取决于图的类型。
package
允许在用例图、类图、组件图甚至活动图中使用,但不适用于状态图。这是语法上的不一致,但已记录在案(图中未明确允许的内容是禁止的)。
将
package
与状态一起使用将导致 PlanUML 认为您想要混合不同类型的图,这是不允许的,除非您使用 allowmixing
指令:
@startuml
allowmixing
package "CI/CD and Monitoring System" {
state S
usecase X
class Z
}
@enduml
然后你就可以得到一个像这样的打包状态图:
@startuml
allowmixing
package "CI/CD and Monitoring System" {
state "CI/CD Pipeline"
state Running
Running --> Completed : Build Successful
Running --> Failed : Build Failed
state Completed
state Failed
}
@enduml
不幸的是,一旦您在大括号之间使用嵌套状态,
alloxmixing
解决方法就不再起作用。这似乎是一个错误,因为语法错误表明:
@startuml
allowmixing
package "CI/CD and Monitoring System" {
state "CI/CD Pipeline" as s1 {
}
}
@enduml
请注意,对使用长名称命名的状态(在双引号之间)使用花括号需要使用别名。这与包无关,适用于所有状态图。
最后但并非最不重要的一点是,即使您删除了包,状态图中也存在许多语法错误:大括号之间的所有内容都应该是嵌套的。特别地,其中定义的新状态是嵌套状态。其中的转换是嵌套状态之间的内部状态转换。所有状态转换都必须具有
source_state --> target_state
没有源状态的符号 --> target_state
是代码中真正的语法错误。
必要转换的示例(最好在所有转换之前定义顶部的所有状态):
state "CI/CD Pipeline" as s1 {
[*] --> Idle
Idle --> Running : Start Build
state Running
Running --> Completed : Build Successful
Running --> Failed : Build Failed
state Completed
Completed --> Deployed : Deployment Successful
state Failed
Completed --> RollbackInitiated : Rollback Triggered
state RollbackInitiated
RollbackInitiated --> Idle : Rollback Completed
}
state "Monitoring System" as s2 {
}
User --> Monitoring
Developer --> s1
OperationsTeam --> Monitoring
QualityAssurance --> s1