Failing on sftp deploy, circle CI, nuxt

Viewed 17

For several months I have been able to deploy to my server with no problems using Circle CI, ever since the outage 2 days ago, (not sure if things are related) my deployment script has been failing.

Here is the deployment script:

require('dotenv').config();
console.log("Starting upload")
var SftpUpload = require('sftp-upload'),
    fs = require('fs');

var options = {
    host: process.env.FTP_HOST,
    username: process.env.FTP_UN,
    password: process.env.FTP_PW,
    path: './dist',
    remoteDir: process.env.FTP_PATH,
    // excludedFolders: ['**/.git', 'node_modules'],
    // exclude: ['.gitignore', '.vscode/tasks.json'],
    // privateKey: fs.readFileSync('privateKey_rsa'),
    // passphrase: fs.readFileSync('privateKey_rsa.passphrase'),
    dryRun: false,
}

console.log(options);
sftp = new SftpUpload(options);

console.log("sftp working ahead")

sftp.on('error', function(err) {
    console.log(options)
    console.log("igoring error for now")
    //throw err;
})
.on('uploading', function(progress) {
    console.log(options);
    console.log('Uploading', progress.file);
    console.log(progress.percent+'% completed');
})
.on('completed', function() {
    console.log('Upload Completed');
})
.upload();

Here is the error

'

    Starting upload
{
  host: '************************',
  username: '*********',
  password: '************',
  path: './dist',
  remoteDir: '*****************************************',
  dryRun: false
}
sftp working ahead
buffer.js:330
  throw new ERR_INVALID_ARG_TYPE(
  ^

TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received undefined
    at Function.from (buffer.js:330:9)
    at new Buffer (buffer.js:286:17)
    at onNEWKEYS (/home/circleci/repo/node_modules/ssh2/lib/Connection.js:2282:29)
    at Parser.<anonymous> (/home/circleci/repo/node_modules/ssh2/lib/Connection.js:123:5)
    at Parser.emit (events.js:314:20)
    at Parser.parsePacket (/home/circleci/repo/node_modules/ssh2/lib/Parser.js:468:12)
    at Parser.execute (/home/circleci/repo/node_modules/ssh2/lib/Parser.js:249:14)
    at Socket.<anonymous> (/home/circleci/repo/node_modules/ssh2/lib/Connection.js:523:18)
    at Socket.emit (events.js:314:20)
    at addChunk (_stream_readable.js:297:12) {
  code: 'ERR_INVALID_ARG_TYPE'
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! nyb.nyb.nyb@1.0.0 deploy: `node deploy-sftp.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the nyb.nyb.nyb@1.0.0 deploy script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/circleci/.npm/_logs/2022-09-16T08_55_31_507Z-debug.log


Exited with code exit status 1

CircleCI received exit code 1

All of this happens after I installed the packages and built the static files that i'm sftp'ing to a server using nuxt generate. I'm confused about what is happening and how I might salvage my pipeline. Any suggestions are greatly appreciated, thank you!

1 Answers

While i did not find the cause of above error, i found a workaround by using the ssh2-sftp-client, documentation and source code is here

The new deployment script is as follows:

let SftpClient = require('ssh2-sftp-client');
const path = require('path');

require('dotenv').config()

const config = {
  host: process.env.FTP_HOST,
  username: process.env.FTP_UN,
  password: process.env.FTP_PW,
  port: process.env.FTP_PORT || 22
};

async function main() {
  const client = new SftpClient('upload-test');
  const src = path.join(__dirname, './dist/');
  const dst = process.env.FTP_PATH;

  try {
    await client.connect(config);
    client.on('upload', info => {
      console.log(`Listener: Uploaded ${info.source}`);
    });
    let rslt = await client.uploadDir(src, dst);
    return rslt;
  } catch (err) {
    console.error(err);
  } finally {
    client.end();
  }
}

main()
  .then(msg => {
    console.log(msg);
  })
  .catch(err => {
    console.log(`main error: ${err.message}`);
  });

Hope this helps anyone encountering similar problems.

Related