How to launch an app via Docker on every Pull Request?
There is a jenkins plugin github-pullrequest can resolve your problem.
Prerequisites:
- You have a jenkins server can access by internet if you want trigger your build by a webhook.
- Your have a github API token to access/admin your git repository, it can be generate by yourself in settings.
Please follow the guide configuration to setup your jenkins integration with github.
After configuration:
- you can trigger your build by PR events: opened/commit changed/closed, or comment with specific pattern.
- you can get a PR status via environment variable ${GITHUB_PR_STATE}, so you can start or stop a container on specific value.
- you can publish a comment to a PR to tell the address of your web service after you started docker container.
About expose port of cotainer with multi PR, your can just run container with -p 3000
, it will auto expose a port in a range on the docker host, docker port <container>
will show the specific port number, so for example:
container1
with address<host>:32667
forPR1
container2
with address<host>:35989
forPR2
I think the simplest solution to this would be to create two different Jenkins Jobs, one which deploys and the other which nukes it. The trigger for this can be set 2 webhooks in GitHub one for PR create and one for PR resolve.
As Sylvain GIROD pointed out:
With only one box to run the application you need to change the port that is exposed. When a GitHub PR happens you deploy your application (docker run -p newport:containerport). If you are deploying services you change the target port.
Then you send the link with this port back to the user (email?).
Additionally you need some key-value store to remember which pod was created for which users so that you can decide on a new PR whether to destroy the old containers.
I would also suggest giving the services a time to live and regularly cleaning up stale containers/services.