CI/CD
,Jenkins
等服務。因此在平時開發中,時不時都要打個包而後手動打開ftp
工具將包上傳到測試服務器上,因此這裏想有沒有什麼腳本能夠實現打包完成自動上傳資源到測試服務器。gulp
實現gulp
,gulp-ssh
這兩個包npm install gulp gulp-ssh -D
gulpfile.js
文件/** * 上傳前先刪除服務器上現有文件... */ gulp.task('execSSH', () => { console.log('刪除服務器上現有文件...') return gulpSSH.shell(config.commands, { filePath: 'commands.log' }) .pipe(gulp.dest('logs')) })
gulp.task('deploy', gulp.series('execSSH', done => { console.log('2s後開始上傳文件到服務器...') setTimeout(() => { gulp.src(`./${npm_package_name}/**`) .pipe(gulpSSH.dest(config.remotePath)) console.log('上傳完畢.....') done(); }, 2000) }))
注意在這裏遇到一個坑,若是使用的是gulp4
以上版本,打包命令可按照上面的方法寫,若是是gulp4
如下版本,按照下面的方法寫javascript
gulp.task('deploy', ['execSSH'], () => { console.log('2s後開始上傳文件到服務器...') setTimeout(() => gulp.src(`./${npm_package_name}/**`) .pipe(gulpSSH.dest(config.remotePath)), 2000) })
否則會遇到下面如圖的報錯:html
這是由於在gulp4
與gulp3
中依賴任務列表寫法的改變,具體可看官方文檔 series()前端
還有一個點須要注意:若是出現如下報錯:java
須要手動結束任務done();
docker
完整代碼:typescript
const gulp = require('gulp') const GulpSSH = require('gulp-ssh') // eslint-disable-next-line @typescript-eslint/camelcase const { APP_ENV, npm_package_name } = process.env; const isProduct = APP_ENV === 'production'; // 須要上傳到服務器的路徑 // eslint-disable-next-line @typescript-eslint/camelcase const remotePath = `/home/public/docker/main/${npm_package_name}` const config = { ssh: { // 正式 host: isProduct ? '' : '192.168.31.227', port: isProduct ? 22 : 8822, username: 'root', password: isProduct ? '' : 'a1234567', }, remotePath, commands: [ // 刪除現有文件 `rm -rf ${remotePath}`, ], } const gulpSSH = new GulpSSH({ ignoreErrors: false, sshConfig: config.ssh, }) /** * 上傳前先刪除服務器上現有文件... */ gulp.task('execSSH', () => { console.log('刪除服務器上現有文件...') return gulpSSH.shell(config.commands, { filePath: 'commands.log' }) .pipe(gulp.dest('logs')) }) /** * 上傳文件到服務器 */ gulp.task('deploy', gulp.series('execSSH', done => { console.log('2s後開始上傳文件到服務器...') setTimeout(() => { // eslint-disable-next-line @typescript-eslint/camelcase gulp.src(`./${npm_package_name}/**`) .pipe(gulpSSH.dest(config.remotePath)) console.log('上傳完畢.....') done(); }, 2000) }))
package.json
文件scripts
新增命令以下:"scripts": { "start": "cross-env APP_ENV=development APP_TYPE=site MOCK=none umi dev", "start:no-mock": "cross-env MOCK=none umi dev", "build": "cross-env APP_ENV=production umi build", "build:test": "cross-env APP_ENV=test umi build", "analyze": "cross-env ANALYZE=1 umi build", "deploy:test": "npm run build:test && gulp deploy" },
npm run deploy:test
這樣就會先去打包,而後將打包的文件上傳至服務器shell
gulp
簡單的實現了一下,若是想搭建完整的自動構建,打包,回滾,監控等能夠使用jetkins