준비사항
- aws 계정 및 iam 계정 생성
- aws linux 2023 ami로 인스턴스 생성
- 최소한 SSH(포트 22) 접속이 가능한 보안 규칙
- Java 설치 및 환경변수 편집
- Jenkins 다운로드를 위해 임시로 https 포트 열어놓기(인바운드 규칙에 포함하기)
1,2,3,4 는 되어있다고 가정하고나서, 5번이 중요하다.
Jenkins 다운로드를 위해 https 포트 임시 개방
jenkins가 구동될 내 EC2 Instance에 나는 jenkins가 내 소스를 주고받을 포트와 http로 접속해 jenkins 설정할 포트들이 필요한데,
현재 규칙은 ssh(22) jenkins용(8081) 포트를 내 ip만 허용했다. 당연하지만 이러면 jenkins를 wget으로 다운받을 수가 없다 ㅋㅋㅋㅋ
먼저 jenkins를 다운받을 수 있도록 임시로 인바운드 규칙을 수정하자
원래 jenkins를 편리하게 사용하려면 http, 8081, ssh 3개의 포트만 열어놓으면 되는데, jenkins repo를 다운받을 때 인터넷 연결이 필요하고, 정확하게는 https 프로토콜로 통신할거기때문에, 임시적으로 https 포트를 모든 ip에 대해서 열어 놓아야한다.
(물론 jenkins 다운로드 파일들을 주는 ip대역을 알면 좋을텐데 당장은 전체 allow 하기로 했다.)
인바운드 규칙이 아래 사진처럼 설정 되었다면 이제 jenkins를 다운받을 수 있다.
물론 jenkins를 모두 설치한 이후엔 https 허용은 필요 없어진다.
Jenkins 설치 과정
jenkins의 repo를 yum저장소에 등록한다.(이 과정에서 https 통신이 필요했던 것)
sudo wget -O /etc/yum.repos.d/jenkins.repo <https://pkg.jenkins.io/redhat-stable/jenkins.repo>
아래는 내 os 가 jenkins를 신뢰할 수 있게 key를 가져오는과정
sudo rpm --import <https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key>
참고로 stable한 url이 아니라
jenkins 버전별로 상이할수 있음
위 명령어의 jenkins.io-2023.key 이부분에서 특히 2023이 달라질 수 있다.
아래 명령어로 설치!
sudo yum install jenkins
참고로 내가 jenkins측에서 public key를 제대로 다운받지 않은경우 이렇게 뜬다.
Public key for jenkins-2.414.3-1.1.noarch.rpm is not installed
jenkins 공식홈페이지에서 확인하고 버전별로 public key나 설치방법이 변경되었는지 확인하고 받아야한다.
설치했다면 임시적으로 허용했던 https 인바운드 규칙을 제거해준다.
이후
sudo systemctl enable jenkins
sudo systemctl start jenkins
참고로 프리티어 사용자라면 1기가 램이라서 켜는데 하루종일(약 30초) 걸린다.
start 명령어는 원래 반응이 없는게 정상이니 잘 켜졌는지 확인하고 싶다면
아래 명령어로 확인할 수 있다.
sudo systemctl status jenkins
버전 별 초기 설정
[주의] jenkins 버전이 2.335 이상이거나 Jenkins 2.332.1인 경우 아래 방법이 통하지 않는다.
[주의] jenkins 버전이 2.335 이상이거나 Jenkins 2.332.1인 경우 아래 방법이 통하지 않는다.
Jenkins 2.335 버전 이전의 설정
jenkins_port 젠킨스 포트 번호를 변경하고자한다면,
sudo vi /usr/lib/systemd/system/jenkins.service
위 명령어로 아래 파일을 열어서
Environment를 직접 수정해서 변경한다.
파일을 저장 완료한 후에 아래 명령어를 입력해서 daemon과 jenkins를 순차적으로 재시작해주면 적용이 되었었다.
systemctl restart daemon
systemctl restart jenkins
2.335버전 이후의 초기 설정
https://www.jenkins.io/blog/2022/03/25/systemd-migration/#package-configuration
위의 공식문서 내용에 따르면 Jenkins의 Configuration을 수정하는 부분이 기존의 read-only 파일을 강제로 수정하는 등의 건강하지 못한 방법으로 configuration을 수정하는 것을 개편하고자 drop-in directory를 적용하기로 바꿨다고 한다.
설정 변경 로직의 대대적인 개편
[원문1]
The main service unit is read-only and not intended to be edited manually. It contains a large notice at the top of the file stating as much. The canonical way to customize the systemd(1) service is to run systemctl edit jenkins, which creates a new drop-in unit at /etc/systemd/system/jenkins.service.d/override.conf. On a clean install, this drop-in unit does not exist. When a user first customizes a clean install with systemctl edit jenkins, systemd(1) creates the drop-in unit and allows the user to customize it
[원문1에 대한 내 해석]
jenkins.service 파일, 즉 젠킨스의 기본적인 configuration들이 적힌 파일은 read-only이고 이전버전까지는 임의로 수정이 가능해서, 수정한 뒤 daemon 및 jenkins를 순서대로 restart하면 적용이 되었으나, 현재는 jenkins.service 파일의 configuration을 override할 수 있도록 도와주는 drop-in 파일을 생성하는 명령어인 systemctl edit jenkins를 이용해달라고 요청한다. 좀더 리눅스의 공식적인 프로그램처럼 작동했으면 하는 개발진의 바람과 임의로 수정하여 생기는 버그에 대한 고충을 덜어주려는 노력으로 보인다.
systemctl edit 명령어로설정 파일 작성(override) 방법
[원문2]
Note that such customizations must be done in a [Service] section in order to take effect.
[원문2에 대한 내 해석]
직접 변경하고싶은 설정은 꼭 [Service] 섹션에다가 순서대로 넣어야 한단다.
위 내용이 무슨말인지 이해하려면 직접 봐야 안다.
systemctl edit jenkins를 실행하면 아래와 같은 화면이 나오는데,
어디에 작성해야 할 지 까진 알겠지만, 어떻게 작성해야 할지 헤매게 된다
2번째 라인부터 공간이 좀 넓은 부분에 수정 해 달라고 강조하고 있는데, 여기다가 아래처럼 작성해야 한다.
### Anything between here and --------
[Service]
Environment="JENKINS_PORT=8081"
### Lines elow this coment will be discarded
참고
port 번호 뿐만 아니라 User 이름도 jenkins가 아니라 ec2-user로 변경하고싶었는데 이유는 잘 모르겠으나 build가 안되는 이상한 문제에 시달렸다. 설정 별로 변경하는 방법이 좀 다를 수도 있는듯, 우선은 중요하지않아서 패스
위 사진의 [Service] 아래에 적힌 설정은 jenkins 포트를 기본 8080에서 8081로 변경하고자 한 코드
참고로 파일을 쭉쭉 내리면 내가 변경하고자하는 설정의 원본이 어떻게 쓰여있는지를 확인할 수 있어서 따라서 적되,
변경하고싶은 부분만 변경하면 된다.
다음으로 파일을 저장하기 전에 아래 내용을 보길 추천
설정 파일 저장하기
[원문3]
Editing the drop-in unit with systemctl edit jenkins will automatically reload the systemd(1) configuration. The settings will take effect the next time Jenkins is restarted. If you edit the drop-in unit without systemctl(1), you need to run systemctl daemon-reload for the changes to take effect.
[원문3에 대한 내 해석]
방금 수정한 drop-in 유닛을 edit 명령어가 알아서 configuration에 적용했고, jenkins가 restart되면 알아서 적용된다. 만약에 systemctl 명령어를 사용하지 않고 직접 변경한경우(권장되지 않으며 잘 되지도 않는 것 같다.) jenkins restart 이전에 daemon-reload 또한 실행해야함
무슨 말이냐면 이 명령어로 작성 완료하고 저장하려고하면 아래와 같은 화면이 나올텐데
file Name to Write: ~~~~ /.#override.conf 부분을 보자.
파일 이름이 위의 사진처럼 멋지게 override.conf 로 끝나는 것이 아니라 conff23afwj39jd 이런식으로 되어있을 것이다.
나는 이름이 꺼림직해서 직접 수정해서 override.conf 만 남겨 놓고 지우고 덮어쓰기를 했는데 적용이 되지 않았다.
지금 생각해보니, 가장 최신의 configration override 파일을 적용하고자 하는 jenkins 개발진의 깊은 의도였을 것 같다.
결론적으로 파일 이름은 변경하지 않고 저장해야한다.
Jenkins port 변경 확인
이제 override 할 내용이 적용 되었을테니까 젠킨스 재시작!
systemctl restart jenkins
정상적으로 변경이 완료된 경우 httpPort=8081으로 적용되었음을 아래 명령어를 통해 확인할 수 있다.
systemctl status jenkins