Develop games with HTML5 game framework GameClosure using Docker and Gitlab CI.

Docker for Development

Following the guide of GameClosure, I made a Dockerfile that has gameclosure/devkit installed where I copied manifest.json, package.json and run the commands to install dependencies:

    COPY --chown=node manifest.json package.json ./
    RUN devkit install
    COPY --chown=node ./package.json ./
    RUN npm install
    CMD [ "devkit", "serve" ]

My project only needs 2 folders: src for source codes and resources for assets. These are the folders required by GameClosure, everything else are dependencies and installed in the docker image. Using docker-compose, I mount these folders to the container and expose port 9200.

        - ./src:/home/node/game/src
        - ./resources:/home/node/game/resources
        - 9200:9200

From the host machine, I can access devkit page via browser at localhost:9200 as normal.

Continous Deployment

In order to build the project, I need another docker-compose configuration to mount a build folder and run the build command instead of serve.

        - ./build:/home/node/game/build
    command: devkit debug browser-mobile

I didn’t want to build the game manually, so I used Gitlab CI/CD service to have it runs the container, builds the game and deploys to Gitlab Pages for me. I create this .gitlab-ci.yml file with pages job that build the game into *public* artifacts:

Unlike Github Pages which can only build Jekyll, Gitlab Pages can automatically build almost anything with its CI/CD service.

        stage: deploy
            - docker-compose -f docker-compose.yml -f docker-compose.browser-mobile.yml up
            - cp -a build/debug/browser-mobile/. public/
                - public

Now, everytime I push to my Gitlab repository, the game will be built and served at Gitlab Pages.


Software engineer with 5+ years of work experience in designing and developing cross-platform games and apps on web technology.