NetBSD에서 Jenkins 서버 설정

11779 단어 devopsjenkins
나는 been working on BSD에 대한 지원을 한동안 개선했다. 우선FreeBSD에서 실행되는 지속적인 통합을 추가한 다음에 OpenBSD에서 실행되었다.다음 단계는 NetBSD에서 CI를 실행하는 것이 분명합니다.불행하게도, 나는 현재 NetBSD를 옵션으로 제공하는 CI 서비스를 찾을 수 없어서, 나는 NetBSD에 Nim 자신을 설치했다.이 글에서 나는 이렇게 하는 과정을 상세하게 소개할 것이다. 왜냐하면 그것은 다른 플랫폼에서처럼 그렇게 뚜렷하지 않기 때문이다.
첫 번째 단계는 NetBSD를 설치하는 것입니다.일부 로컬 하드웨어를 전문적으로 사용하지 않고 VPS에서 실행하고 싶습니다. 따라서 제 첫 번째 단계는 구축 이미지에서 NetBSD를 설치하거나 ISO에서 NetBSD를 설치할 수 있는 호스트를 찾는 것입니다.다행히도 Jenkins KVM 슬라이스는 사용자 정의 ISO를 지원하며 NetBSD 9.0 ISO를 사용할 수 있습니다.나는 BuyVM를 사용하여 깨끗한 NetBSD 9.0 사본을 설치했다.
설치 과정에서 나는 최소 설치가 아니라 전체 설치를 선택했다.나는 또한 이 기회를 이용하여 네트워크 설정, 바이너리 패키지 설치, pkgsrc 설정, 사용자 추가 등 마지막 선택 가능한 절차를 사용했다. 설치할 때 이러한 조작을 하는 것은 가치가 있다. 단지 이후에 약간의 정력을 절약하기 위해서이다.
the standard installation procedure
초기 설정
Jenkins나 다른 어떤 것을 설치하기 전에, 나는 어떤 시스템에서든 초기 설정 절차를 실행하는 것을 좋아한다.이것들은 주로 편의를 위해서이니, 완전히 네가 결정해라.
첫 번째 단계는 루트 셸에서 실행되어야 합니다.
  • 유용한 표준 패키지를 설치합니다.
  • pkgin install sudo nano htop git fish mozilla-rootcerts
    
    
  • Mozilla의 루트cetificate 번들을 SSL 인증서 인증에 사용하도록 설정합니다.
  • mozilla-rootcerts install
    
    
  • 구성 sudo - 그룹 구성원이 명령을 수행할 수 있도록 허용 wheel:
  • visudo
    # find the line `# %wheel ALL=(ALL) ALL` and un-comment it
    
    
    현재 저는 sudo를 설정했고 표준 사용자의 셸으로 돌아왔습니다. 이것은 설치 과정에서 wheel 그룹에 추가되었고 몇 가지 진일보한 절차를 실행했습니다.
  • 일부 표준 변수와 함수를 사용하여 fish를 구성합니다.
  • mkdir -p $HOME/.config/fish
    echo 'set fish_greeting ""
    
    set -gx EDITOR (which nano)
    set -gx VISUAL $EDITOR
    
    function sudo!
     set -l cmd $history[1]
     echo "sudo $cmd" 1>&2
     eval sudo $cmd
    end' > $HOME/.config/fish/config.fish
    
    
  • 내 껍질을 물고기 몸에 얹어라:
  • chsh -s $(which fish)
    
    
  • 내 SSH 공개 키를 설정합니다.
  • mkdir -p $HOME/.ssh
    chmod 0700 $HOME/.ssh
    echo 'my-ssh-public-key' > $HOME/.ssh/authorized_keys
    chmod 0600 $HOME/.ssh/authorized_keys
    
    
  • SSH를 루트 로그인 거부, 비밀번호 인증 불허, X11 전송 비활성화 및 기타 조정 사항으로 구성합니다.
  • sudo sed -i 's/^LoginGraceTime .*/LoginGraceTime 60/g' /etc/ssh/sshd_config
    sudo sed -i 's/^#PermitRootLogin prohibit-password/PermitRootLogin no/g' /etc/ssh/sshd_config
    sudo sed -i 's/^#MaxAuthTries 6/MaxAuthTries 3/g' /etc/ssh/sshd_config
    sudo sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
    sudo sed -i 's/^#ChallengeResponseAuthentication yes/ChallengeResponseAuthentication no/g' /etc/ssh/sshd_config
    sudo sed -i 's/^#X11Forwarding no/X11Forwarding no/g' /etc/ssh/sshd_config
    sudo sed -i 's/^#UseDNS no/UseDNS no/g' /etc/ssh/sshd_config
    sudo service sshd restart
    
    
  • SSH, HTTP 및 HTTPS를 제외한 모든 전송 트래픽을 차단하기 위해 에 대한 기본 방화벽 규칙을 구성합니다.네트워크 인터페이스가 다를 수 있습니다.
  • sudo touch /etc/npf_blacklist
    echo '# NOTE: change the `wm0` to the name of your external network interface
    $public_if = ifaddrs(wm0)
    
    # create 2 tables - one for blacklisted IPs, the other for suspicious traffic
    table <blacklist> type ipset file "/etc/npf_blacklist"
    table <suspicious> type lpm
    
    # create a variable for the TCP services we wish to allow
    $tcp_services = { http, https }
    
    alg "icmp"
    
    procedure "log" {
     log: npflog0
    }
    
    procedure "normalize" {
     normalize: "random-id", "min-ttl" 64, "max-mss" 1432, "no-df"
    }
    
    group default {
     # pass everything on loopback
     pass final on lo0 all
    
     # block blacklisted IPs
     block in final from <blacklist>
    
     # block suspicious IPs
     block in final from <suspicious>
    
     # allow all outgoing
     pass stateful out final all
    
     # allow ICMP
     pass in final proto icmp all
    
     # allow and log ssh
     pass stateful in final proto tcp from any to $public_if port ssh apply "log"
    
     # allow incoming TCP
     pass stateful in final proto tcp to $public_if port $tcp_services apply "normalize"
    
     # reject everything else
     block return in final all apply "log"
    }' | sudo tee /etc/npf.conf
    echo 'npf=YES' | sudo tee -a /etc/rc.conf
    sudo /etc/rc.d/npf reload
    sudo /etc/rc.d/npf start
    
    
    NPF
    Nginx 설치 및 구성
    우리는 를 Jenkins의 역방향 에이전트로 사용할 것이기 때문에 설치할 것이다.다행히도 최신 바이너리 패키지가 있습니다.
    sudo pkgin install nginx
    
    
    이제 시작할 때 시작하도록 Nginx를 구성합니다.
    # copy the RC script into place
    sudo cp /usr/pkg/share/examples/rc.d/nginx /etc/rc.d/nginx
    echo 'nginx=YES' | sudo tee -a /etc/rc.conf
    echo '/var/log/nginx/access.log nginx:nginx 640 7 * 24 Z /var/run/nginx.pid SIGUSR1
    /var/log/nginx/error.log nginx:nginx 640 7 * 24 Z /var/run/nginx.pid SIGUSR1' | sudo tee -a /etc/newsyslog.conf
    sudo /etc/rc.d/syslogd restart
    
    
    그런 다음 Jenkins가 최종적으로 실행될 위치를 나타내는 Nginx 구성을 살펴보겠습니다.
    # take a backup of the existing configuration
    sudo tar -czvf /usr/pkg/etc/nginx.tar.gz /usr/pkg/etc/nginx
    sudo mkdir -p /usr/pkg/etc/nginx/conf.d
    echo 'user nginx nginx;
    
    worker_processes auto;
    
    worker_rlimit_nofile 8192;
    
    events {
     worker_connections 8000;
    }
    
    error_log /var/log/nginx/error.log warn;
    
    pid /var/run/nginx.pid;
    
    http {
     server_tokens off;
    
     include mime.types;
    
     default_type application/octet-stream;
    
     charset utf-8;
    
     charset_types
     text/css
     text/plain
     text/vnd.wap.wml
     text/javascript
     text/markdown
     text/calendar
     text/x-component
     text/vcard
     text/cache-manifest
     text/vtt
     application/json
     application/manifest+json;
    
     log_format main '\''$remote_addr - $remote_user [$time_local] "$request" '\''
     '\''$status $body_bytes_sent "$http_referer" '\''
     '\''"$http_user_agent" "$http_x_forwarded_for"'\'';
    
     access_log /var/log/nginx/access.log main;
    
     keepalive_timeout 20s;
    
     sendfile on;
    
     tcp_nopush on;
    
     gzip on;
    
     gzip_comp_level 5;
    
     gzip_min_length 256;
    
     gzip_proxied any;
    
     gzip_vary on;
    
     gzip_types
     application/atom+xml
     application/geo+json
     application/javascript
     application/x-javascript
     application/json
     application/ld+json
     application/manifest+json
     application/rdf+xml
     application/rss+xml
     application/vnd.ms-fontobject
     application/wasm
     application/x-web-app-manifest+json
     application/xhtml+xml
     application/xml
     font/eot
     font/otf
     font/ttf
     image/bmp
     image/svg+xml
     text/cache-manifest
     text/calendar
     text/css
     text/javascript
     text/markdown
     text/plain
     text/xml
     text/vcard
     text/vnd.rim.location.xloc
     text/vtt
     text/x-component
     text/x-cross-domain-policy;
    
     include conf.d/*.conf;
    }' | sudo tee /usr/pkg/etc/nginx/nginx.conf
    echo 'server {
     listen [::]:80 default_server;
     listen 80 default_server;
    
     server_name _;
    
     return 444;
    }' | sudo tee /usr/pkg/etc/nginx/conf.d/no-default.conf
    echo 'server {
     listen [::]:80;
     listen 80;
    
     # change this to your actual domain name
     server_name jenkins.euantorano.co.uk;
    
     location / {
     proxy_set_header Host $host:$server_port;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header X-Forwarded-Proto $scheme;
    
     proxy_pass http://127.0.0.1:8080;
     proxy_read_timeout 90s;
    
     # change this to your actual domain name
     proxy_redirect http://127.0.0.1:8080 http://jenkins.euantorano.co.uk;
    
     proxy_http_version 1.1;
     proxy_request_buffering off;
    
     }
    }' | sudo tee /usr/pkg/etc/nginx/conf.d/jenkins.conf
    
    
    지금부터 nginx를 시작하겠습니다.
    sudo /etc/rc.d/nginx start
    
    
    Nginx
    Java 설치
    젠킨스는 Java를 사용하므로 설치해야 합니다.NetBSD 의 OpenJDK 11과 같이 OpenJDK8의 바이너리 패키지를 사용합니다.
    sudo pkgin install openjdk8
    
    
    currently (at the time of writing) has a bug related to network connections
    젠킨스를 설치하다
    Jenkins는 NetBSD에서 소프트웨어 패키지 형식으로 제공되었지만 유감스럽게도 본고를 작성할 때까지 사용할 수 있는 버전은 이미 유행이 지났다(소프트웨어 패키지 버전 2.73, 현재 버전 2.259).따라서 Jenkins 웹 사이트에서 현재 버전을 다운로드하여 사용할 예정입니다.
    sudo mkdir -p /usr/lib/jenkins
    sudo mkdir -p /var/lib/jenkins
    sudo mkdir -p /var/log/jenkins
    sudo chown jenkin:jenkins /var/log/jenkins
    sudo ftp -o /usr/lib/jenkins/jenkins.war https://get.jenkins.io/war/latest/jenkins.war
    # create a group for jenkins to run under
    sudo groupadd jenkins
    # create a user for jenkins to run under
    sudo useradd -s /sbin/nologin -g jenkins -m -d /home/jenkins jenkins
    # Create an RC script for Jenkins
    echo '#!/bin/sh
    
    # PROVIDE: jenkins
    # REQUIRE: DAEMON
    
    . /etc/rc.subr
    
    JENKINS_USER=jenkins
    JENKINS_GROUP=jenkins
    
    JENKINS_HOME=/home/jenkins
    export JENKINS_HOME
    
    name="jenkins"
    rcvar=$name
    pidfile="/var/run/jenkins.pid"
    start_cmd="jenkins_start"
    stop_cmd="jenkins_stop"
    status_cmd="jenkins_status"
    version_cmd="jenkins_version"
    extra_commands="status version"
    
    jenkins_start()
    {
     su -m jenkins:jenkins -c '\''nohup \
     /usr/pkg/java/openjdk8/bin/java -jar /usr/lib/jenkins/jenkins.war \
     --httpPort=8080 --httpListenAddress=127.0.0.1 \
     </dev/null >> /var/log/jenkins/jenkins.log 2>&1 &'\''
     pid=$!
     echo "$pid" > $pidfile
    }
    
    jenkins_stop()
    {
     if [! -f "$pidfile"]; then
     echo "Jenkins is not running"
     exit 1
     fi
    
     pid=$(cat "$pidfile")
     kill -15 "$pid"
     rm "$pidfile"
    }
    
    jenkins_status()
    {
     if [! -f "$pidfile"]; then
     echo "Jenkins is not running"
     exit 1
     fi
    
     pid=$(cat "$pidfile")
     kill -0 "$pid"
     if [$? -eq 0]; then
     echo "Jenkins is running (PID $pid)"
     exit 0
     else
     echo "Jenkins is not running"
     rm "$pidfile"
     exit 1
     fi
    }
    
    jenkins_version()
    {
     /usr/pkg/java/openjdk8/bin/java -jar /usr/lib/jenkins/jenkins.war --version
    }
    
    load_rc_config "$name"
    run_rc_command "$1"' | sudo tee /etc/rc.d/jenkins
    sudo chmod +x /etc/rc.d/jenkins
    
    
    이제 젠킨스부터 시작하자.
    sudo /etc/rc.d/jenkins start
    
    

    끝맺다
    Jenkins는 현재 Nginx 이후에 역방향 에이전트로 실행되고 있지만, Jenkins의 웹 UI 설치와 구축 설정 작업을 실행하는 등 아직도 해야 할 작업이 있습니다.HTTPS를 설정하는 것도 좋은 방법일 수 있습니다.아마 이것들은 잠시 독자들에게 남겨 두겠지!
    첫 번째는 제가 처음으로 진정으로 NetBSD를 사용한 것입니다. 왜냐하면 저는 보통 FreeBSD나 OpenBSD를 사용하기 때문에 더 간결하거나 더 좋은 방식으로 완성할 수 있는 것이 있으면 저에게 알려주세요!

    좋은 웹페이지 즐겨찾기