Jenkins를 활용한 웹을 개발하고자 API와 cli를 사용하여 테스트를 진행하던 중 발생한 일을 정리해둔다.
Github과 jenkins를 연동하여 웹에서 프로젝트 생성시 Github repo가 생성 됨과 동시에 jenkins job 또한 자동으로 빌드 되어 생성되는 기능을 개발하고자 하였다.
기존에 Github과 Jenkins의 연결을 ssh-key를 통한 연결을 하였다. 이 부분에서 문제가 생겼는데, Jenkins에서 생성한 Credential 하나에 ssh-keygen을 통해 생성한 key를 등록하고 동일한 key를 Github repo에 등록하는 식으로 하였다. 하지만 Github는 서로 다른 Repo에서 동일한 ssh key를 사용할 수 없었고 이에 새로운 repo당 Credential을 하나씩 생성해 주어야 됐다.
단순히 ssh-keygen을 통해 생성된 키를 github api와 jenkins api 혹은 cli로 각각 Repo 생성, job생성을 하면 될 줄 알았다.
하지만 jenkins cli는 생각보다 어렵고 난해했다.
[참고]
[https://stackoverflow.com/questions/29616660/how-to-create-jenkins-credentials-via-the-rest-api](https://stackoverflow.com/questions/29616660/how-to-create-jenkins-credentials-via-the-rest-api)
- 위 방법에도 curl을 활용한 방법 밖엔 없었다. 원하던 ssh키를 넣는 방법은 존재하지 않았다.
jenkins 서버에 다이렉트로 접속하여 /var/lib/jenkins에 직접 들어가 xml을 수정하는 방법을 생각하였다.
해당 경로에 가면 jobs라는 디렉토리가 존재하고 해당 디렉토리 안의 job을 복사하고 내부의 config.xml, credential.xml 파일을 수정할 생각이였다.
<com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey plugin="ssh-credentials@291.v8211e4f8efb_c">
<scope>GLOBAL</scope>
<id>sshtest</id>
<description></description>
<username>quantum-universe</username>
<usernameSecret>false</usernameSecret>
<privateKeySource class="com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey$DirectEntryPrivateKeySource">
<privateKey>
<secret-redacted/>
</privateKey>
</privateKeySource>
</com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey>
이러한 형식으로 직접적으로 ssh 키를 넣는 것이 아닌 패키지를 활용하여 값을 넣는 방식이라 직접적으로 파일을 수정하여 적용시키기엔 어려움이 있었다. 즉, ssh키를 직접적으로 넣어 credential을 생성할 수 없었다.
<?xml version='1.1' encoding='UTF-8'?>
<project>
<actions/>
<description></description>
<keepDependencies>false</keepDependencies>
<properties/>
<scm class="hudson.plugins.git.GitSCM" plugin="git@4.11.3">
<configVersion>2</configVersion>
<userRemoteConfigs>
<hudson.plugins.git.UserRemoteConfig>
<url>git@github.com:quanutum-universe/test.git</url>
<credentialsId>ec2joo</credentialsId>
</hudson.plugins.git.UserRemoteConfig>
</userRemoteConfigs>
<branches>
<hudson.plugins.git.BranchSpec>
<name>*/main</name>
</hudson.plugins.git.BranchSpec>
</branches>
<doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
<submoduleCfg class="empty-list"/>
<extensions/>
</scm>
<canRoam>true</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers>
<com.cloudbees.jenkins.GitHubPushTrigger plugin="github@1.34.4">
<spec></spec>
</com.cloudbees.jenkins.GitHubPushTrigger>
</triggers>
<concurrentBuild>false</concurrentBuild>
<builders>
<hudson.tasks.Shell>
<command>#!/bin/sh
</command>
<configuredLocalRules/>
</hudson.tasks.Shell>
</builders>
<publishers/>
<buildWrappers>
<jenkins.plugins.nodejs.NodeJSBuildWrapper plugin="nodejs@1.5.1">
<nodeJSInstallationName>node16_ec2</nodeJSInstallationName>
<cacheLocationStrategy class="jenkins.plugins.nodejs.cache.DefaultCacheLocationLocator"/>
</jenkins.plugins.nodejs.NodeJSBuildWrapper>
</buildWrappers>
</project>
기존의 job dir를 복사하여 name이나 repo 주소, branch 명 등을 변경하고 script를 추가할 수 있었다. 그 후 복사된 job이 적용되었나 jenkins에 접속하여 확인해 보았지만 적용이 되지않았다. 나중에 그냥 create-job cli로 변경하니 문제는 해결되었다.
찾다보니 ssh를 통한 Git 연결외에 Token을 통한 연결이 가능하다는 사실을 알게 되었다. 이전에 초기 셋팅을 할때 private repo는 ssh로만 연결이 가능할 줄 알았었지만 그렇지 않았다.
[참조]
https://kitty-geno.tistory.com/m/88
감사합니다
이전에 Token으로 했을 때 실패했던 원인에 대해서 좀 정리해보자면
총 2개의 Credential이 필요했었다.
Add를 통해 새로운 Credential 생성
kind - Secret text
Secret - Git Token
ID - Credential 이름 (정해주면 된다)
그 후 Test connection을 해준뒤
Credentials verified for user {Credential 이름}, rate limit: 4998
이러한 형식으로 나오면 저장하면된다.
Credentials Add를 통해 새로운 Credential을 만들어준다.