|
| 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 | +  |
| 38 | +
|
| 39 | +- 直接运行,检查 `jar` 包是否正常 |
| 40 | +
|
| 41 | + `$ java -jar ci-cd-demo.jar` |
| 42 | +
|
| 43 | + 运行结果: |
| 44 | +
|
| 45 | +  |
| 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 | +  |
| 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 | +  |
| 239 | +
|
| 240 | +- 测试服务 |
| 241 | +
|
| 242 | +  |
| 243 | +
|
| 244 | + 返回数据:xu |
| 245 | +
|
| 246 | + 说明返回了正确的配置数据 |
| 247 | +
|
| 248 | +## 5. 项目Demo |
| 249 | +
|
| 250 | +- Overview |
| 251 | +
|
| 252 | + 参考 -> [ci-cd-demo](https://github.com/MyHerux/ci-cd-demo) |
0 commit comments