Go project on github uses Travis CI and Docker Hub to achieve continuous integration

introduce

In this article, we will show you how to create a simple continuous integration process using Github, Travis Ci, and Docker Hub.

project

One of the projects used this time is a crawler program written by myself( https://github.com/Han-Ya-Jun...

Project directory

news_watch_notice
├── cmd    //main
├── conf
├── dis
├── Dockerfile
├── Makefile
├── pkg
├── qrcode
├── .travis.yml
├── README.md
├── vendor
├── utils

Dockerfile

FROM alpine:3.6

MAINTAINER hanyajun0123@gmail.com
RUN apk update && apk add curl bash tree tzdata \
    && cp -r -f /usr/share/zoneinfo/Hongkong /etc/localtime
ADD news_watch_notice /usr/bin/
ADD news_watch_notice.sha /usr/bin/
CMD ["news_watch_notice"]

makefile

TARGET=news_watch_notice
PKG=$(TARGET)
TAG=latest
IMAGE_PREFIX?=hanyajun
IMAGE_PREFIX_PRD=hanyajun
TARGET_IMAGE_DEV=$(IMAGE_PREFIX)/$(TARGET):$(TAG)
TARGET_IMAGE_PRD=$(IMAGE_PREFIX_PRD)/$(TARGET):$(TAG)
all: image

$(TARGET):
    CGO_ENABLED=0 go build -o dist/$(TARGET) $(PKG)/cmd

gitlog:


target:
    mkdir -p dist
    git log | head -n 1 > dist/news_watch_notice.sha
    docker run --rm -i -v `pwd`:/go/src/$(PKG) \
      -w /go/src/$(PKG) golang:1.11.5 \
      make $(TARGET)

image-dev: target
    cd dist && cp ../Dockerfile ./ && \
    docker build -t $(TARGET_IMAGE_DEV) .

push-dev:
    docker push $(TARGET_IMAGE_DEV)

image-prd: target
    cd dist && cp ../Dockerfile ./ && \
    docker build -t $(TARGET_IMAGE_PRD) .

push-prd:
    docker push $(TARGET_IMAGE_PRD)
clean:
    rm -rf dist

.PHONY: image target clean push $(TARGET)

.travis.yml

language: go
go:          # Language version number
  - "1.11.5"   # The latest version is used by default. Note that when version 1.10 is needed, it must be represented as a string. If it is written as 1.10, version 1.1 will be used. x indicates the latest version of the corresponding prefix
services:
  - docker  #docker environment required


install:
  - make image-dev  #build

script:
  - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
  - make push-dev  # push

travis configuration( https://travis-ci.org)

Open project ci switch

Set the user and password environment variables of docker hub (push requires login authentication)

DOCKER_PASSWORD

DOCKER_USERNAME

Submit project code trigger ci

Partial ci log

docker_mtu
docker stop/waiting
docker start/running, process 3638
services
0.02s$ sudo service docker start
start: Job is already running: docker
Updating gimme
git.checkout
0.85s$ git clone --depth=50 --branch=master https://github.com/Han-Ya-Jun/news_watch_notice.git Han-Ya-Jun/news_watch_notice
Cloning into 'Han-Ya-Jun/news_watch_notice'...
$ cd Han-Ya-Jun/news_watch_notice
$ git checkout -qf e05633a1c6e0c3289c85aedf28461b718fe1af13
$ travis_export_go 1.11.5 github.com/Han-Ya-Jun/news_watch_notice
Setting environment variables from repository settings
$ export DOCKER_PASSWORD=[secure]
$ export DOCKER_USERNAME=[secure]
$ export GOBIN=$GOPATH/src/bin
6.93s$ travis_setup_go
go version go1.11.5 linux/amd64
$ export GOPATH="/home/travis/gopath"
$ export PATH="/home/travis/gopath/bin:/home/travis/.gimme/versions/go1.11.5.linux.amd64/bin:/home/travis/bin:/home/travis/bin:/home/travis/.local/bin:/opt/pyenv/shims:/home/travis/.phpenv/shims:/home/travis/perl5/perlbrew/bin:/home/travis/.nvm/versions/node/v8.9.1/bin:/home/travis/.kiex/elixirs/elixir-1.4.5/bin:/home/travis/.kiex/bin:/home/travis/.rvm/gems/ruby-2.4.1/bin:/home/travis/.rvm/gems/ruby-2.4.1@global/bin:/home/travis/.rvm/rubies/ruby-2.4.1/bin:/home/travis/gopath/bin:/home/travis/.gimme/versions/go1.7.4.linux.amd64/bin:/usr/local/phantomjs/bin:/usr/local/phantomjs:/usr/local/neo4j-3.2.7/bin:/usr/local/maven-3.5.2/bin:/usr/local/cmake-3.9.2/bin:/usr/local/clang-5.0.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/travis/.rvm/bin:/home/travis/.phpenv/bin:/opt/pyenv/bin:/home/travis/.yarn/bin"
$ export GO111MODULE="auto"
$ gimme version
v1.5.3
$ go version
go version go1.11.5 linux/amd64
go.env
$ go env
GOARCH="amd64"
GOBIN="/home/travis/gopath/src/bin"
GOCACHE="/home/travis/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/travis/gopath"
GOPROXY=""
GORACE=""
GOROOT="/home/travis/.gimme/versions/go1.11.5.linux.amd64"
GOTMPDIR=""
GOTOOLDIR="/home/travis/.gimme/versions/go1.11.5.linux.amd64/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build083711362=/tmp/go-build -gno-record-gcc-switches"
install
43.66s$ make image-dev
mkdir -p dist
git log | head -n 1 > dist/news_watch_notice.sha
docker run --rm -i -v `pwd`:/go/src/news_watch_notice \
      -w /go/src/news_watch_notice golang:1.11.5 \
      make news_watch_notice
Unable to find image 'golang:1.11.5' locally
1.11.5: Pulling from library/golang
22dbe790f715: Pulling fs layer
0250231711a0: Pulling fs layer
6fba9447437b: Pulling fs layer
c2b4d327b352: Pulling fs layer
619f4932b7ea: Pulling fs layer
e2fd6cbd3c6f: Pulling fs layer
1d96446d2b20: Pulling fs layer
c2b4d327b352: Waiting
e2fd6cbd3c6f: Waiting
1d96446d2b20: Waiting
619f4932b7ea: Waiting
6fba9447437b: Verifying Checksum
6fba9447437b: Download complete
0250231711a0: Download complete
22dbe790f715: Verifying Checksum
22dbe790f715: Download complete
c2b4d327b352: Verifying Checksum
c2b4d327b352: Download complete
619f4932b7ea: Verifying Checksum
619f4932b7ea: Download complete
1d96446d2b20: Verifying Checksum
1d96446d2b20: Download complete
e2fd6cbd3c6f: Verifying Checksum
e2fd6cbd3c6f: Download complete
22dbe790f715: Pull complete
0250231711a0: Pull complete
6fba9447437b: Pull complete
c2b4d327b352: Pull complete
619f4932b7ea: Pull complete
e2fd6cbd3c6f: Pull complete
1d96446d2b20: Pull complete
Digest: sha256:342872745847966ab630e9cc5b6980ed3fe7f4e3ea44b10efac995575730c9b8
Status: Downloaded newer image for golang:1.11.5
CGO_ENABLED=0 go build -o dist/news_watch_notice news_watch_notice/cmd
cd dist && cp ../Dockerfile ./ && \
    docker build -t [secure]/news_watch_notice:latest .
Sending build context to Docker daemon  14.78MB
Step 1/6 : FROM alpine:3.6
3.6: Pulling from library/alpine
5a3ea8efae5d: Pulling fs layer
5a3ea8efae5d: Verifying Checksum
5a3ea8efae5d: Download complete
5a3ea8efae5d: Pull complete
Digest: sha256:ee0c0e7b6b20b175f5ffb1bbd48b41d94891b0b1074f2721acb008aafdf25417
Status: Downloaded newer image for alpine:3.6
 ---> 43773d1dba76
Step 2/6 : MAINTAINER [secure]0123@gmail.com
 ---> Running in 1f4d4d0db1cb
 ---> 0eadcccd5d22
Removing intermediate container 1f4d4d0db1cb
Step 3/6 : RUN apk update && apk add curl bash tree tzdata     && cp -r -f /usr/share/zoneinfo/Hongkong /etc/localtime
 ---> Running in 7f859dd06afc
fetch http://dl-cdn.alpinelinux.org/alpine/v3.6/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.6/community/x86_64/APKINDEX.tar.gz
v3.6.5-39-gbdcdc921e8 [http://dl-cdn.alpinelinux.org/alpine/v3.6/main]
v3.6.5-34-gf0ba0b43d5 [http://dl-cdn.alpinelinux.org/alpine/v3.6/community]
OK: 8442 distinct packages available
(1/11) Installing ncurses-terminfo-base (6.0_p20171125-r1)
(2/11) Installing ncurses-terminfo (6.0_p20171125-r1)
(3/11) Installing ncurses-libs (6.0_p20171125-r1)
(4/11) Installing readline (6.3.008-r5)
(5/11) Installing bash (4.3.48-r1)
Executing bash-4.3.48-r1.post-install
(6/11) Installing ca-certificates (20161130-r2)
(7/11) Installing libssh2 (1.8.2-r0)
(8/11) Installing libcurl (7.61.1-r2)
(9/11) Installing curl (7.61.1-r2)
(10/11) Installing tree (1.7.0-r0)
(11/11) Installing tzdata (2019a-r0)
Executing busybox-1.26.2-r11.trigger
Executing ca-certificates-20161130-r2.trigger
OK: 17 MiB in 24 packages
 ---> f923b8dbfbf2
Removing intermediate container 7f859dd06afc
Step 4/6 : ADD news_watch_notice /usr/bin/
 ---> a855f5307179
Step 5/6 : ADD news_watch_notice.sha /usr/bin/
 ---> 9014ba35ce0f
Step 6/6 : CMD news_watch_notice
 ---> Running in 109449b18721
 ---> acb6623feb46
Removing intermediate container 109449b18721
Successfully built acb6623feb46
Successfully tagged [secure]/news_watch_notice:latest
0.49s$ echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
Login Succeeded
The command "echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin" exited with 0.
5.21s$ make push-dev
docker push [secure]/news_watch_notice:latest
The push refers to a repository [docker.io/[secure]/news_watch_notice]
c0546ad83870: Preparing
869b27ab7e53: Preparing
47b50a8202a0: Preparing
721384ec99e5: Preparing
721384ec99e5: Layer already exists
c0546ad83870: Pushed
47b50a8202a0: Pushed
869b27ab7e53: Pushed
latest: digest: sha256:74a706f3f8b5b2ead4a7722ca72d8f1eaa450801847662402e4e3e34f4d73158 size: 1157
The command "make push-dev" exited with 0.

Successfully packaged the project as image and pushed it to the docker hub

Tags: Linux Docker git github

Posted on Sun, 10 Nov 2019 10:44:36 -0500 by atzi