Docker在持续集成、测试与部署中的应用实践
发布时间: 2025-08-15 00:20:05 订阅数: 1 

### Docker在持续集成、测试与部署中的应用实践
#### 1. 持续集成与测试基础
在持续集成与测试流程中,我们已经成功让Docker运行起来,并执行了单元测试以及一个简单的“冒烟测试”。对于一个真实的应用程序,我们需要一套完整的测试套件来确保应用程序能正常运行并处理各种输入,但对于简单的演示来说,目前的测试已足够。
##### 1.1 构建触发方式
目前,构建是通过点击“立即构建”手动触发的。不过,更好的方式是在代码提交到GitHub项目时自动触发构建。具体操作如下:
- 在identidock配置中启用“Poll SCM”方法。
- 在文本框中输入“H/5 * * * *”,这将使Jenkins每五分钟检查一次仓库是否有更改,若有更改则安排构建。
这种方法虽然简单有效,但比较浪费资源,且构建可能会有长达五分钟的延迟。更好的解决方案是配置仓库向Jenkins发送更新通知,可通过BitBucket或GitHub的Web Hooks实现,但这要求Jenkins服务器能在公共互联网上访问。
##### 1.2 使用Docker Hub镜像
有些读者可能会问:“为什么要构建镜像呢?”如果你按照前面的步骤操作,应该已经在Docker Hub上设置了自动构建,它会在代码提交到源仓库时触发。我们可以利用Docker Hub的Webhooks功能,在Docker Hub仓库成功构建后自动启动Jenkins构建,然后在脚本中拉取镜像而非构建镜像。不过,这也要求Jenkins服务器能在公共互联网上访问。这种解决方案适用于创建独立Docker镜像的小项目,而大型项目可能更希望控制自己的构建,以获得更高的速度和安全性。
#### 2. 镜像推送与标签管理
测试完Identidock镜像后,我们需要将其推送到后续的流水线阶段。第一步是给镜像打标签并推送到镜像仓库,这样后续阶段就能获取该镜像并推送到暂存或生产环境。
##### 2.1 合理打标签
正确给镜像打标签对于基于容器的流水线的控制和溯源至关重要。如果标签打错,生产环境中运行的镜像将难以与构建过程关联起来,导致调试和维护变得异常困难。对于任何给定的镜像,我们应该能够指出用于创建它的确切Dockerfile和构建上下文。
标签可以随时被覆盖和更改,因此需要创建并执行一个可靠的镜像标签和版本控制流程。对于示例应用程序,我们将给镜像添加两个标签:仓库的git哈希值和newest。这样,newest标签将始终指向通过测试的最新构建,我们可以使用git哈希值来恢复任何镜像的构建文件。以下是更新后的Jenkins构建脚本:
```bash
#Default compose args
COMPOSE_ARGS=" -f jenkins.yml -p jenkins "
#Make sure old containers are gone
sudo docker-compose $COMPOSE_ARGS stop
sudo docker-compose $COMPOSE_ARGS rm --force -v
#build the system
sudo docker-compose $COMPOSE_ARGS build --no-cache
sudo docker-compose $COMPOSE_ARGS up -d
#Run unit tests
sudo docker-compose $COMPOSE_ARGS run --no-deps --rm -e ENV=UNIT identidock
ERR=$?
#Run system test if unit tests passed
if [ $ERR -eq 0 ]; then
IP=$(sudo docker inspect -f {{.NetworkSettings.IPAddress}} \
jenkins_identidock_1)
CODE=$(curl -sL -w "%{http_code}" $IP:9090/monster/bla -o /dev/null) || true
if [ $CODE -eq 200 ]; then
echo "Test passed - Tagging"
HASH=$(git rev-parse --short HEAD)
sudo docker tag -f jenkins_identidock amouat/identidock:$HASH
sudo docker tag -f jenkins_identidock amouat/identidock:newest
echo "Pushing"
sudo docker login -e [email protected] -u jbloggs -p jbloggs123
sudo docker push amouat/identidock:$HASH
sudo docker push amouat/identidock:newest
else
echo "Site returned " $CODE
ERR=1
fi
fi
#Pull down the system
sudo docker-compose $COMPOSE_ARGS stop
sudo docker-compose $COMPOSE_ARGS rm --force -v
return $ERR
```
需要注意的是,你需要根据要推送的仓库适当地重命名标签。例如,如果你的仓库运行在myhost:5000,你需要使用myhost:5000/identidock:newest,同时也要更改docker登录凭证。
##### 2.2 查找镜像的所有标签
每个镜像标签是单独存储的,要发现镜像的所有标签,需要根据镜像ID过滤完整的镜像列表。例如,要查找标签为amouat/identidock:newest的镜像的所有标签,可以使用以下命令:
```bash
$ docker images --no-t
```
0
0
相关推荐










