一、扯闲篇

打包对于每个客户端开发来说是家常便饭,在整个开发流程中,咱们或许会打很屡次的包,本地build运转验证,打包给测试,啥?有bug?,持续。。。。咱们本地调试的时分能够直接运转,可是给测试供给测试包或许产品供给验收包的时分,一般是给链接让他们自行下载,或许让他们自行点击构建,此刻就需求一个构建打包的渠道了,所以需求就又来了。。。

从头到尾开发一个相似渠道需求不少的资源,一般情况下,没有沙雕会这么做,除非是大厂,有许多构建的需求,内部会有相似的渠道,咱们曾经公司内部有用“摩天轮”,现在换公司了,现在公司用的其他的渠道,总感觉不好用,所以决议运用开源的Jenkins来建立自己的打包渠道(都是由于闲的)

由于是是在本地建立的,所以我下面以Mac os作为比方

二、建立流程

1、装置

一言不合就直接上链接了,www.jenkins.io/download/we… ,官网直接下载

0代码搭建Android打包平台

a、 由于是mac环境,直接一个指令就好 brew install jenkins

b、 当然,假如本来没有装过brew,是会收成 brew command not found ****一枚,不要方,百度一下你就知道,再来一个指令 /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” “)****即可。之后就依照提示挑选,然后便是等候。。。主动装置一堆东西后,就提示成功了。

c、 终究记住brew doctor 一下,会有些warning,依照提示履行对应指令就好,试了下,感觉中科大的源比较快,建议运用这个。

d、 等悉数装置完再履行 brew services start jenkins 其实我终究发动的时分是直接运转 /opt/homebrew/bin/jenkins 文件的。

好了,以上便是装置了。

2、装备

1、发动

上面装置完今后,就直接在浏览器输入 http://localhost:8080 就会翻开jenkins了,初次翻开不要着急,等下会呈现一个输入暗码的页面,暗码在发动的的终端窗口里,或许 /Users/xxx/.jenkins/secrets/initialAdminPassword 下面,仿制粘贴就好。

紧接着会让你安转相应插件,左边是默许的,右边是自定义,一般咱们选左边的默许的,点击后,又是等候。等候之后会提示创立一个账号。

2、新建节点

等悉数装置完今后,会进入jenkins的页面,还没完,刚进来会提示让你创立新节点,一般不运用默许节点,创立节点主要便是填写称号,和你的作业途径

0代码搭建Android打包平台

随便填个本地目录就好,最大构建数看着填,然后保存,此刻的节点是不能用的,从头翻开这个节点,中间会显示各个体系下的指令,挑选当前体系的指令,在终端直接运转即可,终究把默许节点的最大构建数填0,不然会一向提示你。

3、新建使命

称号看着填,然后我是挑选多分支流水线,这个更符合我的要求,挑选完后点确认。

0代码搭建Android打包平台

接下来便是装备这个使命,简单说便是填写库房地址,点击添加源,填入git地址和凭证,凭证便是对应的账号暗码,之前没有填过就创立,终究保存。

0代码搭建Android打包平台

创立完结会呈现以下页面,下图是现已创立了两个使命了。

0代码搭建Android打包平台

咱们点击其中的一个使命,到以下页面

0代码搭建Android打包平台

对了,上面创立使命的地方有个Build Configuration, 规则便是读取库房分支下的Jenkinsfile文件,有这个Jenkinsfile文件,上图才会呈现。

0代码搭建Android打包平台

终究还需奥装备一下邮件,也便是构建完结或发邮件,需求在体系设置的最下面,装备邮箱,这个就不叙述了,能够自行查找。

到这儿,一个使命就创立好了。

3、脚本

脚本便是上述的Jenkinsfile文件

