jenkins的基本配置

跨站设置:安装好jenkins后,先在系统管理—全局安全设置—取消跨站请求保护
在这里插入图片描述
组件设置:若使用maven、docker等组件,建议先在系统设置-全局工具设置中先配置好组件的位置等,建议使用自己安装的组件,便于调整配置。
在这里插入图片描述
在这里插入图片描述
这里需要留意一下,jenkins的所有操作都是基于jenkins的自建用户jenkins来执行的,所以需要注意权限问题,比如需将jenkins与docker添加到同一个用户组中,为jenkins提供docker的执行权限
sudu groupadd docker --为docker添加一个用户组
sudo gpasswd -a jenkins docker --将jenkins添加到该group中
sudo service docker restart --如果docker是使用服务方式安装的则使用该命令重启
sudo service jenkins restart --重启jenkins后生效

注意:jenkins任务的工作目录是可以指定的,任务执行时只能访问到其工作目录的一层,默认情况下工作目录为/var/lib/jenkins/workspase/$jobName中。所以其任务只能访问到这一层以下的内容,不能访问其他路径的信息。

jenkins-client

jenkins-client是jenkins提供给用户调用rest-api的工具包(当然并不是所有的功能都可以通过调用这个包来实现,比如操作jenkins的凭证信息,但这些操作可以通过调用rest来实现)。
jenkins-client的GitHub:https://github.com/jenkinsci/java-client-api

pom.xml

首先引入jenkins-client到pom中

<dependency>
  <groupId>com.offbytwo.jenkins</groupId>
  <artifactId>jenkins-client</artifactId>
  <version>0.3.8</version>
</dependency>

JenkinsServer

创建JenkinsServer

官方为我们提供了链接的建立方式

JenkinsServer jenkins = new JenkinsServer(new URI("http://localhost:8080/jenkins"), "admin", "password")

若使用springboot框架则需要设置一个configuration来提供jenkinsServer

application.yml(配置yml时要记得冒号后是有一个空格的)

project: 
    jenkins:
       server-uri: http://xx.xx.xx.xx:8088   --jenkins服务的地址,端口默认8080
       username: sTehySrh2Q/91Nc0zpf69g==    --jenkins账号
       password: m2sdoVKB4EfWko8x3FK4Bw==   --jenkins密码

JenkinsProperties

@Data  --Data注解是lombok提供的,可以为当前类提供基本的构造方法和get 、set方法
public class JenkinsProperties {
    private String serverUri;
    private String username;
    private String password;
}

JenkinsConfiguration

@Configuration
public class JenkinsConfiguration {

    /*为jenkinsProperties注入配置值,也可以在jenkinsProperties上添加Component注解和ConfigurationProperties(prefix="project.jenkins")注解来实现注入功能*/
    @Bean(name = "jenkinsProperties")
    public JenkinsProperties jenkinsProperties(
            @Value("${project.jenkins.server-uri}") String serverUri,
            @Value("${project.jenkins.username}") String username,
            @Value("${project.jenkins.password}") String password) {
        JenkinsProperties jenkinsProperties = new JenkinsProperties();
        jenkinsProperties.setServerUri(serverUri);
        jenkinsProperties.setUsername(EncryptUtils.decrypt(username));
        jenkinsProperties.setPassword(EncryptUtils.decrypt(password));
        return jenkinsProperties;
    }

/*注入jenkinsHttpClient对象*/
    @Bean(name = "jenkinsHttpClient")
    @Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
    public JenkinsHttpClient getJenkinsHttpClient(@Qualifier("jenkinsProperties") JenkinsProperties jenkinsProperties) throws URISyntaxException {
        return new JenkinsHttpClient(
                new URI(jenkinsProperties.getServerUri()),
                jenkinsProperties.getUsername(),
                jenkinsProperties.getPassword());
    }

    /*注入jenkinsServer对象*/
    @Bean(name = "jenkinsServer")
    @Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
    public JenkinsServer getJenkinsServer(@Qualifier("jenkinsHttpClient") JenkinsHttpClient jenkinsHttpClient) {
        return new JenkinsServer(jenkinsHttpClient);
    }
}

这两种方式下我们都拿到了JenkinsServer对象,看使用情况和使用的框架抉择就好。

使用JenkinsServer

