반응형

Jenkins 서비스를 구동시킨 후 Jenkins 웹 페이지로 접속한다.

Jenkins 웹 페이지에 처음 접속하면, 아래와 같이 초기 관리자 비밀번호를 입력하라는 페이지가 출력된다.

 

초기 관리자 비밀번호 파일 내용을 복사하여 붙여넣기 한 후 [Continue] 버튼을 누른다.

$ cat /var/lib/jenkins/secrets/initialAdminPassword

 

이번엔 플러그인 설치 화면이 출력된다.

특별히 설치해야 하는 플러그인이 없다면, [Install Suggested plugins]를 선택한다.

 

플러그인 설치가 진행된다. (대략 5~15분 정도 소요됨)

 

플러그인 설치가 완료되면, 관리자 계정 생성 페이지가 출력된다.

계정명, 암호, 이름, 이메일 주소를 입력한 후 저장한다.

 

마지막으로 Jenkins 접속 정보를 수정할 수 있는 페이지가 출력된다.

변경할 내용이 있다면 수정한 후 저장하고 마무리한다.

 

이제 Jenkins를 사용할 수 있게 되었다!!!



 
 
 

 

 

반응형
반응형

Java 17 버전이 설치되었으면, 이제 Jenkins를 설치하여 사용할 수 있다.

 

 

1. Jenkins 저장소 설치

Jenkins를 설치하기 전에 yum repository를 먼저 설치한다.

$ yum -y install ca-certificates
$ wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
$ rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key

 

 

2. Jenkins 설치

$ yum -y install epel-release
$ yum -y install jenkins

 

 

3. Jenkins 설치 확인

$ rpm -qa | grep jenkins
$ systemctl status jenkins

 

 

4. Jenkins 서비스 포트 변경

Jenkins는 기본 포트로 8080 포트를 사용한다. (기본 포트를 사용하려면 이 부분은 skip !!!)

다른 포트를 사용하도록 변경하기 위해서는 Jenkins 설정 파일을 수정한 후 서비스를 재시작해준다.

$ vi /usr/lib/systemd/system/jenkins.service

Environment="JENKINS_PORT=[변경하려는 포트 번호]"

 

만약, 방화벽 서비스(firewalld)를 사용중이라면 변경할 포트를 열어줘야 한다.

$ firewall-cmd --permanent --zone=public --add-port=[변경하려는 포트 번호]/tcp

### firewalld 재시작
$ firewall-cmd --reload

 

 

5. Jenkins 작업 디렉토리(Workspace) 변경

Jenkins의 기본 작업 디렉토리는 "/var/lib/jenkins" 로 설정되어있다. (기본 작업 디렉토리를 사용하려면 이 부분은 skip !!!)

다른 디렉토리를 사용하기 위해서는 Jenkins 설정 파일을 수정한 후 서비스를 재시작해준다.

$ vi /usr/lib/systemd/system/jenkins.service

Environment="JENKINS_HOME=[변경하려는 작업 디렉토리]"
WorkingDirectory=[변경하려는 작업 디렉토리]

 

 

6. Jenkins 구동

$ systemctl daemon-reload
$ systemctl enable --now jenkins

 

 

7. Jenkins 구동 및 포트 확인

$ systemctl status jenkins
$ netstat -anp | grep `ps -ef | grep -v grep | grep jenkins | awk '{print $2}'`

 
 
 
 

 

 

 

반응형
반응형

Jenkins를 사용하기 위해서는 Java가 설치되어 있어야한다.

Jenkins에서는 Java 17 버전 이상 사용을 권장하므로 Java 17 버전을 설치해보자. 

 

참고로 Java 11 버전이 설치된 시스템에 Jenkins를 설치하여 사용하면 아래와 같은 경고를 출력한다.

 

 

1. 필요 패키지 설치

Java 17을 다운로드 받기 위해 wget을 설치한다.

$ yum -y install wget

 

 

2. Java 17 다운로드 및 설치

$ wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
$ rpm -ivh jdk-17_linux-x64_bin.rpm

 

 

3. Java 버전 확인

$ java --version

 

 

4. Java 활성화 버전 확인

Java 17 버전이 선택되어 있지 않으면, 선택하여 활성화 해준다.

$ alternatives --config java



 
 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

가상 서버에 Jenkins를 설치하여 자동 빌드 환경을 구성하는 방법을 알아보자.

