How to test my Dockerfile for my python project using GitHub actions?

Viewed 1768
  • Sometimes we make errors in writing the docker file. If there is an error in the Dockerfile, the docker build will fail.

  • Sometimes we may forget to specify dependencies in our Dockerfile. Let's take an example.

Suppose, I have a python script that can take the screenshot of any web page (whose URL is supplied).

  • Now, in my code I am using pyppeeteer(Headless chrome/chromium automation library (unofficial port of puppeteer)
  • pyppeeteer uses chromium and chrome driver. These are already installed in my machine. So, running pytest will pass in my local dev environment.
  • I forget to specify the RUN commands in the dockerfile, that will install chromium and chrome driver. so running tests inside the container will fail. (although the docker build will succeed.)

I want to automate the task of building docker images and running tests in the container.

In the local machine, I can run docker build -t myproj . to build.

and for testing, I can run docker run -it myproj pytest (if i forget to add the RUN that installs chromium and chromedriver, then my pytest will fail inside container)

I hope I am able to explain my purpose.

Normally,in github actions,the python source code can be run on ubuntu, mac, windows etc. Besides the different os, I also want to build and test my dockerfile.

1 Answers

After a little more experimenting and research I found out that the solution to my problem is simple.

Inside the .github/workflows folder create a docker-build-test.yml file.

 
name: Docker build and test

on:
  workflow_dispatch 
# you can trigger on anything you want

jobs:
  build:
   runs-on: ubuntu-latest
  
   steps:
     - uses: actions/checkout@v2
     - name: Build Docker image 
       run: docker build -t samplepy .
     - name: Run tests inside the container
       run: docker run samplepy poetry run pytest

Its very simple, because github's ubuntu-latest VMs already have docker installed and configured. You just run the docker command and everything just works.

And, I tested the above workflow with a dummy python project also.

Screenshot from 2021-04-17 14-02-29

Related