Jenkins 는 Rest API 를 통해, Project / Job 을 조회하고,
빌드하고, 결과를 확인할 수 있다.
Rest API 를 이용하면, 빌드완료후에, 빌드 결과를 메신저로 단체방에 공유 할 수 있다.
Rest API 사용하기
Jenkins 에 로그인하고, 오른쪽 상단에 로그인한 ID 를 클릭한다.
설정 메뉴를 클릭한다.
ADD NEW TOKEN 을 클릭한다.
Default name 을 입력하고, GENERATE 를 클릭하면, Token String 이 생성된다.
이 토큰문자가 REST API 를 호출할때, 인증하는 수단이 된다.
형식은 위에서 입력한 이름:토큰스트링 형식이다.
ex)
admin:12eb2d6e1d73cfa260d9e42e4d3f080b19 |
이 값은 Basic API 호출시에는 Base64 String 으로 변환해서 호출해야 한다.
간단히 fiddler 의 text wizard 에서 변환해서 쓰면 된다.
base64 string ex)
YWRtaW46MTJlYjJkNmUxZDczY2ZhMjYwZDllNDJlNGQzZjA4MGIxOQ== |
Jenkins Rest API 호출
Job 조회 / 빌드 조회 URL 뒤에 /api/json 또는 /api/xml 만 붙여주면된다.
(소문자로 입력해야 한다.)
웹브라우저에서 로그인 한 상태에서, JOB 조회 화면뒤에 api/json 을 붙여보면 된다.
웹브라우저에서는 jenkins 사이트에 로그인이 된 상태에서 호출했기 때문에, 조회가 정상적으로 이뤄진다.
curl 명령어로 command prompt 에서 실행해보자.
curl -X GET "http://url:port/job/BUILD/job/BUILD_CLIENT_FOR_Develop/api/json" -H "Content-Type: application/json" |
오류가 날 것이다. 아래와같이 Basic Authorization 을 추가하여 호출해보자.
curl -X GET "http://url:port/job/BUILD/job/BUILD_CLIENT_FOR_Develop/api/json" -H "Content-Type: application/json" -H "Authorization: Basic YWRtaW46MTJlYjJkNmUxZDczY2ZhMjYwZDllNDJlNGQzZjA4MGIxOQ==" |
결과가 잘 나올 것이다.
Jenkins 결과 확인 API
빌드 결과 확인 API {jobUrl}{buildNumber}/api/json 빌드 결과 Console 확인 API {jobUrl}{buildNumber}/consoleText |
Jenkins 빌드 후 조치
Jenkins 의 job 설정에서 빌드 후 조치
Execute Windows batch command 를 통해서, 빌드완료후에, 빌드결과 알림 Console Application 을 호출할것이다.
jenkins_build_noti.bat
파일과, 그 안에서 호출하는 Application 을 만들어야 한다.
Application 은 Visual Studio 에서 Console Application 으로 만들면 된다.
jenkins_build_noti.bat
D:\경로\Util.NaverWorks.BuildNoti.exe "jenkins" "%JOB_URL%" "%BUILD_NUMBER%" |
jenkins 빌드가 완료되면, 전역변수
%JOB_URL% 에 현재 빌드된 job 의 url 이 자동으로 입력되고,
%BUILD_NUMBER% 에는 빌드된 빌드번호가 자동으로 입력된다.
Console Application
main 함수
if (args.Length >= 1) { using (NaverWorksNoti noti = new NaverWorksNoti()) { switch (args[0]) { case "jenkins": noti.SendJenkins(args[1], args[2]); break; default: WriteUsage(); break; } return 0; // always return success } |
여기서 주의 할 점은 return 0 이다. 0 이 아닌 값을 리턴하면, jenkins 는 빌드가 실패한걸로 처리하게 된다.
SendJenkins 함수
string url = $"{jobUrl}{buildNumber}/api/json"; |
using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Add("Authorization", "Basic YWRtaW46MTJlYjJkNmUxZDczY2ZhMjYwZDllNDJlNGQzZjA4MGIxOQ=="); HttpResponseMessage response = client.GetAsync(url).Result; string result = response.Content.ReadAsStringAsync().Result; dynamic objResult = JsonConvert.DeserializeObject(result); ........ } |
이제 objResult 라는 json 객체에서 빌드 성공/실패 여부를 판단하고, 알림 메세지를 만들어 내면 된다.
bool buildSuccess = objResult.result.ToString() == "SUCCESS"; |
result 값이 SUCCESS 라면 빌드성공 아니면 실패로 처리하면 된다.
actions 의 parameters 를 통해 job 빌드시 사용한 파라미터를 가져올 수 도 있다.
for (int i = 0; i < objResult.actions.Count; i++) { if (objResult.actions[i].parameters != null) { for (int k = 0; k < objResult.actions[i].parameters.Count; k++) { if (objResult.actions[i].parameters[k].value != null && objResult.actions[i].parameters[k].value.ToString() != "") { sbParameter.Append($"{objResult.actions[i].parameters[k].name.ToString()} : {objResult.actions[i].parameters[k].value.ToString()}"); sbParameter.AppendLine(); } } } } |
svn 연동해서, 빌드하는 경우, changeSet 을 통해서, svn 커밋내용들을 가져올 수 있다.
if (objResult.changeSet.items != null) { for (int i = 0; i < objResult.changeSet.items.Count; i++) { sbMessage.AppendLine($"{objResult.changeSet.items[i].user.ToString()} : {(objResult.changeSet.items[i].date == null ? "" : Convert.ToDateTime(objResult.changeSet.items[i].date).ToLocalTime().ToString())}"); sbMessage.Append(objResult.changeSet.items[i].msg.ToString()); sbMessage.AppendLine(); } } |
빌드가 실패한경우에는 consoleText 를 보여줘서, 오류를 확인하도록 할 수도 있다.
string consoleUrl = $"{jobUrl}{buildNumber}/consoleText"; |
response = client.GetAsync(consoleUrl).Result; byte[] resultBytes = response.Content.ReadAsByteArrayAsync().Result; // EUC-KR 인코딩 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); string resultText = Encoding.GetEncoding(51949).GetString(resultBytes); sbMessage.Append(resultText); |
이렇게 단체방에 전송할 메세지를 만들어서 단체방 메세지를 보낼 수 있다.
알림 메세지 예제
아래 예제는 네이버웍스에 Bot 을 생성해서, 단체방에 메세지를 보낸 화면이고, api 가 제공된다면 다른 메신저로 보낼 수도 있다.
'개발팁' 카테고리의 다른 글
mysql / mariadb 슬로우쿼리(slowquery) 탐지하기 (0) | 2022.03.29 |
---|---|
ASP.NET API 에 swagger 사용방법 (0) | 2022.03.22 |
[CSS] 정적 이미지에 생명력을 넣는 방법 - 동적으로 커지는 이미지 (0) | 2021.03.18 |
자바스크립트 라이브러리 underscore.js (0) | 2020.08.27 |
자바스크립트 배열 자료구조 다루기 (0) | 2020.07.30 |