Skip to content

Commit d136934

Browse files
committed
feature: ci/cd from 0 to 1
1 parent 11b9686 commit d136934

File tree

2 files changed

+254
-0
lines changed

2 files changed

+254
-0
lines changed
Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
# 从0到1,完整的CI-CD流程
2+
3+
## 1. 项目的基本配置
4+
5+
- OverView
6+
7+
项目使用 `dev``qa``prod` 三套不同的环境,具体可以参考项目代码。
8+
9+
## 2. 完整的Build脚本
10+
11+
#### 2.1. 使用maven打包
12+
13+
- `docker-compose-maven.yml`
14+
15+
```
16+
version: "3.7"
17+
networks:
18+
build:
19+
services:
20+
maven:
21+
image: maven:3.6.0-jdk-8
22+
working_dir: /ci-cd-demo
23+
volumes:
24+
- ../:/ci-cd-demo
25+
- ~/m2/repository:/root/.m2/repository
26+
command: mvn -Pprod -DskipTests=true package -f pom.xml
27+
networks:
28+
- build
29+
```
30+
31+
- 执行 `docker-compose` 命令
32+
33+
`$ docker-compose -f provisioning/docker-compose-maven.yml run --rm maven`
34+
35+
运行结果:
36+
37+
![](http://cdn.heroxu.com/20190918156877799037354.png)
38+
39+
- 直接运行,检查 `jar` 包是否正常
40+
41+
`$ java -jar ci-cd-demo.jar`
42+
43+
运行结果:
44+
45+
![](http://cdn.heroxu.com/20190918156877771978453.png)
46+
47+
- 请求接口
48+
49+
`http://localhost:8080/test`
50+
51+
返回数据:X_TEST_CONFIG
52+
53+
说明使用的 `prod` 的配置,但是变量没有被替换
54+
55+
#### 2.2. 编写 `Dockerfile`
56+
57+
- OverView
58+
59+
有了应用的 `jar` 包,可以开始编译镜像了,实际上镜像里面就是一个 `java` 程序来执行 `jar` 包,但是我们需要替换一些配置。
60+
61+
- `provisioning/Dockerfile`
62+
63+
```
64+
FROM java:openjdk-8-jdk
65+
ARG project=ci-cd-demo
66+
ARG profile=prod
67+
68+
ENV PATH=.:$PATH
69+
70+
WORKDIR /opt/ci-cd-demo
71+
72+
73+
COPY ./target/ci-cd-demo.jar /opt/ci-cd-demo/ci-cd-demo.jar
74+
COPY ./target/classes/application.yml /opt/ci-cd-demo/application.yml
75+
COPY ./provisioning/docker-entrypoint.sh /opt/ci-cd-demo/docker-entrypoint.sh
76+
77+
EXPOSE 8080
78+
VOLUME /opt/ci-cd-demo/logs
79+
VOLUME /opt/ci-cd-demo/data
80+
81+
ENTRYPOINT ["docker-entrypoint.sh"]
82+
CMD [""]
83+
```
84+
85+
- `docker-entrypoint.sh`
86+
87+
```
88+
#!/bin/bash
89+
90+
profile="${profile}"
91+
project="${project}"
92+
93+
JAVA_OPT="${JAVA_OPT:=-Xmx2g}"
94+
95+
X_TEST_CONFIG="${X_TEST_CONFIG}"
96+
97+
config(){
98+
if [[ -z "${X_TEST_CONFIG}" ]]; then
99+
echo -e "\n\"X_TEST_CONFIG\" can not be empty!\n"
100+
else
101+
sed -i "s#X_TEST_CONFIG#${X_TEST_CONFIG}#g" /opt/${project}/application.yml
102+
fi
103+
}
104+
105+
config
106+
107+
exec java ${JAVA_OPT} -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./logs/gc-$(date +%F).log -Dfile.encoding=utf-8 -jar ${project}.jar --spring.config.location=application.yml --spring.profiles.active=${profile} ${@}
108+
```
109+
110+
#### 2.3 编写 `docker-compose` ,构建镜像
111+
112+
- OverView
113+
114+
准备好了 `Dockerfile` ,可以通过 `docker-compose` 来 `build` 应用了。
115+
116+
- `docker-compose.yml`
117+
118+
```
119+
version: "3.7"
120+
networks:
121+
netdci:
122+
123+
services:
124+
ci-cd-demo:
125+
build:
126+
context: ./
127+
dockerfile: ./provisioning/Dockerfile
128+
args:
129+
- project=ci-cd-demo
130+
- profile=prod
131+
image: skycitygalaxy/ci-cd-demo
132+
environment:
133+
- project=ci-cd-demo
134+
- profile=prod
135+
- X_TEST_CONFIG=xu
136+
volumes:
137+
- /opt/logs/ci-cd-demo/:/opt/ci-cd-demo/logs/
138+
- /etc/hosts:/etc/hosts
139+
ports:
140+
- 17001:8080
141+
networks:
142+
- netdci
143+
restart: always
144+
```
145+
146+
- 直接执行命令
147+
148+
`docker-compose build`
149+
150+
![](http://cdn.heroxu.com/20190920156896341020629.png)
151+
152+
#### 2.4 上传镜像
153+
154+
- OverView
155+
156+
把本地的镜像上传到我们的镜像仓库,这里使用 `Dockerhub` 的仓库
157+
158+
- Tag
159+
160+
`docker tag skycitygalaxy/ci-cd-demo:latest skycitygalaxy/ci-cd-demo:v1`
161+
162+
- Push
163+
164+
`docker push skycitygalaxy/ci-cd-demo:v1`
165+
166+
#### 2.5 使用脚本来快捷触发操作
167+
168+
- `docker.sh`
169+
170+
```
171+
#!/bin/bash
172+
173+
PS4='+ $(date +"%F %T%z") ${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
174+
175+
#set -xue
176+
set -x
177+
178+
179+
VERSION="release-v"
180+
181+
AP_PROJECT="ci-cd-demo"
182+
AP_REGISTRY="skycitygalaxy"
183+
AP_NAMESPACE="ci-cd-demo"
184+
185+
186+
cd "$(dirname $0)"
187+
basedir="$(dirname $(pwd))"
188+
cd ${basedir}
189+
190+
191+
docker_build() {
192+
git log -n 1|head -3 > VERSION
193+
echo -e "Build:\t$(date '+%F %T')" >> VERSION
194+
echo -e "Branch:\t$(git branch|grep ^*)" >> VERSION
195+
196+
docker images | grep ${AP_PROJECT} | awk '{print $3}' | xargs docker rmi -f
197+
docker-compose -f provisioning/docker-compose-maven.yml run --rm maven
198+
docker-compose build
199+
}
200+
201+
202+
docker_push() {
203+
tag="$1"
204+
[[ "$tag" == "" ]] && tag="${VERSION}-$(git rev-parse --short HEAD)"
205+
for i in $(docker images | grep "${AP_REGISTRY}/${AP_NAMESPACE}" | awk '{print $1}');
206+
do
207+
docker tag ${i} ${i}:${tag};
208+
docker push $i:${tag};
209+
docker push $i;
210+
docker rmi $i:${tag};
211+
done
212+
}
213+
214+
215+
docker_$1
216+
```
217+
218+
- build
219+
220+
`./provisioning/docker.sh build`
221+
222+
- push
223+
224+
`./provisioning/docker.sh push`
225+
226+
227+
## 3. 使用Jenkins实现自动部署
228+
229+
- Overview
230+
231+
参考 -> [使用Jenkins实现自动部署](./Jenkins/使用Jenkins实现自动部署.md)
232+
233+
234+
## 4. 在Rancher上部署新的应用
235+
236+
- 配置服务
237+
238+
![](http://cdn.heroxu.com/20190920156896427441678.png)
239+
240+
- 测试服务
241+
242+
![](http://cdn.heroxu.com/20190920156896436878741.png)
243+
244+
返回数据:xu
245+
246+
说明返回了正确的配置数据
247+
248+
## 5. 项目Demo
249+
250+
- Overview
251+
252+
参考 -> [ci-cd-demo](https://github.com/MyHerux/ci-cd-demo)

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
### CI/CD
1212

13+
- [从0到1,完整的CI-CD流程](./Program/CI&CD/从0到1,完整的CI-CD流程.md)
14+
1315
#### Jenkins
1416

1517
- [使用Jenkins实现自动部署](./Program/CI&CD/Jenkins/使用Jenkins实现自动部署.md)

0 commit comments

Comments
 (0)