pipeline {
    agent any
    environment {
        GIT_URL = 'https://xxx.git'
        GIT_CREDENTIAL_ID = 'git'
    }
    parameters {
        text( name: 'BRANCH', description: '分支', defaultValue: 'master', trim: true)
        text( name: 'VERSION_NAME', description: '版本称号', defaultValue: '1.0.0', trim: true)
        text( name: 'VERSION_CODE', description: '版本编号', defaultValue: '1', trim: true)
        choice( name: 'GRADLE_BUILD_TYPE', description: 'Gradle 构建类型', choices: '构建测试包\n构建正式包')
    }
    stages {
        stage('Init') {
            steps {
                script {
                    if (!params.BRANCH?.trim() || !params.VERSION_NAME?.trim() || !params.VERSION_CODE?.trim() || (!params.GRADLE_BUILD_TYPE?.trim())) {
                        error('Build parameters required')
                    }
                }
            }
        }
        stage('Checkout') {
            steps {
                git url: "${env.GIT_URL}",
                    branch: "${params.BRANCH}",
                    credentialsId: "${env.GIT_CREDENTIAL_ID}"
            }
        }
        stage('Build') {
            steps {
                withGradle {
                    script {
                        def command = ''
                        switch(params.GRADLE_BUILD_TYPE) {
                            case '构建测试包':
                            command = 'Debug'
                            break
                            case '构建正式包':
                            command = 'Release'
                            break
                        }
                        sh "./gradlew clean"
                        sh "./gradlew --no-daemon assembleArm64${command} --stacktrace"
                    }
                }
            }
        }
        stage('Upload'){
            steps {
                archiveArtifacts artifacts: 'app/build/outputs/apk/arm64/debug/*.apk,app/build/outputs/apk/arm/debug/*.apk,app/build/outputs/apk/arm/release/*.apk,app/build/outputs/apk/arm64/release/*.apk', followSymlinks: false, onlyIfSuccessful: true
            }
        }
    }
    post {
        always {
            emailext subject: '${DEFAULT_SUBJECT}',
                body: '${DEFAULT_CONTENT}',
                recipientProviders: [developers(), requestor()]
        }
    }
}

0代码搭建Android打包平台

脚本中的stage 对应上图中的各个过程。

第一次构建的时分是没有Build with Parameters选项的,点构建,才会呈现。

产品归档是要单独处理下,本来产品归档是在上面直接装备的,现在是填在pipeline里边,也便是Jenkinsfile文件里边。

 stage('Upload'){
          steps {
              archiveArtifacts artifacts: 'app/build/outputs/apk/arm64/debug/*.apk,app/build/outputs/apk/arm/debug/*.apk,app/build/outputs/apk/arm/release/*.apk,app/build/outputs/apk/arm64/release/*.apk', followSymlinks: false, onlyIfSuccessful: true
          }
}

具体指令生成能够在 DashBoard -> 使命 -> 分支 -> 流水线语法 目录下生成然后填入Jenkinsfile即可,当然这个产品仅仅本机上的,咱们也能够上传到oss(自定义插件) 或许蒲公英渠道(有对应插件),然后将对应链接归档即可。

之后,不出其他意外,这个使命就能够构建了。

0代码搭建Android打包平台

Console Output菜单能够检查日志,产品也会展示在页面上。点击就会下载了,他人需求打包或许对应的apk文件,直接把当前使命给对方即可。

好了,一个Android的构建渠道搭好了,现在咱们是不是一行代码都没有写,哈哈哈。

三、其他

上述是运用Jenkins来构建Android的基本过程,咱们都知道Jenkins是一个持续集成的渠道,咱们想做任何的功用都能够往上堆,比方IOS的构建,比方构建后的发版,都能够经过Jenkins完结,当然这是后话了。

咱们发现Jenkins默许的页面是不是不太好看,一个小老头,哈哈哈,也是能够改的,这儿推荐个库

afonsof.com/jenkins-mat…

0代码搭建Android打包平台

1、在插件办理里边装置 simple theme 插件

2、翻开上述网址,挑选主题色 ,挑选logo,10kb以内哈,然后下载,并在jenkins体系设置页面的Theme选项下导入Extra Css ,把下载的css文件内容拷贝进去即可。

0代码搭建Android打包平台

不过实测的时分,不知道什么原因,title的样色背景以及logo没有收效,不管了,直接在网页上”右键” -> “检查”

0代码搭建Android打包平台

