Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • This agent can be running on a server next to your Jenkins controller/master or in the internal network(s)
  • agent service(s) with service auto-start to assure automatic re-connect to Jenkins controller at any time even after server reboot
    • Install dependencies
      • CentOS 7

        Code Block
        yum install java-11-openjdk-devel git -y
        # you can install also other dependencies that will be required for your jobs


      • CentOS 8/9

        Code Block
        yum install java-17-openjdk-devel git -y
        # you can install also other dependencies that will be required for your jobs


      • Ubuntu

        Code Block
        apt-get update; apt-get install openjdk-11-jdk git -y
        # you can install also other dependencies that will be required for your jobs


    • Installing agent
      • Prepare a folder for config

        Code Block
        mkdir -p /data/configs
        mkdir -p /opt/jenkins-agent


      • Create service file /opt/jenkins-agent/jenkins-agent.service

        Code Block
        titlejenkinsope.service
        [Unit]
        Description=Jenkins Agent - On Premise Executor
        Wants=network.target
        After=network.target
        
        [Service]
        # EnvironmentFile cannnot be used on Debian/Ubuntu anymore - Reference: https://github.com/varnishcache/pkg-varnish-cache/issues/24
        # So we are using drop-in config /etc/systemd/system/jenkins-agent.service.d/local.conf
        ExecStart=/usr/bin/java -Xms${JAVA_MEMORY} -Xmx${JAVA_MEMORY} -jar /opt/jenkins-agent/agent.jar -jnlpUrl ${CONTROLLER_URL}/computer/${NODE_NAME}/jenkins-agent.jnlp -secret ${SECRET} -workDir "${WORK_DIR}"
        User=jenkins-agent
        Restart=always
        RestartSec=10
        StartLimitInterval=0
        
        [Install]
        WantedBy=multi-user.target


      • Create config file /data/configs/jenkins-agent.conf

        Code Block
        JAVA_MEMORY=512m
        CONTROLLER_URL=https://jenkins.xxx.tds.customerx.com
        NODE_NAME=XXX
        SECRET=8b2911d98400bad5d45635b812b5f2e8e7c1d216bbbae9422a3ba57c691bf762
        WORK_DIR=/data/jenkins-agent


      • Create script /opt/jenkins-agent/jenkins-agent-install

        Code Block
        #!/bin/bash
        set -e
        AGENT_APP_HOME=/opt/jenkins-agent
        SRV_USER_NAME=jenkins-agent
        SRV_USER_ID="900"
        SRV_GROUP_NAME=jenkins-agent
        SRV_GROUP_ID="900"
        WORK_DIR_DEFAULT="/data/jenkins-agent"
        AGENT_SERVICE_NAME="jenkins-agent"
        AGENT_SERVICE_FILE="/usr/lib/systemd/system/$AGENT_SERVICE_NAME.service"
        AGENT_SERVICE_CFG_FOLDER="/etc/systemd/system/$AGENT_SERVICE_NAME.service.d"
        MAINCONFIG=/data/configs/jenkins-agent.conf
        
        # Making sure obsolete jenkinsope config is migrated when found
        OPE_OLD_MAINCONFIG=/data/configs/jenkinsope.conf
        [ -f $OPE_OLD_MAINCONFIG ] && mv -f $OPE_OLD_MAINCONFIG $MAINCONFIG
        
        # Loading configuration
        source $MAINCONFIG
        
        # Detecting and migrating obsolete jenkinsope account and data
        OPE_OLD_USER=jenkinsope
        OPE_OLD_HOME=/home/$OPE_OLD_USER
        if [ -d $OPE_OLD_HOME ];then
          sed -i "s#^WORK_DIR.*#WORK_DIR=$WORK_DIR_DEFAULT#g" $MAINCONFIG
          sed -i 's#^MASTER_URL#CONTROLLER_URL#g' $MAINCONFIG
          # Re-loading configuration with new values
          source $MAINCONFIG
          systemctl stop jenkinsope
          sleep 10
          rm -rf /etc/systemd/system/jenkinsope.service.d
          rm -f /usr/lib/systemd/system/jenkinsope.service
          mv $OPE_OLD_HOME $WORK_DIR
          userdel -rf $OPE_OLD_USER
        fi
        
        # Detecting and migrating obsolete jenkins-agent account and data from /home to /data
        JA_OLD_HOME=/home/$SRV_USER_NAME
        if [ -d $JA_OLD_HOME ] && [ $JA_OLD_HOME != $WORK_DIR ];then
          sed -i "s#^WORK_DIR.*#WORK_DIR=$WORK_DIR_DEFAULT#g" $MAINCONFIG
          # Re-loading configuration with new values
          source $MAINCONFIG
          systemctl stop $AGENT_SERVICE_NAME
          sleep 10
          rm -rf $AGENT_SERVICE_CFG_FOLDER
          rm -f $AGENT_SERVICE_FILE
          mv $JA_OLD_HOME $WORK_DIR
        fi
        
        echo "Preparing basic home folder structure"
        mkdir -p $WORK_DIR/.ssh
        chmod 700 $WORK_DIR/.ssh
        touch $WORK_DIR/.ssh/config
        chmod 600 $WORK_DIR/.ssh/*
        ls -lah $WORK_DIR
        
        echo "Preparing group"
        getent group $SRV_GROUP_NAME || groupadd --gid $SRV_GROUP_ID $SRV_GROUP_NAME
        getent group $SRV_GROUP_ID || groupmod -g $SRV_GROUP_ID $SRV_GROUP_NAME
        
        echo "Preparing user"
        getent passwd $SRV_USER_NAME || useradd --shell /bin/bash --uid $SRV_USER_ID --gid $SRV_GROUP_ID --create-home --home-dir /data/jenkins-agent $SRV_USER_NAME
        getent passwd $SRV_USER_NAME && usermod --shell /bin/bash --uid $SRV_USER_ID --gid $SRV_GROUP_ID --home /data/jenkins-agent $SRV_USER_NAME
        getent passwd $SRV_USER_NAME
        
        echo "Changing ownership of home/work folder ($WORK_DIR) and its content (can take long time with many files)..."
        chown $SRV_USER_NAME:$SRV_USER_NAME -R $WORK_DIR
        ls -lah $WORK_DIR
        
        echo "Installing agent"
        if [ -f $AGENT_SERVICE_FILE ];then
          echo "Previous service found, making sure it is stopped..."
          systemctl stop $AGENT_SERVICE_NAME
          sleep 5
        fi
        rm -f $AGENT_APP_HOME/agent.jar
        curl -s ${CONTROLLER_URL}/jnlpJars/agent.jar -o $AGENT_APP_HOME/agent.jar
        chmod 644 $AGENT_APP_HOME/agent.jar
        install -D -m 644 $AGENT_APP_HOME/$AGENT_SERVICE_NAME.service $AGENT_SERVICE_FILE
        
        # Check existence of JDK 11/17 and hard code it into service unit, otherwise attempt to use generic java
        JDK11="/usr/lib/jvm/java-11/bin/java"
        JDK17="/usr/lib/jvm/java-17/bin/java"
        if [ -f "$JDK17" ];then
          echo "Setting discovered OpenJDK 17 to be used by Jenkins agent."
          sed -i "s#/usr/bin/java#$JDK17#" $AGENT_SERVICE_FILE
        else
          if [ -f "$JDK11" ];then
            echo "Setting discovered OpenJDK 11 to be used by Jenkins agent as alternative."
            sed -i "s#/usr/bin/java#$JDK11#" $AGENT_SERVICE_FILE
          fi
          # Otherwise using generic java
        fi
        
        mkdir -p $AGENT_SERVICE_CFG_FOLDER
        echo "[Service]" > $AGENT_SERVICE_CFG_FOLDER/local.conf
        sed 's#^#Environment=#g' $MAINCONFIG >> $AGENT_SERVICE_CFG_FOLDER/local.conf
        systemctl daemon-reload
        systemctl restart $AGENT_SERVICE_NAME
        systemctl enable $AGENT_SERVICE_NAME
        # Using mandatory sleep otherwise checking status too early ends with error
        sleep 10
        systemctl status $AGENT_SERVICE_NAME
        
        echo "0 4 * * * root $AGENT_APP_HOME/jenkins-agent-install" > /etc/cron.d/jenkins-agent-update


      • Run install script

        Code Block
        chmod +x /opt/jenkins-agent/jenkins-agent-install
        /opt/jenkins-agent/jenkins-agent-install


    • Uninstalling agent (for cleanup purposes or if you messed up something)
      • Create script /opt/jenkins-agent/jenkins-agent-uninstall

        Code Block
        systemctl disable jenkins-agent
        systemctl stop jenkins-agent
        rm -f /usr/lib/systemd/system/jenkins-agent.service
        rm -rf /etc/systemd/system/jenkins-agent.service.d
        systemctl daemon-reload
        userdel -r jenkins-agent
        rm -rf /data/jenkins-agent


      • Run install script

        Code Block
        chmod +x /opt/jenkins-agent/jenkins-agent-uninstall
        /opt/jenkins-agent/jenkins-agent-uninstall


...