首先我编写了一个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
我认为总有更好的解决方案。
答案 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
应该有用。