拿到布局后用css直接从头描述一番,先把jenkins-home-link给隐藏掉,然后给“logo”这个div 加个before和after,设置logo和标题

#jenkins-home-link {
  display:none;
}
#page-header {
 Background-color: #5D9AF8;
}
#model-link {
 color: #5D9AF8;
}
.logo:before {
    content: "";
    width: 40px;
    height: 40px;
    background: url("/static/6a95f0e8/images/svgs/ic_login_logo.png");
    background-size: cover;
}
.logo:after {
    content: "我是标题";
    text-transform:none;
    font-weight: bold;
    font-size: 30px;   
    color: white;    
    line-height: 40px;
    margin-left: 20px;
}

然后这个logo直接放到 /Users/xxx/.jenkins/war/images 目录下面即可 也便是你的装置目录,假如你不是装置在这儿的,就换成的对应的装置目录即可,终究在jenkins体系设置导入这个css,完事后,重启服务

0代码搭建Android打包平台

完美!!!

四、运用Docker布置

1、下载Docker客户端

mac: docs.docker.com/docker-for-…
windows: docs.docker.com/docker-for-…

也能够脚本安转:

// 脚本装置方式
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

记住把docker加到环境变量装备中

export DOCKER_PATH="/Applications/Docker.app/Contents/Resources/bin"
export PATH=".$PATH:$DOCKER_PATH"

完结后记住 docker -v 一下 ,成功的话,会显示版本号

2、装置jenkins

1、检查jenkins源

经过指令 docker search jenkins 检查所有源

0代码搭建Android打包平台

我运用的是jenkins/jenkins,即docker pull jenkins/jenkins,然后便是下载了。

2、发动jenkins

直接运用指令 docker run -d –name docker-jenkins -p 8008:8080 -p 50000:50000 jenkins/jenkins

jenkins发动默许运用的8080,指令里边做个映射,即http://127.0.0.1:8008 。不出意外,你的jenkins发动了,不出意外你浏览器输入http://127.0.0.1:8008就能翻开以下页面了。

0代码搭建Android打包平台

这个暗码在docker客户端日志里边能够看到

0代码搭建Android打包平台

仿制输入即可,然后能够了。

当然事情必定不会这么顺利,等我输入完暗码后,直接来了个 No such plugin: cloudbees-folder

0代码搭建Android打包平台
便是装置目录下没有cloudbees-folder插件,这个手动下载一下,然后把文件传到docker中去.

i、下载

翻开链接“ftp.icm.edu.pl/packages/je…”,在最下面找到并翻开“latest”目录,点击下载cloudbees-folder.hpi

ii、上传

然后便是上传,指令结构是: docker cp /途径/文件名 容器ID:/上传途径 ,比方

docker cp /Users/xxx/Downloads/cloudbees-folder.hpi b281bb1e5e84b8efc06c5eded4d19c08f9fc77d59e50c74eb982fc6060ecd36a:/var/jenkins_home/plugins

容器ID在发动jenkins的时分,终端会回来的,检查下就好。 /var/jenkins_home/plugins是Docker中jenkins的目录。顺便说下docker往实体机传文件的指令:docker cp 容器ID:/上传途径 /途径/文件名 哈哈,长得差不多。

终究重启一下jenkins,就跟在实体机发动的相同了,装置默许插件,注册新账号,然后重启。就能够看到下面的页面了

0代码搭建Android打包平台

这儿说下一些设置的装备,不像在实体机上操作,比方jdk,git,直接导入本地途径即可,在Docker中,咱们需求检查对应的途径后,再装备到Jenkins中。

先进入docker的环境,docker exec -it jenkins的容器id /bin/bash

  1. jdk:然后经过echo $JAVA_HOME来检查 java 途径在/usr/local中,然后装备进 jenkins 的 JAVA_HOME 中即可
  2. git:经过which git检查 git 履行文件途径为/usr/bin/git,把这个仿制到 jenkins 途径中
  3. mvn:jenkins 容器中一般没有 maven 供给的,所以 jenkins 装备中运用 install automatically 完美!!!

五、写在终究

终究没啥可写的,便是想说点个赞再走呗,哈哈哈。。。