물론, Jenkins Docker 이미지를 사용하면 설치 과정없이 보다 쉽게 자동 빌드 환경을 구성할 수 있다.

하지만, 서버 하나에 [Jenkins 빌드 환경] 과 [Compile 환경] 을 모두 구성해야 한다면, Jenkins를 직접 설치하여 사용해야 할 경우가 생긴다. (특히, C나 C++같이 컴파일이 필요하고, 빌드 환경의 영향을 많이 받는 프로그램을 빌드할 경우에는 더욱 그렇다.)

 

이번 글에서는 Jenkins 빌드 환경을 구성하기 위한 첫 단계로 Linux OS를 설치해보자.

 

1. Linux 설치

Virtual Box에 VM을 하나 생성하고, CentOS 7.9 Minimal 이미지로 부팅을 한다.

부팅 후 언어 선택 화면이 나오면 설치 언어를 선택한다. (영어로 선택해도 무방)

 

언어를 선택했으면, 아래의 항목들을 목적에 맞게 선택한다.

- 날짜와 시간 : 아시아/서울

- 소프트웨어 선택 : 최소 설치

- 설치 대상 : 자동 설정 혹은 수동으로 파티션 설정

 

항목들을 선택했으면, [설치 시작]을 누른다.

 

설치가 진행되는 동안 ROOT 암호를 설정한다. (사용자 생성은 필요시 생성)

 

설치가 완료되면, [재부팅] 버튼을 눌러 시스템을 재시작한다.

 

OS가 정상 설치되었으면, 부팅시 아래처럼 OS 선택 화면이 출력된다. (처음 항목을 선택)

 

처음 항목을 선택하여 부팅하면, 로그인 화면이 출력된다.

설치시 설정한 root 사용자 패스워드를 사용하여 로그인한다.

 

 

2. Linux 설정

아래의 설정들은 보안 관련 설정을 해제하는 설정으로, 보안 설정을 사용중이라면 그대로 유지해도 된다.

 

(1) SELinux 사용해제

$ vi /etc/selinux/config

SELINUX=enforcing 으로 되어있는 부분을 SELINUX=disabled 로 변경한 후 저장

 

 

(2) 방화벽 사용해제

$ systemctl disable --now firewalld

 

(3) 네트워크 설정

$ vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

파일의 내용을 수정 (IPADDR, GATEWAY, NETMASK, DNS)


 
 
 

반응형
반응형

std::tuple은 두 개 이상의 변수나 객체를 하나로 묶어 전달 할 때 사용된다.

 

1. 사용법

#include <tuple>

std::tuple< var-type1, ..., var-typeN > var;

 

(1) 인자
  1-1) var-type : 변수나 객체의 타입을 지정

 

 

2. 사용 예제

#include <iostream>
#include <vector>
#include <tuple>

// 이름, 나이, 키
using Type = std::tuple<std::string,int,float>;

void print(const Type& param)
{
    // std::get을 사용하여 값에 접근
    std::cout << "Name:" << std::get<0>(param) << ", Age:" << std::get<1>(param)
        << ", Height:" << std::get<2>(param) << std::endl;
}

int main()
{
    // 선언과 함께 값 추가
    std::tuple<std::string,int,float> t1{"name1", 10, 164.2};
    print(t1);

    // std::make_tuple을 사용하여 값 추가
    Type t2{std::make_tuple<std::string,int,float>("name2", 20, 183.2)};
    print(t2);

    // tuple 사이즈 알아오기
    std::cout << "tuple size: " << std::tuple_size<Type>() << std::endl;

    // auto를 사용하여 값에 접근
    auto& [name, age, height] = t1;
    std::cout << "Name:" << name << ", Age:" << age << ", Height:" << height << std::endl;

    // std::tie를 사용하여 값에 접근
    std::string n{};
    int a{0};
    float h{0.0f};
    std::tie(n, a, h) = t2;
    std::cout << "Name:" << n << ", Age:" << a << ", Height:" << h << std::endl;

    // 벡터와 함께 사용
    std::vector<Type> vTuple;
    vTuple.emplace_back(t1);
    vTuple.emplace_back(t2);
    vTuple.emplace_back(std::make_tuple<std::string,int,float>("name3", 30, 172.2));
    vTuple.emplace_back(Type("name4", 40, 166.7));

    for (const Type& v : vTuple) print(v);
    
    return 0;
}


 
 
 

반응형

+ Recent posts