자식, nagios 및 후크, 손상된 자식 repo


14

배경

우리는 인프라를 모니터링하기 위해 nagios를 사용하고 있습니다. 현재 버전 제어에 nagios 구성이 없으며 nagios 구성을 관리하는 두 사람이 있습니다. 따라서 구문 검사를 수행하기 위해 후크를 사용하여 nagios 구성을 중앙 git 저장소로 가져오고 구성이 좋아 보인다면 "활성화"합니다. 내가 사용하고 이 사람의 시작 지점으로 게시물을.

구현하려는 일반적인 워크 플로는 다음과 같습니다.

  1. nagios 설정의 로컬 git repo를 편집하십시오. 편집 된 파일을 추가하고 로컬로 커밋합니다.
  2. git push origin master 원격 저장소에.
  3. 푸시는 파일을 가져 와서 서버의 임시 디렉토리로 이동 한 후 nagios 구문 검사기를 통해 실행하는 사전 수신 후크에 의해 차단됩니다.
  4. 구문 검사기가 통과하면 푸시를 수락 한 다음 git pull새 코드에 대한 커밋 후 후크를 라이브 nagios 구성 디렉토리로 사용한 다음 nagios를 다시 시작하십시오.
  5. 구문 검사기가 실패하면 푸시를 거부하고 사용자에게 nagios 구문 오류를 표시하십시오.

그러나 nagios 구성의 구문 오류로 인해 git push를 거부하면 이상한 동작이 발생합니다. 내가 일어날 것으로 예상되는 것은 후크를 거부하면 푸시 시도가 저장소를 원래 상태 그대로 그대로 두어야한다는 것입니다. 그러나 그렇지 않은 것 같습니다. 다음은 내가보고있는 세부 사항입니다.

문제

구문 오류를 포함하여 의도적으로 nagios 구성을 로컬로 편집하고 로컬로 추가 한 다음 커밋합니다.

host:nagios erik$ vi nagios.cfg
host:nagios erik$ git add nagios.cfg
host:nagios erik$ git commit -m "syntax error"
[master da71aed] syntax error
 1 files changed, 1 insertions(+), 0 deletions(-)

이제 변경 사항을 마스터 리포지토리로 푸시합니다. 구문 오류로 인해 거부됩니다.

host:nagios erik$ git push origin master
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 12.74 KiB, done.
Total 3 (delta 1), reused 2 (delta 1)
remote: Previous HEAD position was 3ddc880... removed syntax error
remote: HEAD is now at da71aed... syntax error
remote: Nagios Config Check Exit Status: 254
remote: Your configs did not parse correctly, there was an error. Output follows.
remote:
remote: Nagios Core 3.2.3
remote: Copyright (c) 2009-2010 Nagios Core Development Team and Community Contributors
remote: Copyright (c) 1999-2009 Ethan Galstad
remote: Last Modified: 10-03-2010
remote: License: GPL
remote:
remote: Website: http://www.nagios.org
remote: Reading configuration data...
remote: Error in configuration file '/tmp/nagiosworkdir/nagios.cfg' - Line 23 (NULL value)
remote:    Error processing main config file!
remote:
remote:
remote:
remote: ***> One or more problems was encountered while processing the config files...
remote:
remote:      Check your configuration file(s) to ensure that they contain valid
remote:      directives and data defintions.  If you are upgrading from a previous
remote:      version of Nagios, you should be aware that some variables/definitions
remote:      may have been removed or modified in this version.  Make sure to read
remote:      the HTML documentation regarding the config files, as well as the
remote:      'Whats New' section to find out what has changed.
remote:
To git@remote-server.example.com:nagios
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@remote-server.example.com:nagios'

안된다 원격 REPO를 만진하지만했다. 다른 로컬 임시 디렉토리로 변경하고 저장소를 복제하려고하면 다음과 같은 결과가 나타납니다.

host:temp erik$ git clone git@remote-server.example.com:nagios
Cloning into nagios...
remote: Counting objects: 30, done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 30 (delta 12), reused 0 (delta 0)
Receiving objects: 100% (30/30), 29.81 KiB, done.
Resolving deltas: 100% (12/12), done.
error: Trying to write ref HEAD with nonexistant object da71aedfde2e0469288acd9e45bb8b57a6e5a7b3
fatal: Cannot update the ref 'HEAD'.

이제 원래 작업 디렉토리로 돌아가서 구문 오류를 수정하고 추가, 커밋 및 푸시합니다.

host:nagios erik$ vi nagios.cfg
host:nagios erik$ git add nagios.cfg
host:nagios erik$ git commit -m "removing syntax error, push should succeed this time"
[master f147ded] removing syntax error, push should succeed this time
 1 files changed, 0 insertions(+), 2 deletions(-)
