Jenkins Credentials.xml

hs·2022년 10월 18일
1
post-thumbnail

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 파일을 수정할 생각이였다.

첫번째 방향성의 문제

  1. xml 파일을 거의 처음 접해보았다. 구조가 약간 html 과 비슷(?) 하여 태그로 구분하였지만 정확히 구분 하였는지는 잘 알지 못하였다.
  2. jenkins cli 중 해당 job의 credential.xml을 가져오는 get-credentials-as-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을 생성할 수 없었다.

  1. 제일 큰 문제로는 get-job 을 통한 job의 설정을 변경하는데 있었다. config.xml의 파일이다.
<?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로 변경하니 문제는 해결되었다.

  • 원인 jenkins 서버내의 파일들은 레플리카( 백업 복제본 ) 인 것 같았다. 그렇기에 설정파일을 변경해도 실제 서버에 적용 되지않았다. 이를 적용하기 위해선 jenkins 관리 > Reload Configuration from Disk 를 통해 다시 적용 시켜주어야 했다.

두번째 방향성

찾다보니 ssh를 통한 Git 연결외에 Token을 통한 연결이 가능하다는 사실을 알게 되었다. 이전에 초기 셋팅을 할때 private repo는 ssh로만 연결이 가능할 줄 알았었지만 그렇지 않았다.

[참조]
https://kitty-geno.tistory.com/m/88
감사합니다

이전에 Token으로 했을 때 실패했던 원인에 대해서 좀 정리해보자면

총 2개의 Credential이 필요했었다.

  1. Github Token 발행
  2. jenkins 관리 > 시스템 설정 > Github > Add Github Server >

Add를 통해 새로운 Credential 생성

  • kind - Secret text

  • Secret - Git Token

  • ID - Credential 이름 (정해주면 된다)

    그 후 Test connection을 해준뒤

Credentials verified for user {Credential 이름}, rate limit: 4998

이러한 형식으로 나오면 저장하면된다.

  1. 새롭게 job 생성에 들어간 후
  2. Repo url을 적어주고 branch를 적용할 branch로 변경 해준 후

Credentials Add를 통해 새로운 Credential을 만들어준다.

  • Kind - Username with password
  • Username : GitHub 계정 입력
  • Password : Github token 입력 (계정 비밀번호 X)
  • ID : Credentials의 이름 ( 직접 작성 )
profile
무엇이든 끝까지 보람차게

0개의 댓글