首先我们先在jenkins中创建一个简单的任务(任务类型无所谓,但大多数情况下自由风格任务足够我们使用,或有特殊情况需要一些特殊操作,需要使用流水线任务)
在这里插入图片描述

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class JenkinsUtilsTest {
    @Autowired
    JenkinsServer jenkinsServer;

    @Test
    public void test(){

        try {
/*jenkinsServer最常使用的是Job类(任务)和Build(构建)类
   job:对应jenkins的任务,其子类JobWithDetails中有多的操作方法
   build:对应jenkins任务的构建,可以看到构建的结果,构建的状态等,其子类BuildWithDetails中有更多的操作方法。
  这里写一些常用方法调用方式,其他方法可以看一下源码包,命名方式非常规范,见名知意。
*/
            JobWithDetails job = jenkinsServer.getJob("my-job"); /*根据名称获取job*/
            job.getNextBuildNumber();    /*获取下一次构建的构建编号,可以用于在触发构建前,先记录构建编号。在后续获取指定编号的构建结果*/
            job.build();                 /*执行指定任务的构建操作*/

            Build build = job.getBuildByNumber(1);  /*获取某任务第一次构建的构建对象*/
            BuildWithDetails buildWithDetails = build.details(); /*子类转型*/
            String log = buildWithDetails.getConsoleOutputText(); /*获取构建的控制台输出信息 ,即构建日志*/

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

jobxml

jenkins的任务在rest中是以xml格式进行交互的,我们可以先查看我们之前创建任务的xml,然后参考添加新的内容。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class JenkinsUtilsTest {
    @Autowired
    JenkinsServer jenkinsServer;

    @Test
    public void test(){

        try {
            System.out.println(jenkinsServer.getJobXml("my-job"));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

xml内容

<?xml version='1.1' encoding='UTF-8'?>
<project>
  <actions/>
  <description></description>
  <keepDependencies>false</keepDependencies>
  <properties/>
  <scm class="hudson.scm.NullSCM"/>
  <canRoam>true</canRoam>
  <disabled>false</disabled>
  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
  <triggers/>
  <concurrentBuild>false</concurrentBuild>
  <builders/>
  <publishers/>
  <buildWrappers/>
</project>

创建任务

那么反之我们也可以通过xml报文生成任务
报文中主要需要注意几个标签

<scm>

scm标签:scm标签主要用来控制源码管理相关的内容
在这里插入图片描述
class 属性指定源码管理的工具类型(git、svn)
以git举例

<scm class="hudson.plugins.git.GitSCM" plugin="git@3.9.1">
    <configVersion>2</configVersion>
    <userRemoteConfigs>
      <hudson.plugins.git.UserRemoteConfig>
        <url>https://github.com/megagao/production_ssm.git</url>
        <credentialsId>8dc97fd3-8505-49aa-80e6-6c6d897a6565</credentialsId>
      </hudson.plugins.git.UserRemoteConfig>
    </userRemoteConfigs>
    <branches>
      <hudson.plugins.git.BranchSpec>
        <name>*/master</name>
      </hudson.plugins.git.BranchSpec>
    </branches>
    <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
    <submoduleCfg class="list"/>
    <extensions/>
  </scm>

plugin:指定使用的插件版本号(可以使用JenkinsServer.getPluginManager().getPlugins()来获取所有的插件信息),
configVersion:配置类型使用默认的2即可
url:git地址配置
credentialsId:凭证编号,即登录的凭证信息ID(这个配置在api中是没有提供的,但我们可以通过rest直接访问credentialsid的配置地址来进行设置,具体的调用方式后面再写)。
branches.name:分支名称

<builders>

builders标签控制构建操作
在这里插入图片描述
以maven构建+docker构建为例

<builders>
    <hudson.tasks.Maven>
      <targets>clean package</targets>
      <mavenName>maven</mavenName>
      <pom>pom.xml</pom>
      <usePrivateRepository>false</usePrivateRepository>
      <settings class="jenkins.mvn.FilePathSettingsProvider">
        <path>/usr/local/maven/apache-maven-3.6.0/conf/settings.xml</path>
      </settings>
      <globalSettings class="jenkins.mvn.DefaultGlobalSettingsProvider"/>
      <injectBuildVariables>false</injectBuildVariables>
    </hudson.tasks.Maven>
    <com.cloudbees.dockerpublish.DockerBuilder plugin="docker-build-publish@1.3.2">
      <server plugin="docker-commons@1.13"/>
      <registry plugin="docker-commons@1.13">
        <credentialsId>17ab4779-8b1a-435f-bb1d-124a15348708</credentialsId>
      </registry>
      <repoName>newproject</repoName>
      <noCache>false</noCache>
      <forcePull>true</forcePull>
      <skipBuild>false</skipBuild>
      <skipDecorate>false</skipDecorate>
      <repoTag>v1</repoTag>
      <skipPush>false</skipPush>
      <createFingerprint>true</createFingerprint>
      <skipTagLatest>false</skipTagLatest>
      <buildAdditionalArgs></buildAdditionalArgs>
      <forceTag>false</forceTag>
      <dockerToolName></dockerToolName>
    </com.cloudbees.dockerpublish.DockerBuilder>
  </builders>

大部分标签都是见名知意的,配置与页面的配置基本都可以通过名称对应上
plugin都是引入的插件名称和版本号
skilPush:是跳过push操作,如果只需要生成镜像不需要推送到镜像仓库的话则配置为true。

根据报文创建任务

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class JenkinsUtilsTest {
    @Autowired
    JenkinsServer jenkinsServer;

    @Test
    public void test(){

        try {
            jenkinsServer.createJob("my-job","xxxxxxxxx");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

将大部分构建操作都提取出模板后可以通过freemaker、XStream来快速拼装报文内容创建或修改任务信息

XStream
在这里插入图片描述

freemaker
在这里插入图片描述
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