feat: preset script for backup files on deployment to local and ssh

This commit is contained in:
Fu Diwei 2025-03-20 23:35:37 +08:00
parent da6526d5fa
commit 02f806ab99
4 changed files with 111 additions and 17 deletions

View File

@ -134,7 +134,24 @@ const DeployNodeConfigFormLocalConfig = ({ form: formInst, formName, disabled, i
} }
}; };
const handlePresetScriptClick = (key: string) => { const handlePresetPreScriptClick = (key: string) => {
switch (key) {
case "backup_files":
{
formInst.setFieldValue("shellEnv", SHELLENV_SH);
formInst.setFieldValue(
"preCommand",
`# 请将以下路径替换为实际值
cp "${formInst.getFieldValue("certPath")}" "${formInst.getFieldValue("certPath")}.bak" 2>/dev/null || :
cp "${formInst.getFieldValue("keyPath")}" "${formInst.getFieldValue("keyPath")}.bak" 2>/dev/null || :
`.trim()
);
}
break;
}
};
const handlePresetPostScriptClick = (key: string) => {
switch (key) { switch (key) {
case "reload_nginx": case "reload_nginx":
{ {
@ -149,8 +166,8 @@ const DeployNodeConfigFormLocalConfig = ({ form: formInst, formName, disabled, i
formInst.setFieldValue( formInst.setFieldValue(
"postCommand", "postCommand",
`# 请将以下变量替换为实际值 `# 请将以下变量替换为实际值
$pfxPath = "<your-pfx-path>" # PFX $pfxPath = "${formInst.getFieldValue("certPath")}" # PFX
$pfxPassword = "<your-pfx-password>" # PFX $pfxPassword = "${formInst.getFieldValue("pfxPassword")}" # PFX
$siteName = "<your-site-name>" # IIS $siteName = "<your-site-name>" # IIS
$domain = "<your-domain-name>" # $domain = "<your-domain-name>" #
$ipaddr = "<your-binding-ip>" # IP* IP $ipaddr = "<your-binding-ip>" # IP* IP
@ -186,8 +203,8 @@ Remove-Item -Path "$pfxPath" -Force
formInst.setFieldValue( formInst.setFieldValue(
"postCommand", "postCommand",
`# 请将以下变量替换为实际值 `# 请将以下变量替换为实际值
$pfxPath = "<your-pfx-path>" # PFX $pfxPath = "${formInst.getFieldValue("certPath")}" # PFX
$pfxPassword = "<your-pfx-password>" # PFX $pfxPassword = "${formInst.getFieldValue("pfxPassword")}" # PFX
$ipaddr = "<your-binding-ip>" # IP0.0.0.0 IP $ipaddr = "<your-binding-ip>" # IP0.0.0.0 IP
$port = "<your-binding-port>" # $port = "<your-binding-port>" #
@ -208,14 +225,15 @@ Remove-Item -Path "$pfxPath" -Force
); );
} }
break; break;
case "binding_rdp": case "binding_rdp":
{ {
formInst.setFieldValue("shellEnv", SHELLENV_POWERSHELL); formInst.setFieldValue("shellEnv", SHELLENV_POWERSHELL);
formInst.setFieldValue( formInst.setFieldValue(
"postCommand", "postCommand",
`# 请将以下变量替换为实际值 `# 请将以下变量替换为实际值
$pfxPath = "<your-pfx-path>" # PFX $pfxPath = "${formInst.getFieldValue("certPath")}" # PFX
$pfxPassword = "<your-pfx-password>" # PFX $pfxPassword = "${formInst.getFieldValue("pfxPassword")}" # PFX
# #
$cert = Import-PfxCertificate -FilePath "$pfxPath" -CertStoreLocation Cert:\\LocalMachine\\My -Password (ConvertTo-SecureString -String "$pfxPassword" -AsPlainText -Force) -Exportable $cert = Import-PfxCertificate -FilePath "$pfxPath" -CertStoreLocation Cert:\\LocalMachine\\My -Password (ConvertTo-SecureString -String "$pfxPassword" -AsPlainText -Force) -Exportable
@ -332,9 +350,37 @@ Set-ItemProperty -Path $rdpCertPath -Name "SSLCertificateSHA1Hash" -Value "$thum
</Select> </Select>
</Form.Item> </Form.Item>
<Form.Item name="preCommand" label={t("workflow_node.deploy.form.local_pre_command.label")} rules={[formRule]}> <Form.Item className="mb-0">
<label className="mb-1 block">
<div className="flex w-full items-center justify-between gap-4">
<div className="max-w-full grow truncate">
<span>{t("workflow_node.deploy.form.local_pre_command.label")}</span>
</div>
<div className="text-right">
<Dropdown
menu={{
items: [
{
key: "backup_files",
label: t("workflow_node.deploy.form.local_preset_scripts.option.backup_files.label"),
onClick: () => handlePresetPreScriptClick("backup_files"),
},
],
}}
trigger={["click"]}
>
<Button size="small" type="link">
{t("workflow_node.deploy.form.local_preset_scripts.button")}
<DownOutlinedIcon />
</Button>
</Dropdown>
</div>
</div>
</label>
<Form.Item name="preCommand" rules={[formRule]}>
<Input.TextArea autoSize={{ minRows: 1, maxRows: 5 }} placeholder={t("workflow_node.deploy.form.local_pre_command.placeholder")} /> <Input.TextArea autoSize={{ minRows: 1, maxRows: 5 }} placeholder={t("workflow_node.deploy.form.local_pre_command.placeholder")} />
</Form.Item> </Form.Item>
</Form.Item>
<Form.Item className="mb-0"> <Form.Item className="mb-0">
<label className="mb-1 block"> <label className="mb-1 block">
@ -349,22 +395,22 @@ Set-ItemProperty -Path $rdpCertPath -Name "SSLCertificateSHA1Hash" -Value "$thum
{ {
key: "reload_nginx", key: "reload_nginx",
label: t("workflow_node.deploy.form.local_preset_scripts.option.reload_nginx.label"), label: t("workflow_node.deploy.form.local_preset_scripts.option.reload_nginx.label"),
onClick: () => handlePresetScriptClick("reload_nginx"), onClick: () => handlePresetPostScriptClick("reload_nginx"),
}, },
{ {
key: "binding_iis", key: "binding_iis",
label: t("workflow_node.deploy.form.local_preset_scripts.option.binding_iis.label"), label: t("workflow_node.deploy.form.local_preset_scripts.option.binding_iis.label"),
onClick: () => handlePresetScriptClick("binding_iis"), onClick: () => handlePresetPostScriptClick("binding_iis"),
}, },
{ {
key: "binding_netsh", key: "binding_netsh",
label: t("workflow_node.deploy.form.local_preset_scripts.option.binding_netsh.label"), label: t("workflow_node.deploy.form.local_preset_scripts.option.binding_netsh.label"),
onClick: () => handlePresetScriptClick("binding_netsh"), onClick: () => handlePresetPostScriptClick("binding_netsh"),
}, },
{ {
key: "binding_rdp", key: "binding_rdp",
label: t("workflow_node.deploy.form.local_preset_scripts.option.binding_rdp.label"), label: t("workflow_node.deploy.form.local_preset_scripts.option.binding_rdp.label"),
onClick: () => handlePresetScriptClick("binding_rdp"), onClick: () => handlePresetPostScriptClick("binding_rdp"),
}, },
], ],
}} }}

View File

@ -127,7 +127,23 @@ const DeployNodeConfigFormSSHConfig = ({ form: formInst, formName, disabled, ini
} }
}; };
const handlePresetScriptClick = (key: string) => { const handlePresetPreScriptClick = (key: string) => {
switch (key) {
case "backup_files":
{
formInst.setFieldValue(
"preCommand",
`# 请将以下路径替换为实际值
cp "${formInst.getFieldValue("certPath")}" "${formInst.getFieldValue("certPath")}.bak" 2>/dev/null || :
cp "${formInst.getFieldValue("keyPath")}" "${formInst.getFieldValue("keyPath")}.bak" 2>/dev/null || :
`.trim()
);
}
break;
}
};
const handlePresetPostScriptClick = (key: string) => {
switch (key) { switch (key) {
case "reload_nginx": case "reload_nginx":
{ {
@ -228,9 +244,37 @@ const DeployNodeConfigFormSSHConfig = ({ form: formInst, formName, disabled, ini
<Select options={[{ value: t("workflow_node.deploy.form.ssh_shell_env.value") }]} value={t("workflow_node.deploy.form.ssh_shell_env.value")} /> <Select options={[{ value: t("workflow_node.deploy.form.ssh_shell_env.value") }]} value={t("workflow_node.deploy.form.ssh_shell_env.value")} />
</Form.Item> </Form.Item>
<Form.Item name="preCommand" label={t("workflow_node.deploy.form.ssh_pre_command.label")} rules={[formRule]}> <Form.Item className="mb-0">
<label className="mb-1 block">
<div className="flex w-full items-center justify-between gap-4">
<div className="max-w-full grow truncate">
<span>{t("workflow_node.deploy.form.ssh_pre_command.label")}</span>
</div>
<div className="text-right">
<Dropdown
menu={{
items: [
{
key: "backup_files",
label: t("workflow_node.deploy.form.ssh_preset_scripts.option.backup_files.label"),
onClick: () => handlePresetPreScriptClick("backup_files"),
},
],
}}
trigger={["click"]}
>
<Button size="small" type="link">
{t("workflow_node.deploy.form.ssh_preset_scripts.button")}
<DownOutlinedIcon />
</Button>
</Dropdown>
</div>
</div>
</label>
<Form.Item name="preCommand" rules={[formRule]}>
<Input.TextArea autoSize={{ minRows: 1, maxRows: 5 }} placeholder={t("workflow_node.deploy.form.ssh_pre_command.placeholder")} /> <Input.TextArea autoSize={{ minRows: 1, maxRows: 5 }} placeholder={t("workflow_node.deploy.form.ssh_pre_command.placeholder")} />
</Form.Item> </Form.Item>
</Form.Item>
<Form.Item className="mb-0"> <Form.Item className="mb-0">
<label className="mb-1 block"> <label className="mb-1 block">
@ -245,7 +289,7 @@ const DeployNodeConfigFormSSHConfig = ({ form: formInst, formName, disabled, ini
{ {
key: "reload_nginx", key: "reload_nginx",
label: t("workflow_node.deploy.form.ssh_preset_scripts.option.reload_nginx.label"), label: t("workflow_node.deploy.form.ssh_preset_scripts.option.reload_nginx.label"),
onClick: () => handlePresetScriptClick("reload_nginx"), onClick: () => handlePresetPostScriptClick("reload_nginx"),
}, },
], ],
}} }}

View File

@ -372,6 +372,7 @@
"workflow_node.deploy.form.local_post_command.label": "Post-command (Optional)", "workflow_node.deploy.form.local_post_command.label": "Post-command (Optional)",
"workflow_node.deploy.form.local_post_command.placeholder": "Please enter command to be executed after saving files", "workflow_node.deploy.form.local_post_command.placeholder": "Please enter command to be executed after saving files",
"workflow_node.deploy.form.local_preset_scripts.button": "Use preset scripts", "workflow_node.deploy.form.local_preset_scripts.button": "Use preset scripts",
"workflow_node.deploy.form.local_preset_scripts.option.backup_files.label": "POSIX Bash - Backup certificate files",
"workflow_node.deploy.form.local_preset_scripts.option.reload_nginx.label": "POSIX Bash - Reload nginx", "workflow_node.deploy.form.local_preset_scripts.option.reload_nginx.label": "POSIX Bash - Reload nginx",
"workflow_node.deploy.form.local_preset_scripts.option.binding_iis.label": "PowerShell - Binding IIS", "workflow_node.deploy.form.local_preset_scripts.option.binding_iis.label": "PowerShell - Binding IIS",
"workflow_node.deploy.form.local_preset_scripts.option.binding_netsh.label": "PowerShell - Binding netsh", "workflow_node.deploy.form.local_preset_scripts.option.binding_netsh.label": "PowerShell - Binding netsh",
@ -423,6 +424,7 @@
"workflow_node.deploy.form.ssh_post_command.label": "Post-command (Optional)", "workflow_node.deploy.form.ssh_post_command.label": "Post-command (Optional)",
"workflow_node.deploy.form.ssh_post_command.placeholder": "Please enter command to be executed after uploading files", "workflow_node.deploy.form.ssh_post_command.placeholder": "Please enter command to be executed after uploading files",
"workflow_node.deploy.form.ssh_preset_scripts.button": "Use preset scripts", "workflow_node.deploy.form.ssh_preset_scripts.button": "Use preset scripts",
"workflow_node.deploy.form.ssh_preset_scripts.option.backup_files.label": "POSIX Bash - Backup certificate files",
"workflow_node.deploy.form.ssh_preset_scripts.option.reload_nginx.label": "POSIX Bash - Reload nginx", "workflow_node.deploy.form.ssh_preset_scripts.option.reload_nginx.label": "POSIX Bash - Reload nginx",
"workflow_node.deploy.form.ssh_use_scp.label": "Fallback to use SCP", "workflow_node.deploy.form.ssh_use_scp.label": "Fallback to use SCP",
"workflow_node.deploy.form.ssh_use_scp.tooltip": "If the remote server does not support SFTP, please enable this option to fallback to SCP.", "workflow_node.deploy.form.ssh_use_scp.tooltip": "If the remote server does not support SFTP, please enable this option to fallback to SCP.",

View File

@ -372,6 +372,7 @@
"workflow_node.deploy.form.local_post_command.label": "后置命令(可选)", "workflow_node.deploy.form.local_post_command.label": "后置命令(可选)",
"workflow_node.deploy.form.local_post_command.placeholder": "请输入保存文件后执行的命令", "workflow_node.deploy.form.local_post_command.placeholder": "请输入保存文件后执行的命令",
"workflow_node.deploy.form.local_preset_scripts.button": "使用预设脚本", "workflow_node.deploy.form.local_preset_scripts.button": "使用预设脚本",
"workflow_node.deploy.form.local_preset_scripts.option.backup_files.label": "POSIX Bash - 备份原证书文件",
"workflow_node.deploy.form.local_preset_scripts.option.reload_nginx.label": "POSIX Bash - 重启 nginx 进程", "workflow_node.deploy.form.local_preset_scripts.option.reload_nginx.label": "POSIX Bash - 重启 nginx 进程",
"workflow_node.deploy.form.local_preset_scripts.option.binding_iis.label": "PowerShell - 导入并绑定到 IIS需管理员权限", "workflow_node.deploy.form.local_preset_scripts.option.binding_iis.label": "PowerShell - 导入并绑定到 IIS需管理员权限",
"workflow_node.deploy.form.local_preset_scripts.option.binding_netsh.label": "PowerShell - 导入并绑定到 netsh需管理员权限", "workflow_node.deploy.form.local_preset_scripts.option.binding_netsh.label": "PowerShell - 导入并绑定到 netsh需管理员权限",
@ -423,6 +424,7 @@
"workflow_node.deploy.form.ssh_post_command.label": "后置命令(可选)", "workflow_node.deploy.form.ssh_post_command.label": "后置命令(可选)",
"workflow_node.deploy.form.ssh_post_command.placeholder": "请输入保存文件后执行的命令", "workflow_node.deploy.form.ssh_post_command.placeholder": "请输入保存文件后执行的命令",
"workflow_node.deploy.form.ssh_preset_scripts.button": "使用预设脚本", "workflow_node.deploy.form.ssh_preset_scripts.button": "使用预设脚本",
"workflow_node.deploy.form.ssh_preset_scripts.option.backup_files.label": "POSIX Bash - 备份原证书文件",
"workflow_node.deploy.form.ssh_preset_scripts.option.reload_nginx.label": "POSIX Bash - 重启 nginx 进程", "workflow_node.deploy.form.ssh_preset_scripts.option.reload_nginx.label": "POSIX Bash - 重启 nginx 进程",
"workflow_node.deploy.form.ssh_use_scp.label": "回退使用 SCP", "workflow_node.deploy.form.ssh_use_scp.label": "回退使用 SCP",
"workflow_node.deploy.form.ssh_use_scp.tooltip": "如果你的远程服务器不支持 SFTP请开启此选项回退为 SCP。", "workflow_node.deploy.form.ssh_use_scp.tooltip": "如果你的远程服务器不支持 SFTP请开启此选项回退为 SCP。",