github上Go项目使用Travis CI和Docker Hub实现持续集成

使用Travis CI和Docker Hub实现持续集成

本文已被阅读过 Posted by 韩亚军 on 2019-05-16

介绍

在本文中,我们将介绍如何使用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

travis的配置(https://travis-ci.org)

打开项目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上




推荐文章



支付宝打赏 微信打赏

坚持原创技术分享,您的支持将鼓励我继续创作!