[Jenkins] Jenkins에서 ArgoCD API 사용하기


k8s로 신규 프로젝트를 진행하는 만큼, 기존에 사용해왔던 tool이랑 신규로 사용하는 tool을 적절히 조화롭게 써야한다고 생각했다.

신규 프로젝트라고 처음 사용하는 tool들을 사용하다보면 학습시간이 더 많이 소요될 수 있기 때문이다.

그래서 난 평소에 자주 쓰던 Jenkins와 처음 사용해보는 ArgoCD를 조합하고자 했다.
(사실 ArgoCD는 API를 통해서 조종하는거라 조합이라기에는 애매하다….)





먼저 Jenkins에서 ArgoCD Token을 받아오고 해당 Token을 가지고 API를 발송할 수 있다.

다양한 방식들이 있지만 나는 그때그때 Token을 받아오는것이 좋다고 생각하여 파이프라인을 작성했다.

withCredentials([usernamePassword(credentialsId: 'argocd_auth', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
                        def res = httpRequest (
                            quiet: true, 
                            contentType: 'APPLICATION_JSON', 
                            httpMode: 'POST', 
                            requestBody: """{"password": "${PASSWORD}", "username": "${USERNAME}"}""", 
                            url: "${ArgoCD}/api/v1/session"
                        )
}
def jsonRes = readJSON text: res.content
def token = jsonRes ["token"]

파이프 라인에서 위 과정을 통해 ArgoCD의 토큰을 받아온다.

Jenkins에 withCredentials를 이용해서 저장되어있는 ArgoCD의 Auth를 사용하고, 해당 값을 ArgoCD/api/v1/session 의 requestBody에 실어서 response를 받는다.

그 후 받은 response의 content를 Json 형태로 까서 token값을 저장한다.





def res = httpRequest(
                            quiet: true,
                            contentType: 'APPLICATION_JSON',
                            httpMode: 'GET',
                            customHeaders: [[maskValue: true, name: 'Authorization', value: "Bearer ${token}"]],
                            url: "${ARGO}/api/v1/applications/app"
)

그리고는 받은 token을 Header에 넣고 원하는 API를 쏘면 된다.

(참고 : https://cd.apps.argoproj.io/swagger-ui)

돌이켜보면 간단하지만 생각보다 시행착오가 많았다..




def res = httpRequest (
                            quiet: true, 
                            contentType: 'APPLICATION_JSON', 
                            httpMode: 'POST', 
                            customHeaders: [[maskValue: true, name: "Authorization", value: "Bearer ${token}"]], 
                            requestBody: """{"strategy":{"apply": {"force": true},"hook": {"syncStrategyApply": {"force": true}}}}""", 
                            url: "${ARGO}/api/v1/applications/app/sync"
)

마찬가지로 받은 token을 Header에 넣고 sync를 하면 된다.

body값으로 sync할 때에 옵션을 주면 되는데, 해당 옵션들은 위에 docs에 자세하게 나와있어서 이를 참고하면 될 것 같다.

Jenkins에서 ArgoCD로 쏘는 API들을 많이 사용하지는 않지만 sync라던가 특정 app의 Chart Version등을 확인할 때에 쓰고 있는 중이다.

앞으로 더 다양하게 사용될 것 같아 이렇게 작성해보았다.