I've never created a CD pipeline for a Serverless project, but I have done plenty of them for RoR projects and one for a .Net project. Having a private repo shouldn't be a problem and you shouldn't have to pay for anything except hosting costs.
I suggest you go with TeamCity for your deployment pipeline since it's free up to 25 projects and Bitbucket offers free private repo hosting. TeamCity, like most other CD platforms, allows you to break up your pipeline into build steps.
Usually, Step 1 would be building the project. For a Serverless project that means running
npm install. The second step might be to run your tests, so
npm test. And the third step might be to deploy the code to whatever your staging environment is, like dev or alpha.
TeamCity also allows you to create sub projects, which I used to separate my different environments. This isn't the only way to separate environments, but it's the way I chose. So you can set your staging environment to automatically pull down, build and test your changes everytime you push up code chages, but then have production only run when you log into TeamCity and actually click the Build Now button. You can also have production only run once you tag a release or if you merge in changes to a branch named production. It all depends on what works best for you.
Like I said before though, I never set up a pipeline for a Serverless project, so I'm sure there are plenty of gotchas out there. I haven't done one to figure out what those are.