Make a script at .travis/docker_push:
Developers should feel free to update the functionality of this embed their custom workflow, tagging, branch structure, etc., this is just a simple baseline stolen from the early stages of asym-crypto-yaml.

#!/bin/bash

echo "$DOCKER_PASSWORD" | docker login -u $DOCKER_USERNAME --password-stdin

if [ ! -z "${TRAVIS_TAG}" ]; then
    docker tag edxops/MY_REPO:latest edxops/MY_REPO:${TRAVIS_TAG}
	docker push edxops/MY_REPO:${TRAVIS_TAG}
fi

docker push edxops/MY_REPO:latest


Login to docker hub ad the edxbuilder user and create a new API key for your repo and encrypt it as follows.

Add --pro to travis encrypt command if using a private repo

$ travis encrypt --add env.global
Reading from stdin, press Ctrl+D when done
DOCKER_PASSWORD=PASTE_API_KEY_HERE
$


Set the DOCKER_USERNAME variable in .travis.yml to edxbuilder

Your .travis.yml file should look like this.

$ cat .travis.yml
services:
- docker
sudo: required
script:
- make docker_build docker_tag
env:
  matrix:
  - DOCKER_USERNAME=edxbuilder
  global:
  - secure: tl7BX1c2BkjgObJ+VDIfdB9IshpC01gklxiw5WQ1ubG05TbSmp1OvvUrFNwQ81KWb2tkjM0Jq1wnxzNCRyqwqgptPB5fGflxT0CVGKVJYBM5ZpPH2QNcwdxkH8fqZNaY/MpO45UI2qwKRxqouEkg71tVpjYdxFf/C1SrLRfQgtUNjA9g5OEXGw7dzKmvs3vjn6j5n5wBTM3pcNgiKRM7vnW920tQRKoJ8C6sqOnBnUP8CcnCnN+Qdgr5MGPf2ucKLMbdWO8ssAGuZ1eKMAbCVxmd10utQHch1ra4xS0tQDc/yK67iVu05CIvhe27YRAaJ14NSQUDDqbQqUWpxW9zr5ucMfr8LP6jHN34Qxq5h7Y4AK1vHkDBGajNJAbx07JcXQn/9l0C4uwdTjK5N0FVE/jSkJIjhjmyZ4dk8BGunKyYZVHcnqiTBGwx9t9xJLQH3J3C0IeeGLchnHeA5ONaIeShdtg98SNMMMkfJ8pQGXK4GOkMehnIFwYDUAISf1ID9rCmTQ9w9lO6JNBLxGdVTNKqwqC6J71vgQz7oTHF5iG9RZr7ouBlIplohGdhZ0Rta0vzEfxofWEMdP3RArYomz/0ynFYP19DpI9Fzf3hirRGI8Bet2mQzvH6m7WF5YBxCX0JCkst2fvNml0ZOZTVVB3qwts2/F4FBSniK+yeRPg=
  - secure: HhndVFqd0GD2Wnr+bkIFZlfARy5VgprItWpSHV+AmXxkwue57eZmrJFfS+9IXEkwsPwt9OaP3l5N1QJ7/XdXCiXmBSx1M5+ME2xKy8ZviyIAQOHynT8NDiQqn91edhhjT4H3mqm/RLNE5emrUZAIAUXdpglvm+R3IsncdZqzRv05pnXStjDOm9ILd2LDW2AkUJ0wczm6ZWap4E/C72/iO5XbT0yFfzcmh6kJIUUSnu+plehHAVPXrE6u153dZK9+jgtxlBKq6iUUkvLQXn47ag2Ah7o4GxxIFhIb8lGesRRwQ4k2jl+Xe3zgYp6Gcue1Ue4IXqGOVVlT+McWF20MjjU8r+18EWqLs1JVk5dTtfvrxdwCibAx3HvAke/PUMjfg58r78sW7GQ4lzSBpxMjnh51SVkbu08nT2+qQfCzhIusP3E7YRs96MDX6eyU25qwrzcPaVOAP5E3HT3nr5VNqyaqp3MPWCxgNfpACncy+BeeEV7KsXxejVu6CDlys2DwVn/6tgSwR/DtzJRV1w671gLDoUb3cCbbjj3T31rKBqneXEJiZ0JLBQyVkGLpUiewmP1i7XsWI0U8WPmhmwK+x1Iw/xdzP4yzdc7LpMbBxqtvW10Wx3NovvDbs6xdOZYFnx2K9TTXdsSmgjcV9xUkoepTRJTSGz9E+O74ai6hZ84=
deploy:
  provider: script
  script: make docker_push
  on:
    branch: master


Your Makefile might look something like the following. The important bit is the docker_auth step.

$ cat Makefile   
.PHONY: docker_build docker_tag docker_auth docker_push
.DEFAULT_GOAL := docker_tag

docker_build:
        docker build . -f Dockerfile -t edxops/ecr-cred-helper

docker_tag: docker_build
        docker tag edxops/ecr-cred-helper edxops/ecr-cred-helper:1.14
        docker tag edxops/ecr-cred-helper edxops/ecr-cred-helper:1.14.6
        docker tag edxops/ecr-cred-helper edxops/ecr-cred-helper:$$TRAVIS_COMMIT

docker_auth:
        echo "$$DOCKER_PASSWORD" | docker login -u "$$DOCKER_USERNAME" --password-stdin

docker_push: docker_tag docker_auth ## push to docker hub
        docker push 'edxops/ecr-cred-helper:latest'
        docker push "edxops/ecr-cred-helper:$$TRAVIS_COMMIT"
        docker push 'edxops/ecr-cred-helper:1.14'
        docker push 'edxops/ecr-cred-helper:1.14.6'


See https://github.com/edx/ecr-cred-helper/pull/1/files as an example




If you need help configuring it for multiple providers look at the syntax here:
https://docs.travis-ci.com/user/deployment#deploying-to-multiple-providers