介绍
在本文中,我们将介绍如何使用Github,Travis-CI和Docker Hub创建一个简单的持续集成过程。
项目
这次使用的一个项目是自己写的一个爬虫小程序(https://github.com/Han-Ya-Jun/news_watch_notice)
项目目录
1 2 3 4 5 6 7 8 9 10 11 12
| news_watch_notice ├── cmd //main ├── conf ├── dis ├── Dockerfile ├── Makefile ├── pkg ├── qrcode ├── .travis.yml ├── README.md ├── vendor ├── utils
|
Dockerfile
1 2 3 4 5 6 7 8
| 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| 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
1 2 3 4 5 6 7 8 9 10 11 12 13
| language: go go: # 语言版本号 - "1.11.5" # 默认使用最新版本,注意,需要 "1.10" 版本的时候必须表示为字符串形式,如果写成 1.10 则会使用 1.1 版本;x表示对应前缀的最新版本 services: - docker #需要的docker环境
install: - make image-dev #build
script: - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin - make push-dev # push
|
打开项目ci开关
设置docker hub的用户和密码环境变量(push需要登录认证)
1 2 3
| DOCKER_PASSWORD
DOCKER_USERNAME
|
提交项目代码触发ci
部分ci日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
| 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.
|
成功将项目打包成image并推送到docker hub上