drone的坑也有一些。

下面的脚本只能重启docker容器,无法启动docker容器。但是将shell脚本移动到.sh文件中,就正常了😱。

修改前的脚本是这样的。

  - name: restart application by docker-compose
    image: docker/compose:1.23.1
    volumes:
      - name: dockersock
        path: /var/run/
      - name: workbench_dir
        path: /root/workbench_dir
    commands:
      - |
        server_existed=$(docker-compose -f /drone/src/docs/docker-web/docker-compose.yml ps | grep 'java')
        if [ "$server_existed" == "" ]; then
          echo api-web up -d
          docker-compose -f /drone/src/docs/docker-web/docker-compose.yml up -d
        else
          echo api-web restart
          docker-compose -f /drone/src/docs/docker-web/docker-compose.yml restart
        fi

并且,上面的脚本中把 /drone/src/docs/docker-web/docker-compose.yml 定义成变量dc_file,然后在里面使用,无论是${dc_file} $dc_file "${dc_file}" $$dc_file \$$dc_file都不正常获取到值。修改成下面这样,就完全正常了。

  - name: restart application by docker-compose
    image: docker/compose:1.23.1
    volumes:
      - name: dockersock
        path: /var/run/
      - name: workbench_dir
        path: /root/workbench_dir
    commands:
      - sh /drone/src/docs/scripts-for-drone-ci/ci-restart-docker.sh

ci-restart-docker.sh的内容如下:

#!/bin/bash

# if place the code in .drone.yml : only restart docker, cannot start it up
# but if place in an sh file: it works all.
dc_file=/drone/src/docs/docker-web/docker-compose.yml
log_text=$(docker-compose -f ${dc_file} ps | grep 'java')
echo "log_text=[$log_text]"
if [ "$log_text" == "" ]; then
  docker-compose -f ${dc_file} up -d
else
  docker-compose -f ${dc_file} restart
fi
# end