배경
우리는 인프라를 모니터링하기 위해 nagios를 사용하고 있습니다. 현재 버전 제어에 nagios 구성이 없으며 nagios 구성을 관리하는 두 사람이 있습니다. 따라서 구문 검사를 수행하기 위해 후크를 사용하여 nagios 구성을 중앙 git 저장소로 가져오고 구성이 좋아 보인다면 "활성화"합니다. 내가 사용하고 이 사람의 시작 지점으로 게시물을.
구현하려는 일반적인 워크 플로는 다음과 같습니다.
- nagios 설정의 로컬 git repo를 편집하십시오. 편집 된 파일을 추가하고 로컬로 커밋합니다.
git push origin master
원격 저장소에.- 푸시는 파일을 가져 와서 서버의 임시 디렉토리로 이동 한 후 nagios 구문 검사기를 통해 실행하는 사전 수신 후크에 의해 차단됩니다.
- 구문 검사기가 통과하면 푸시를 수락 한 다음
git pull
새 코드에 대한 커밋 후 후크를 라이브 nagios 구성 디렉토리로 사용한 다음 nagios를 다시 시작하십시오. - 구문 검사기가 실패하면 푸시를 거부하고 사용자에게 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을 사용하고 있습니다.
따라서 질문에 : 푸시를 거부 할 때 왜 리포지토리가 일관성이없는 상태로 남아 있습니까? 내 자식 후크에 문제가 있거나 어쩌면 자식에 대한 이해가 부족합니까?
1.7.5.4
클라이언트, 1.7.2.3
서버.