Как написать сценарий состояния Saltstack, прежде чем обновлять последний репозиторий git, убедитесь, что пункт назначения репо очищен?

Сначала я написал сценарий состояния соленого стека, убедился, что мой локальный каталог всегда такой же новый, как и последний репозиторий git (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

Выполнить в первый раз будет нормально.

Но если новое обновление репо, а затем состояние выполнения снова завершится ошибкой - в каталоге есть локальные файлы, 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/, но использую onlyif, чтобы запустить состояние, когда существует /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, часть Clone/Update почти такая же, за исключением требования.

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

Я думаю, что всегда есть лучшее решение.


person Gohan    schedule 25.06.2014    source источник


Ответы (2)


Может быть, я не понимаю здесь, но я думаю, что мой вариант использования очень похож. У меня есть состояние, у которого есть задача убедиться, что все репозитории находятся в правильном состоянии, это также означает, что они чистые, а файлы, созданные во время сборки, должны быть удалены.

В целом, я думаю, это не имеет большого отношения к соли, просто перезагрузите свое репо, прежде чем обновлять его:

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

Это часть сценария оболочки, который представляет мою сборку. Если ваш каталог уже чист, ваше состояние не выйдет из строя. Вы всегда можете очистить его.

И вы всегда можете написать сценарии/состояния с отслеживанием состояния и сообщить об этом в соль:

echo ""
echo "changed=no comment='Build failed, reason: ...'"
exit 1;
person codewandler    schedule 18.09.2014
comment
Извините, что не упомянул, что проблема была прекрасно решена Даниэлем Ягсентом в соляном сообществе groups.google.com/forum/#!topic/salt-users/8SQG9KNEu44 - person Gohan; 22.09.2014

Проблема была отлично решена Дэниелом Ягсеном в солевом сообществе: 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

Насколько мне известно, cwd происходит перед проверкой onlyif. Так

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

должно сработать.

person Gohan    schedule 22.09.2014