host:nagios erik$ git push origin master
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 487 bytes, done.
Total 4 (delta 2), reused 0 (delta 0)
remote: Previous HEAD position was 4c80d45... syntax error
remote: HEAD is now at f147ded... removing syntax error, push should succeed this time
remote: Nagios Config Check Exit Status: 0
remote: Your configs look good and parsed correctly.
To git@remote-server.example.com:nagios
   3ddc880..f147ded  master -> master

이 시점에서 저장소는 정상이며 임시 디렉토리로 변경하고 저장소를 다시 복제 할 수 있습니다.

host:temp erik$ git clone git@remote-server.example.com:nagios
Cloning into nagios...
remote: Counting objects: 34, done.
remote: Compressing objects: 100% (33/33), done.
remote: Total 34 (delta 14), reused 0 (delta 0)
Receiving objects: 100% (34/34), 30.22 KiB, done.
Resolving deltas: 100% (14/14), done.

여기에 내가 사용 하는 사전 수신 후크가 있습니다.

클라이언트에서 git v1.7.5.4를 사용하고 서버에서 v1.7.2.3을 사용하고 있습니다.

따라서 질문에 : 푸시를 거부 할 때 왜 리포지토리가 일관성이없는 상태로 남아 있습니까? 내 자식 후크에 문제가 있거나 어쩌면 자식에 대한 이해가 부족합니까?


어떤 버전의 자식을 사용하고 있습니까?
robbyt

@robbyt- 1.7.5.4클라이언트, 1.7.2.3서버.
EEAA 2019

답변:


7

당신은하고 있습니다 :

export GIT_WORK_TREE=/tmp/nagiosworkdir
/usr/bin/git checkout -f $NEW_SHA1

당신의 후크에. 그것은 평소 접촉 아니에요 있지만이 작업을-복사 됩니다 망할 놈의-DIR (특히 참고 문헌 업데이트 HEAD하여 오류와 같이 참조)

...
remote: HEAD is now at da71aed... syntax error
...

후크가 exit 1업데이트를 거부 하려고 하지만 HEAD실패 후 참조를 재설정하지는 않습니다 .

다음과 같이 후크의 실패 분기를 업데이트해야한다고 생각합니다.

...
if [ "$NAGIOS_CHECK_STATUS" -ne 0 ]
   then
   echo "Your configs did not parse correctly, there was an error. Output follows."
   cat $GIT_WORK_TREE/check.out
   /usr/bin/git reset --hard $OLD_SHA1    # <-- Add This
   exit 1
else
   ...

멋져 보여요. 오늘 조금 나중에 시도해 볼게요. 감사합니다!
EEAA

0

git checkout후크 의 명령이 저장소에서 HEAD 참조를 작성 / 업데이트합니다.

리포지토리가 베어 리포지토리 인 경우 HEAD 참조없이 사용할 수 있습니다 (기본적으로 마스터 분기가있는 경우 새 클론이 체크 아웃 됨 ). 종료하기 전에 HEAD 참조를 삭제하십시오 ( trap각각 exit개별적 으로 수행하기 위해 준비하지 않아도 될 수 있습니다). 스크립트 어딘가에서 "어딘가":

trap 'git update-ref -m "removing HEAD after temporary checkout to alternate workdir" -d HEAD "$NEW_SHA1"' 0

리포지토리가 노출되지 않았거나 HEAD 참조를 유지하려면 (복제본에서 기본적으로 다른 분기를 체크 아웃하도록) HEAD 참조를 저장하고 종료하기 전에 복원해야합니다.

먼저 서버의 저장소에서 새 클론에서 기본적으로 체크 아웃하려는 분기를 가리 키도록 HEAD 참조를 재설정하십시오.

git symbolic-ref -m 'setting default branch for new clones' HEAD refs/heads/master

그런 다음 훅 스크립트에서 (체크 아웃 전) :

# Restore HEAD symref when exiting
saved_HEAD=$(git symbolic-ref HEAD)
trap 'git symbolic-ref -m "restoring HEAD after temporary checkout to alternate workdir" HEAD "$saved_HEAD"' 0

그건 그렇고, pre-receive후크는 stdin을 완전히 읽고 공급 된 모든 라인을 처리해야합니다. 모든 입력을 소비하기 전에 종료하면 git-receive-pack프로세스 에서 SIGPIPE가 트리거 될 수 있습니다 . 한 번에 하나의 심판을 밀면 (적어도 한 줄을 읽었으므로) 이것은 아마도 당신의 경우에는 나타나지 않지만 명심해야 할 것입니다. update한 번에 하나의 심판 만 신경 쓰면 되고 각 심판의 푸시를 개별적으로 거부 할 수 있는 후크 로이 후크를 사용하는 것이 더 쉽습니다 ( 마스터 팁을 "깨끗한" 상태로 유지하는 것에 만 관심이있을 수 있습니다 . 다른 지점의 팁에 대해서는보고하지만 불완전한 작업의 협업에 사용될 수 있도록 거부하지 마십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.