k8s로 신규 프로젝트를 진행하는 만큼, 기존에 사용해왔던 tool이랑 신규로 사용하는 tool을 적절히 조화롭게 써야한다고 생각했다.
신규 프로젝트라고 처음 사용하는 tool들을 사용하다보면 학습시간이 더 많이 소요될 수 있기 때문이다.
그래서 난 평소에 자주 쓰던 Jenkins와 처음 사용해보는 ArgoCD를 조합하고자 했다.
(사실 ArgoCD는 API를 통해서 조종하는거라 조합이라기에는 애매하다….)
ArgoCD Token 받아오기
먼저 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값을 저장한다.
ArgoCD Token 싣고 API 쏘기
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)
돌이켜보면 간단하지만 생각보다 시행착오가 많았다..
ArgoCD Sync API
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등을 확인할 때에 쓰고 있는 중이다.
앞으로 더 다양하게 사용될 것 같아 이렇게 작성해보았다.