개발팁2022. 3. 21. 18:55

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 가 제공된다면 다른 메신저로 보낼 수도 있다.

 

Posted by 헝개