Heroku / Rails: can't set path to vendorized dependencies - c++

I've got a set of libs/headers/binaries that are used to build some gems in my app (specifically Boost and SWIG). I've pre-built everything on a cedar-14 docker image and put it all in my vendor directory, so I have "vendor/swig" and "vendor/lib/boost" etc. I've tried setting paths with both heroku config:set and by making a paths.sh file in .profile.d as recommended in the documentation but no luck.

Answer is you can't, you need to make a buildpack.

Related

How to install ffmpeg for a django app on heroku?

I'd like to use ffmpeg to extract a frame from a video to use it as a poster. This is my first time deploying an app, let alone on heroku, so I'm not sure how to install ffmpeg on the server.
I've found this build of ffmpeg with instructions to 'vendor' it into my app, and then adjust my app's configuration settings / path. What does it mean to vendor something? I have a feeling it's a rails thing, because I can't seem to find an explanation by googling.
Also, what would be the django equivalent of the instructions to run
heroku config:set PATH=bin:vendor/ffmpeg/bin:<...> -a yourapp and heroku config:set LD_LIBRARY_PATH=vendor/ffmpeg/lib:/usr/local/lib -a yourapp?
You might want to swap out the build pack for this one:
heroku config:add BUILDPACK_URL=https://github.com/integricho/heroku-buildpack-python-ffmpeg.git
The build pack is what takes your source code and builds what gets deployed to your Heroku dynos. This build pack explicitly includes ffmpeg with your app when it's built.
I have searched it for 2 day, tried everything what other users said. Then i found simple way. Just go heroku app settings. Then click add buildpack. After that popups small toolbar. Add this url:
https://github.com/kontentcore/heroku-buildpack-ffmpeg
press save changes. Then deploy your app again. You have done :)

Installing binary package on heroku

I want to deploy a binary package on heroku for use by my application
I am using the new Cedar stack, the official documentation states that it is recommended to use the vulcan tool for building binaries for heroku
So , i just did that, and the result was a tar.gz file containing a mini linux file system
Now what? how to deploy that binary package to heroku?
all the available documentation refer to using vulcan with buildpacks to create new applications
but, i want to deploy this binary package to an existing application
The question is , How can i do that?
should i put it in my git repo and upload it? if so, where should i put it? and how to unpack it and deploy it correctly on heroku to be available and correctly configured?
thanks
Joe
You need to incorporate that compiled output into a buildpack. See https://devcenter.heroku.com/articles/buildpack-binaries
Start with the buildpack for the language you're working in -- ruby / python / node. You'll probably just unpack the tarball into the a subdirectory of the vendor directory in the buildpack. Push your forked buildpack up to github and then point heroku to the buildpack.

Using virtualenv with legacy Django projects

I am finally going to start using virtualenv for my Django projects on my development machine. Before I start I want to know if there are any special considerations for dealing with my existing projects. My presumed workflow is something like:
make a new virtualenv
activate the new virtualenv
Install Django in there
pip install all the packages I know I need for my existing project
copy my Django project files, app files, and git files into the project folder within the virtualenv.
Edit
6. make requirements file for deployment
This is obviously very simplified but are there any steps or considerations I am fundamentally missing? Is git going to be happy about moving? Also is it best practice to have a separate virtualenv for each Django project?
I know this is not a typical code problem, but I hope those that know more than I do can point me in the right direction.
Many thanks.
I don't see any big issue on migrating your projects and I think your 5-steps plan is correct, in particular, for steps 3/4/5 (I'd merge them), you can handle project dependencies with pip, possibly using requirement files.
Requirement files are plain text files telling to pip which packages have to be installed in your virtualenv, included your git-tracked projects which eventually can be deployed in your virtual environment as development eggs (they bring with them version control infos).
Once you have a req file, it's a matter of:
pip install -r file.req
to have all needed packages installed in your env.
As you can see from virtualenv docs, a typical req file would contain something like:
django==1.3.0
-e git://git.myproject.org/MyProject.git#egg=MyProject
I usually keep each project in its own virtualenv, so I can deploy it to the production server the same way I do for local development.

