Deploy same code to two apps with different Procfile in Heroku - heroku

I'm triggering Heroku deployment from Bitbucket Pipeline using this shell script:
https://bitbucket.org/spittet/heroku-deploy/src/master/heroku-deploy.sh
This works fine but now I'd like for this to deploy to two Heroku apps with the same code, just different Procfiles

There's no official way, but there is a build pack that supports multiple Procfiles:
https://github.com/heroku/heroku-buildpack-multi-procfile
For each app set the PROCFILE variable
heroku config:set PROCFILE=relative/path/to/Procfile -a <app>
And then add the buildpack
heroku buildpacks:add -a <app> https://github.com/heroku/heroku-buildpack-multi-procfile

Related

Deploy elixir phoenix application to heroku - Can not add buildpack

So I am trying to deploy my Elixir phoenix web application to Heroku. I am following this guide: https://hexdocs.pm/phoenix/heroku.html
But when I get to the point where I need to add a buildpack:
heroku buildpacks:add https://github.com/gjaldon/heroku-buildpack-phoenix-static.git
I get this error:
Couldn't find that app.
Running heroku buildpacks:add --help precises that the app parametes is required, so let's check the list of app names:
user#machine:~/project> heroku apps
=== john#doe.com Apps
some-app-name (eu)
Then re-run the command as such:
user#machine:~/project> heroku buildpacks:add <buildpack> --app some-app-name

Building a dev environment in Heroku for Phoenix

I'm trying to set up Phoenix 1.2 so that I have two Heroku environments: one for dev/testing (which will keep the this-app-12345.herokuapp.com url), and a standard production environment.
Currently, I set up my app the usual way:
mix phoenix.new my_app
cd my_app
mix ecto.create
mix ecto.migrate
git init && git add . && git commit -m "Initial commit"
heroku create
This gives me a Heroku instance:
Creating app... done, ⬢ first-instance-12345
https://first-instance-12345.herokuapp.com/ | https://git.heroku.com/first-instance-12345.git
I then add the buildpacks, change the config/ files and run git push heroku master and everything works.
Now I'd like to create another Heroku instance, to which I can also deploy. If I run heroku create again, I get:
Creating app... done, ⬢ second-instance-23456
https://second-instance-23456.herokuapp.com/ | https://git.heroku.com/second-instance-23456.git
If I replace the url in prod.exs with the new instance...
config :my_app, MyApp.Endpoint,
http: [port: {:system, "PORT"}],
url: [scheme: "https", host: "second-instance-23456.herokuapp.com", port: 443], force_ssl: [rewrite_on: [:x_forwarded_proto]],
...and then commit and run git push heroku master, it will still deploy to first-instance-12345.herokuapp.com, which isn't what I want.
Re-running buildpacks doesn't help either.
$ heroku buildpacks:add https://github.com/HashNuke/heroku-buildpack-elixir
▸ The buildpack https://github.com/HashNuke/heroku-buildpack-elixir is already set on your app.
$ heroku buildpacks:add https://github.com/gjaldon/phoenix-static-buildpack
▸ The buildpack https://github.com/gjaldon/phoenix-static-buildpack is already set on your app.
Is there a standard method (or any method) to get Phoenix to deploy to multiple heroku environments? (And hopefully specify which one/s on deploy)
The standard way to deploy an app to multiple Heroku apps is to add multiple remotes to the repo and push to the one you want to deploy to. Making that change to config/prod.exs will have no effect on where the app is deployed.
Here's how to add the two remotes:
$ git remote add first https://git.heroku.com/first-instance-12345.git
$ git remote add second https://git.heroku.com/second-instance-23456.git
Now you can deploy to the first one using:
$ git push first master
and to the second using:
$ git push second master
Certainly the best way to do so is to have two different instances as #dogbert wrote.
Also remember about changing Procfile for heroku, because you want to run app using different environments eg.
# Procfile for prod
web: MIX_ENV=prod mix phoenix.server
# Procfile for dev
web: MIX_ENV=dev mix phoenix.server
For both environments you would need to apply migrations:
heroku run MIX_ENV=<env> ecto.migrate

Multiple apps in git remotes when trying to access rails console

I have two git branches, staging and production, and I deployed them on Heroku in the same Heroku acccount. Suppose my app names are app1.heroku-app.com and app2.heroku-app.com and the remote names are heroku-staging and heroku-production,respectively. I deployed both apps on Heroku. After I login to Heroku from the console using heroku login and then try to access a Rails console using heroku run rails c, I get this message :
▸ multiple apps in git remotes
▸ remotes: heroku-staging heroku-production
How can I access a console?
If there's only one Heroku remote, heroku can infer which you want. When there are multiple (or if you want to access an application that doesn't have a remote in this Git repo, or when you're not in a Git repo at all), you need to use the --app option to specify which application you want a console on.
$ heroku --help
Usage: heroku COMMAND [--app APP] [command-specific-options]
$ heroku run rails c --app app1
$ heroku run rails c --app app2
In addition to being able to specify the app as a per-command flag, if you'd like for there to be a default environment, setting the environment variable HEROKU_APP to the app you want will make it so that heroku commands don't rely on git config.
$ heroku logs
› Error: Multiple apps in git remotes
...
$ export HEROKU_APP=app1
$ heroku logs
2018-12-31T03:56:34.888350+00:00 app[web.1]: 1.2.3.4 ...

How can I deploy to a specific app with heroku docker:release?

Using the heroku docker:release command, how can I specify which app to release to? I can't see from any documentation whether there's any switch for this purpose.
Heroku commands take their context from the directory you are in when you run them.
Go into the directory from where you did heroku create then run heroku docker:release.
If you haven't used heroku create, then you can specify the app name with the --app <APP NAME> command line parameter. for instance, if you were to release to the app named f00 you would type:
heroku docker:release --app f00

Forking an app on heroku and setting different environment variables

I'm in the process of setting up a staging environment for a current heroku app. I've successfully forked it so I have two apps running. If the names of the two apps are app_production and app_staging, how do I set environment variables for each one from the command line?
According to Configuration and Config Vars, you set config vars like so:
heroku config:set GITHUB_USERNAME=joesmith
Since all Heroku commands support the --app switch, you do this for your production app:
heroku config:set GITHUB_USERNAME=joesmith --app app_production
and use --app app_staging for your staging app.

Resources