如何在更新最新的git repo之前编写Saltstack状态脚本,确保repo目的地是清理的?

时间:2014-06-25 15:50:08

标签: git salt-stack

首先我编写了一个saltstack状态脚本,确保我的本地目录始终与最新的git repo(Shadowsocks .etc)一样新,然后编译目录:

Clone Shadowsocks Github:
  git.latest:
    - name: https://github.com/madeye/shadowsocks-libev.git
    - target: /usr/share/shadowsocks/
    - require:
      - pkg: Install Shadowsocks Depend Pkgs
      - cmd: Revert All

Build Shadowsocks Command:
  cmd.run:
    - name: |
        ./configure
        make
        make install
    - cwd: /usr/share/shadowsocks/
    - require:
      - git: Clone Shadowsocks Github

第一次执行会很好。

但是如果repo new update再次执行状态将失败 - 目录中有本地文件,git.latest出现冲突,需要先清理。

所以我添加了一个恢复状态:

Revert All:
  cmd.run:
    - name: |
        git checkout .
    - cwd: /usr/share/shadowsocks/
    - onlyif: ls /usr/share/shadowsocks

Clone Shadowsocks Github:
  git.latest:
    - name: https://github.com/madeye/shadowsocks-libev.git
    - target: /usr/share/shadowsocks/
    - require:
      - pkg: Install Shadowsocks Depend Pkgs
      - cmd: Revert All

Build Shadowsocks Command:
  cmd.run:
    - name: |
        ./configure
        make
        make install
    - cwd: /usr/share/shadowsocks/
    - require:
      - git: Clone Shadowsocks Github

然后它运行良好,但是当我rm -rf /usr/share/shadowsocks目录时,状态脚本失败:Comment: Desired working directory "/usr/share/shadowsocks/" is not available

我解决的问题是- cwd: /usr/share/shadowsocks/,但我只使用ifif来在/ usr / share / shadowsocks存在时运行状态。

是否可以按如下方式编写状态流?:

如果/ usr / share / shadowsocks存在:

Revert All: - > Clone/Update Git Repo - > Build it

否则:

Clone/Update Git Repo - > Build it

如何简化?

我最终使用了一个丑陋的解决方案:

Clone Git Repo(如果还原错误) - > Revert - > Update Git Repo - > Build, 除了要求之外,克隆/更新部分几乎相同。

Revert All:
  cmd.run:
    - name: |
        git checkout .
    - cwd: /usr/share/shadowsocks/
    - onlyif: ls /usr/share/shadowsocks
    - onfail:
       - git: Clone Shadowsocks Github

Clone Shadowsocks Github:
  git.latest:
    - name: https://github.com/madeye/shadowsocks-libev.git
    - target: /usr/share/shadowsocks/
    - require:
      - pkg: Install Shadowsocks Depend Pkgs

Update Shadowsocks Github:
  git.latest:
    - name: https://github.com/madeye/shadowsocks-libev.git
    - target: /usr/share/shadowsocks/
    - require:
      - pkg: Install Shadowsocks Depend Pkgs
      - cmd: Revert All

Build Shadowsocks Command:
  cmd.run:
    - name: |
        ./configure
        make
        make install
    - cwd: /usr/share/shadowsocks/
    - require:
      - git: Update Shadowsocks Github

我认为总有更好的解决方案。

2 个答案:

答案 0 :(得分:1)

也许我不明白这一点,但我认为我的用例非常相似。我的状态是确保所有存储库都处于正确状态,这也意味着它们是干净的,并且必须删除在构建期间创建的文件。

一般来说,它与盐没什么关系,我想,只需在更新之前重置你的回购:

....
cd $APP_DIR;
git clean  -d  -fx ""
git checkout $BRANCH
git pull
...

这是代表我的构建的shell脚本的一部分。如果您的目录已经是干净的,那么您的状态不会失败。你总是可以清理它。

你总是可以编写有状态的脚本/状态并与salt通信:

echo ""
echo "changed=no comment='Build failed, reason: ...'"
exit 1;

答案 1 :(得分:0)

盐社区的 Daniel Jagszen 完美解决了这个问题: https://groups.google.com/forum/#!topic/salt-users/8SQG9KNEu44

这可能是因为" cwd"参数

Revert All:
  cmd.run:
    - name: |
        git checkout .
    - cwd: /usr/share/shadowsocks/
    - onlyif: ls /usr/share/shadowsocks

AFAIK cwd发生在onlyif检查之前。所以

Revert All:
  cmd.run:
    - name: cd /usr/share/shadowsocks/ && git checkout .
    - onlyif: test -d /usr/share/shadowsocks

应该有用。