Jenkins architecture consists primarily of two elements, Jenkins master andSlaves.
Jenkins master contains key configuration like Plugins, Jobs, Users, Global Security, Logs and more. It uses TCP/IP connection protocol to communicate with slaves.
Jenkins slave is java executable which runs on remote machines and it will get Jenkins master’s directions for running various jobs on it. Slaves can be configured on any type of Operating Systems like Linux, Windows, MacOS etc.
Master and Slaves setup
Configuration of Jenkins Slaves can be achieved by going to “Manage Jenkins” section and selecting “Manage Nodes and Clouds” under “System Configuration”.
Manage Jenkins —> System Configuration —> Manage Nodes and Clouds
On the “Manage Nodes and Clouds“, select the “New Node” on the left side of the dashboard.
Give the Node name as you wish and select the Permanent Agent option and click “OK“.
It will lead to the section where we can provide specific information.
Name: Give the same name you gave in the previous section while creating the node.
Description – Any description that you would like to give to this node.
# of executors – Provide the number of executors you want to add to that node.
Remote root directory – Provide the root directory path of the remote machine (Since this is the demo intent, both master and slaves will only be configured in the local machine. An empty directory got created in the local desktop).
Labels: Labels get assigned in the Jenkins builds to run the jobs on slaves . So please include your preferred label name.
Usage : There will be 2 choices to choose from in this section. The choice “Use this node as much as possible” is selected here.
Launch method: There will be various types of options in this section to be chosen to be able to connect the agent to the master.
Custom Workdir path:This path may be the same as the “Remote root directory path”
Internal data directory: remoting
Availability:There will be different choices to choose from in this section to scale up and scale down the slaves.
After filling in all the areas, click on “Save.”
Now we could see that Jenkins slave has been configured but there is still not connected to master. You can check the same thing by looking at the “red x” on slave.
Clicking on the newly formed slave, we could see various options for connecting the agent with Jenkins master.
The selected option in this scenario is to execute the command as highlighted in the above image.
Before running the command, the “agent.jar” (Mentioned in the same command) must be downloaded and saved in any preferred location, and the agent.jar ‘s path must be specified while running the command.
In this scenario, agent.jar gets copied to the local machine’s desktop and hence, run the command from the desktop path itself.
DD:Desktop DevOpsDiggers$ java -jar agent.jar -jnlpUrl http://localhost:8080/computer/Slave-1/slave-agent.jnlp -workDir "/Users/DevOpsDiggers/Desktop" Jul 27, 2020 10:31:57 AM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir INFO: Using /Users/DevOpsDiggers/Desktop/remoting as a remoting work directory Jul 27, 2020 10:31:57 AM org.jenkinsci.remoting.engine.WorkDirManager setupLogging INFO: Both error and output logs will be printed to /Users/DevOpsDiggers/Desktop/remoting Jul 27, 2020 10:31:57 AM hudson.remoting.jnlp.Main createEngine INFO: Setting up agent: Slave-1 Jul 27, 2020 10:31:57 AM hudson.remoting.jnlp.Main$CuiListener <init> INFO: Jenkins agent is running in headless mode. Jul 27, 2020 10:31:57 AM hudson.remoting.Engine startEngine INFO: Using Remoting version: 4.3 Jul 27, 2020 10:31:57 AM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir INFO: Using /Users/DevOpsDiggers/Desktop/remoting as a remoting work directory Jul 27, 2020 10:31:58 AM hudson.remoting.jnlp.Main$CuiListener status INFO: Locating server among [http://localhost:8080/] Jul 27, 2020 10:31:58 AM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver resolve INFO: Remoting server accepts the following protocols: [JNLP4-connect, Ping] Jul 27, 2020 10:31:58 AM hudson.remoting.jnlp.Main$CuiListener status INFO: Agent discovery successful Agent address: localhost Agent port: 64888 Identity: e3:74:75:54:ec:88:5c:65:5f:43:fd:62:44:6c:ef:9e Jul 27, 2020 10:31:58 AM hudson.remoting.jnlp.Main$CuiListener status INFO: Handshaking Jul 27, 2020 10:31:58 AM hudson.remoting.jnlp.Main$CuiListener status INFO: Connecting to localhost:64888 Jul 27, 2020 10:31:58 AM hudson.remoting.jnlp.Main$CuiListener status INFO: Trying protocol: JNLP4-connect Jul 27, 2020 10:31:58 AM hudson.remoting.jnlp.Main$CuiListener status INFO: Remote identity confirmed: e3:74:75:54:ec:88:5c:65:5f:43:fd:62:44:6c:ef:9e Jul 27, 2020 10:31:58 AM hudson.remoting.jnlp.Main$CuiListener status INFO: Connected WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.jenkinsci.plugins.envinject.service.EnvInjectMasterEnvVarsSetter to field java.lang.reflect.Field.modifiers WARNING: Please consider reporting this to the maintainers of org.jenkinsci.plugins.envinject.service.EnvInjectMasterEnvVarsSetter WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release
After we ran the above procedure successfully, we can see that the slave is now available and we could also see executors status in the left side corner.