mirror of
				https://github.com/easingthemes/ssh-deploy.git
				synced 2025-10-30 23:30:09 +08:00 
			
		
		
		
	[code] split helpers into separate files
This commit is contained in:
		
							parent
							
								
									9cdc72374b
								
							
						
					
					
						commit
						460751d7c3
					
				
							
								
								
									
										38
									
								
								src/helpers.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/helpers.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | |||||||
|  | const { existsSync, mkdirSync, writeFileSync } = require('fs'); | ||||||
|  | 
 | ||||||
|  | const { | ||||||
|  |   GITHUB_WORKSPACE | ||||||
|  | } = process.env; | ||||||
|  | 
 | ||||||
|  | const validateDir = (dir) => { | ||||||
|  |   if (!existsSync(dir)) { | ||||||
|  |     console.log(`[SSH] Creating ${dir} dir in `, GITHUB_WORKSPACE); | ||||||
|  |     mkdirSync(dir); | ||||||
|  |     console.log('✅ [SSH] dir created.'); | ||||||
|  |   } else { | ||||||
|  |     console.log(`[SSH] ${dir} dir exist`); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const validateFile = (filePath) => { | ||||||
|  |   if (!existsSync(filePath)) { | ||||||
|  |     console.log(`[SSH] Creating ${filePath} file in `, GITHUB_WORKSPACE); | ||||||
|  |     try { | ||||||
|  |       writeFileSync(filePath, '', { | ||||||
|  |         encoding: 'utf8', | ||||||
|  |         mode: 0o600 | ||||||
|  |       }); | ||||||
|  |       console.log('✅ [SSH] file created.'); | ||||||
|  |     } catch (e) { | ||||||
|  |       console.error('⚠️ [SSH] writeFileSync error', filePath, e.message); | ||||||
|  |       process.abort(); | ||||||
|  |     } | ||||||
|  |   } else { | ||||||
|  |     console.log(`[SSH] ${filePath} file exist`); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | module.exports = { | ||||||
|  |   validateDir, | ||||||
|  |   validateFile | ||||||
|  | }; | ||||||
							
								
								
									
										204
									
								
								src/index.js
									
									
									
									
									
								
							
							
						
						
									
										204
									
								
								src/index.js
									
									
									
									
									
								
							| @ -1,153 +1,75 @@ | |||||||
| #!/usr/bin/env node
 | #!/usr/bin/env node
 | ||||||
| const fs = require('fs'); |  | ||||||
| const path = require('path'); |  | ||||||
| const commandExists = require('command-exists'); |  | ||||||
| const nodeCmd = require('node-cmd'); |  | ||||||
| const nodeRsync = require('rsyncwrapper'); | const nodeRsync = require('rsyncwrapper'); | ||||||
| 
 | 
 | ||||||
| const { REMOTE_HOST, REMOTE_USER, REMOTE_PORT, SSH_PRIVATE_KEY, DEPLOY_KEY_NAME, SOURCE, TARGET, ARGS, GITHUB_WORKSPACE, HOME } = process.env; | const { validateRsync, validateInputs } = require('./rsyncCli'); | ||||||
| console.log('GITHUB_WORKSPACE', GITHUB_WORKSPACE); | const { addSshKey } = require('./sshKey'); | ||||||
| 
 | 
 | ||||||
| const sshDeploy = (() => { | const { | ||||||
|     const rsync = ({ privateKey, port, src, dest, args }) => { |   REMOTE_HOST, REMOTE_USER, | ||||||
|         console.log(`Starting Rsync Action: ${src} to ${dest}`); |   REMOTE_PORT, SSH_PRIVATE_KEY, DEPLOY_KEY_NAME, | ||||||
|  |   SOURCE, TARGET, ARGS, | ||||||
|  |   GITHUB_WORKSPACE | ||||||
|  | } = process.env; | ||||||
| 
 | 
 | ||||||
|         try { | const defaultOptions = { | ||||||
|             // RSYNC COMMAND
 |   ssh: true, | ||||||
|             nodeRsync({ src, dest, args, privateKey, ssh: true, port, sshCmdArgs: ['-o StrictHostKeyChecking=no'], recursive: true }, (error, stdout, stderr, cmd) => { |   sshCmdArgs: ['-o StrictHostKeyChecking=no'], | ||||||
|                 if (error) { |   recursive: true | ||||||
|                     console.error('⚠️ Rsync error', error.message); |  | ||||||
|                     process.abort(); |  | ||||||
|                 } else { |  | ||||||
|                     console.log("✅ Rsync finished.", stdout); |  | ||||||
|                 } |  | ||||||
|             }); |  | ||||||
|         } catch (err) { |  | ||||||
|             console.error(`⚠️ An error happened:(.`, err.message, err.stack); |  | ||||||
|             process.abort(); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     const init = ({ |  | ||||||
|                       src, |  | ||||||
|                       dest, |  | ||||||
|                       args, |  | ||||||
|                       host = 'localhost', |  | ||||||
|                       username, |  | ||||||
|                       privateKeyContent, |  | ||||||
|                       port |  | ||||||
|                   }) => { |  | ||||||
|         validateRsync(() => { |  | ||||||
|             const privateKey = addSshKey(privateKeyContent, DEPLOY_KEY_NAME ||'deploy_key'); |  | ||||||
| 
 |  | ||||||
|             const remoteDest = username + '@' + host + ':' + dest; |  | ||||||
| 
 |  | ||||||
|             rsync({ privateKey, port, src, dest: remoteDest, args }); |  | ||||||
|         }); |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     const validateDir = (dir) => { |  | ||||||
|         if (!fs.existsSync(dir)){ |  | ||||||
|             console.log(`Creating ${dir} dir in `, GITHUB_WORKSPACE); |  | ||||||
|             fs.mkdirSync(dir); |  | ||||||
|         } else { |  | ||||||
|             console.log(`${dir} dir exist`); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     const validateFile = (filePath) => { |  | ||||||
|         if (!fs.existsSync(filePath)){ |  | ||||||
|             console.log(`Creating ${filePath} file in `, GITHUB_WORKSPACE); |  | ||||||
|             try { |  | ||||||
|                 fs.writeFileSync(filePath, '', { |  | ||||||
|                     encoding: 'utf8', |  | ||||||
|                     mode: 0o600 |  | ||||||
|                 }); |  | ||||||
|             } catch (e) { |  | ||||||
|                 console.error('⚠️ writeFileSync error', filePath, e.message); |  | ||||||
|                 process.abort(); |  | ||||||
|             } |  | ||||||
|         } else { |  | ||||||
|             console.log(`${filePath} file exist`); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     const addSshKey = (key, name) => { |  | ||||||
|         const sshDir = path.join(HOME || __dirname, '.ssh'); |  | ||||||
|         const filePath = path.join(sshDir, name); |  | ||||||
| 
 |  | ||||||
|         validateDir(sshDir); |  | ||||||
|         validateFile(sshDir + '/known_hosts'); |  | ||||||
| 
 |  | ||||||
|         try { |  | ||||||
|             fs.writeFileSync(filePath, key, { |  | ||||||
|                 encoding: 'utf8', |  | ||||||
|                 mode: 0o600 |  | ||||||
|             }); |  | ||||||
|         } catch (e) { |  | ||||||
|             console.error('⚠️ writeFileSync error', filePath, e.message); |  | ||||||
|             process.abort(); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         console.log('✅ Ssh key added to `.ssh` dir ', filePath); |  | ||||||
| 
 |  | ||||||
|         return filePath; |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     const validateRsync = (callback = () => {}) => { |  | ||||||
|         const rsyncCli = commandExists.sync('rsync'); |  | ||||||
| 
 |  | ||||||
|         if (!rsyncCli) { |  | ||||||
|             nodeCmd.get( |  | ||||||
|                 'sudo apt-get --no-install-recommends install rsync', |  | ||||||
|                 function(err, data, stderr){ |  | ||||||
|                     if (err) { |  | ||||||
|                         console.log('⚠️ Rsync installation failed ', err.message); |  | ||||||
|                         process.abort(); |  | ||||||
|                     } else { |  | ||||||
|                         console.log('✅ Rsync installed. \n', data, stderr); |  | ||||||
|                         callback(); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             ); |  | ||||||
|         } else { |  | ||||||
|             callback(); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     return { |  | ||||||
|         init |  | ||||||
|     } |  | ||||||
| })(); |  | ||||||
| 
 |  | ||||||
| const validateInputs = (inputs) => { |  | ||||||
|     const validInputs = inputs.filter(input => { |  | ||||||
|         if (!input) { |  | ||||||
|             console.error(`⚠️ ${input} is mandatory`); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         return input; |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     if (validInputs.length !== inputs.length) { |  | ||||||
|         process.abort(); |  | ||||||
|     } |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const run = () => { | console.log('[general] GITHUB_WORKSPACE: ', GITHUB_WORKSPACE); | ||||||
|     validateInputs([SSH_PRIVATE_KEY, REMOTE_HOST, REMOTE_USER]); |  | ||||||
| 
 | 
 | ||||||
|     sshDeploy.init({ | const sshDeploy = (() => { | ||||||
|         src: GITHUB_WORKSPACE + '/' + SOURCE || '', |   const rsync = ({ privateKey, port, src, dest, args }) => { | ||||||
|         dest: TARGET || '/home/' + REMOTE_USER + '/', |     console.log(`[Rsync] Starting Rsync Action: ${src} to ${dest}`); | ||||||
|         args: ARGS ? [ARGS] : ['-rltgoDzvO'], | 
 | ||||||
|         host: REMOTE_HOST, |     try { | ||||||
|         port: REMOTE_PORT || '22', |       // RSYNC COMMAND
 | ||||||
|         username: REMOTE_USER, |       nodeRsync({ | ||||||
|         privateKeyContent: SSH_PRIVATE_KEY, |         src, dest, args, privateKey, port, ...defaultOptions | ||||||
|  |       }, (error, stdout, stderr, cmd) => { | ||||||
|  |         if (error) { | ||||||
|  |           console.error('⚠️ [Rsync] error: ', error.message); | ||||||
|  |           console.log('⚠️ [Rsync] stderr: ', stderr); | ||||||
|  |           console.log('⚠️ [Rsync] stdout: ', stdout); | ||||||
|  |           console.log('⚠️ [Rsync] cmd: ', cmd); | ||||||
|  |           process.abort(); | ||||||
|  |         } else { | ||||||
|  |           console.log('✅ [Rsync] finished.', stdout); | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |     } catch (err) { | ||||||
|  |       console.error('⚠️ [Rsync] command error: ', err.message, err.stack); | ||||||
|  |       process.abort(); | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   const init = ({ src, dest, args, host = 'localhost', port, username, privateKeyContent }) => { | ||||||
|  |     validateRsync(() => { | ||||||
|  |       const privateKey = addSshKey(privateKeyContent, DEPLOY_KEY_NAME || 'deploy_key'); | ||||||
|  |       const remoteDest = `${username}@${host}:${dest}`; | ||||||
|  | 
 | ||||||
|  |       rsync({ privateKey, port, src, dest: remoteDest, args }); | ||||||
|     }); |     }); | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   return { | ||||||
|  |     init | ||||||
|  |   }; | ||||||
|  | })(); | ||||||
|  | 
 | ||||||
|  | const run = () => { | ||||||
|  |   validateInputs([SSH_PRIVATE_KEY, REMOTE_HOST, REMOTE_USER]); | ||||||
|  | 
 | ||||||
|  |   sshDeploy.init({ | ||||||
|  |     src: `${GITHUB_WORKSPACE}/${SOURCE}` || '', | ||||||
|  |     dest: TARGET || `/home/${REMOTE_USER}/`, | ||||||
|  |     args: ARGS ? [ARGS] : ['-rltgoDzvO'], | ||||||
|  |     host: REMOTE_HOST, | ||||||
|  |     port: REMOTE_PORT || '22', | ||||||
|  |     username: REMOTE_USER, | ||||||
|  |     privateKeyContent: SSH_PRIVATE_KEY | ||||||
|  |   }); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| run(); | run(); | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|  | |||||||
							
								
								
									
										42
									
								
								src/rsyncCli.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/rsyncCli.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | |||||||
|  | const { sync: commandExists } = require('command-exists'); | ||||||
|  | const { get: nodeCmd } = require('node-cmd'); | ||||||
|  | 
 | ||||||
|  | const validateRsync = (callback = () => {}) => { | ||||||
|  |   const rsyncCli = commandExists.sync('rsync'); | ||||||
|  | 
 | ||||||
|  |   if (!rsyncCli) { | ||||||
|  |     nodeCmd( | ||||||
|  |       'sudo apt-get --no-install-recommends install rsync', | ||||||
|  |       (err, data, stderr) => { | ||||||
|  |         if (err) { | ||||||
|  |           console.log('⚠️ [CLI] Rsync installation failed ', err.message); | ||||||
|  |           process.abort(); | ||||||
|  |         } else { | ||||||
|  |           console.log('✅ [CLI] Rsync installed. \n', data, stderr); | ||||||
|  |           callback(); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     ); | ||||||
|  |   } else { | ||||||
|  |     callback(); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | const validateInputs = (inputs) => { | ||||||
|  |   const validInputs = inputs.filter((input) => { | ||||||
|  |     if (!input) { | ||||||
|  |       console.error(`⚠️ ${input} is mandatory`); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return input; | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   if (validInputs.length !== inputs.length) { | ||||||
|  |     process.abort(); | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | module.exports = { | ||||||
|  |   validateRsync, | ||||||
|  |   validateInputs | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								src/sshKey.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/sshKey.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | const { writeFileSync } = require('fs'); | ||||||
|  | const { join } = require('path'); | ||||||
|  | 
 | ||||||
|  | const { | ||||||
|  |   validateDir, | ||||||
|  |   validateFile | ||||||
|  | } = require('./helpers'); | ||||||
|  | 
 | ||||||
|  | const { | ||||||
|  |   HOME | ||||||
|  | } = process.env; | ||||||
|  | 
 | ||||||
|  | const addSshKey = (key, name) => { | ||||||
|  |   const sshDir = join(HOME || __dirname, '.ssh'); | ||||||
|  |   const filePath = join(sshDir, name); | ||||||
|  | 
 | ||||||
|  |   validateDir(sshDir); | ||||||
|  |   validateFile(`${sshDir}/known_hosts`); | ||||||
|  | 
 | ||||||
|  |   try { | ||||||
|  |     writeFileSync(filePath, key, { | ||||||
|  |       encoding: 'utf8', | ||||||
|  |       mode: 0o600 | ||||||
|  |     }); | ||||||
|  |   } catch (e) { | ||||||
|  |     console.error('⚠️ writeFileSync error', filePath, e.message); | ||||||
|  |     process.abort(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   console.log('✅ Ssh key added to `.ssh` dir ', filePath); | ||||||
|  | 
 | ||||||
|  |   return filePath; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | module.exports = { | ||||||
|  |   addSshKey | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Dragan Filipovic
						Dragan Filipovic