Creating an app on Heroku with Django and NPM

I'm writing a Django app that includes some CoffeeScript in it. To allow for this I'm using django-compressor which compiles the CoffeeScript to JS before the app is launched. django-compressor requires that NPM is installed on the machine to compile the CoffeeScript.
Now I want to deploy this app on Heroku. I can't put npm in my requirements.txt so I am wondering how I can get npm on the Heroku server?
If you want to avoid maintaining a custom buildpack, you can use the multi buildpack.
Using the multi buildpack is super simple:
Run heroku config:add BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git
Create a .buildpacks file in the root of your repository with two lines:
https://github.com/heroku/heroku-buildpack-nodejs.git
https://github.com/heroku/heroku-buildpack-python.git
Create a package.json file with your npm dependencies.
Run npm install
Note: The multi buildpack is a much nicer way to accomplish this these days :)
I've created a fork of the official Python heroku buildpack that allows an optional npm_requirements.txt for installing such dependencies.
I am now using coffeescript and less-css with django-compressor on heroku :)
https://github.com/jiaaro/heroku-buildpack-django
Edit: To switch to my buildback from the standard buildpack:
use the heroku command line app to set the BUILDPACK_URL environment variable:
heroku config:add BUILDPACK_URL=git://github.com/jiaaro/heroku-buildpack-django.git
You can create your own buildpack, that mix nodejs buildbpack and python buildpack. Or compile your CoffeeScript on your machine and put it on S3.
I found this question in Google while solving the same problem for myself.
I merged two official buildpacks (python and nodejs), so now one can have Django project with standard npm-description file package.json by running this command:
heroku config:add BUILDPACK_URL=https://github.com/podshumok/heroku-buildpack-python
This solution differs from Jiaaro's one in the following:
it is based on the newer (dec 12) versions of buildpacks (for example, it runs collectstatic on deployment)
you need correct package.json file (at least name and version of your product should be specified in this file)
npm dependencies should be listed in package.json
#Jiaaro 's solution didn't work for me... Causes some weird error... /:
File "almalinks/manage.py", line 8, in <module>
from django.core.management import execute_from_command_line
ImportError: No module named django.core.management
Was too tired to deal with it, so I looked around and I found this nifty resource:
- The heroku-django cookbook
They explain how you can add your own scripts that hook into heroku's default buildpacks.
Worked like a charm. :)
Things have changed in Heroku land
There is no need for multi build packs, .builpack files, or custom build packs. Simply add the required official heroku build packs to your heroku app and they will execute in the order entered. Use the index option to reorder them as required.
heroku buildpacks:add --index 1 heroku/nodejs -a your_app_name
There is also no need for, gunt tasks, apps like django-bower, or other specialized tools that take up server resources and slow build time.
You can check out my tutorial on how to seamlessly integrate Django + Bower + Heroku here.

Deploying Django with virtualenv inside a distribution package?

I have to deploy a Django application onto a SuSE Linux Enterprise 11 system. Corporate rules say I need to deploy using RPMs only. While I can use ./setup.py bdist_rpm for each dependency, it's not really sane, since RPM doesn't record all of the dependencies yet. Therefore I'd have no real advantage in using RPMs and managing dependencies manually is somewhat cumbersome and I would like to avoid it.
Now I had the following idea: While building a package, I could create a virtualenv, install all my dependencies via pip there and then package it up with the rest of the code into one solid RPM.
How sensible is this approach?
I've been using this approach for about a year now and it has worked out pretty well.
One gotcha is that you'll want to check out the bang lines in any python scripts written to the virtualenv's bin directory. These will end up being full path names used in your build environment, which probably won't be the same directory where you end up installing the virtualenv. So you may need to add some sed calls in your RPM's postinstall to adjust the paths.