惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
P
Palo Alto Networks Blog
阮一峰的网络日志
阮一峰的网络日志
博客园_首页
Last Week in AI
Last Week in AI
Blog — PlanetScale
Blog — PlanetScale
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
The Cloudflare Blog
I
Intezer
P
Privacy International News Feed
C
Check Point Blog
C
CERT Recently Published Vulnerability Notes
Apple Machine Learning Research
Apple Machine Learning Research
H
Hackread – Cybersecurity News, Data Breaches, AI and More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Hacker News
The Hacker News
B
Blog
Latest news
Latest news
小众软件
小众软件
Engineering at Meta
Engineering at Meta
Cyberwarzone
Cyberwarzone
Project Zero
Project Zero
P
Proofpoint News Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Schneier on Security
美团技术团队
G
GRAHAM CLULEY
博客园 - 司徒正美
T
Threatpost
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 叶小钗
C
Cisco Blogs
MongoDB | Blog
MongoDB | Blog
人人都是产品经理
人人都是产品经理
博客园 - 三生石上(FineUI控件)
H
Help Net Security
Simon Willison's Weblog
Simon Willison's Weblog
Cisco Talos Blog
Cisco Talos Blog
K
Kaspersky official blog
NISL@THU
NISL@THU
AWS News Blog
AWS News Blog
T
Threat Research - Cisco Blogs
月光博客
月光博客
Security Latest
Security Latest
Scott Helme
Scott Helme
T
Tenable Blog

博客 on 打工人日志

k8s RKE2 cilium L2 + envoy gateway 安装配置 k8s RKE2 vSphere 存储配置 OpenClaw 全能指南:从安装到进阶自动化实战 (2026 最终版) Kubernetes — skywalking + banyanDB APM监控部署 Kubernetes — promtail + loki + grafana 日志系统部署 k8s master 节点 Unauthorized Kubernetes — metalLB + Traefik 部署 Kubernetes — SSL 证书自动更新 Kubernetes — RKE2 + kube-vip + cilium 部署 使用TLSv1.3 升级nginx和openssl Proxmox VE(PVE) 更新到最新版本 kindle 邮件发送失败,错误代码E999 metallb + ingress-nginx + argocd 本地部署 iStoreOS(旁路由)使用openclash实现dns劫持 异常流量分析:图片库服务黑客入侵 openwrt 硬盘扩容 搭建ip地址检索服务 Kubernetes — k8s 手动安装 1.17.9 SELinux 问题:导致端口无法创建,无法访问 【福利】免费!本地部署!去除视频中移动的物体 通知:《打工人日报》迁移到独立板块 KyBook 3 | calibre-web - IOS系统最佳图书伴侣 Tmux 安装和使用教程 DockerHub 加速镜像部署 - 使用cloudflare 代理 docker的零停机部署 SD-webui 批量处理图片 ubuntu 安装 ComfyUI ubuntu 安装 stable-diffusion-webui 测试策略:微服务架构 单元测试:测试单元质量提升 端到端测试:模拟用户体验 Kubernetes — containerd 安装和部署 CI/CD 可观察性-基于grafana Argo cd 安装和部署 linux服务器进程打开文件过多导致服务异常 使用 ElasticSearch Curator 7天定期删除日志 sonarqube docker安装和配置 SSH 通过 443 端口连接 GitHub iOS 17 「待机显示」适配普通 iPhone(非 Pro/Max),屏幕在充电时常亮 GNU/Linux 一键更换系统软件源脚本 解决Elasticsearch索引只读(read-only) 【福利】埃隆·马斯克传 [沃尔特·艾萨克森] 在线下载 【破解】小鹏P5和小鹏G9开启adb和网络adb Kubernetes — kubecost 分析 Kubernetes 成本 3D Gaussian Splatting:3D模型渲染 Linux 系统收包流程以及内核参数优化 2023亚运会电竞门票民购买指南(报名+抽签) Vue3 + vite + nginx项目部署后404问题 大麦抢票辅助软件(福利 TFBOYS十年之约演唱会 2023 全机位 视频) 黑群晖最新安装教程 Ansible部署ceph集群 最好的微信朋友圈集赞神器-福利推荐 推荐一下 容器云资源 2010年的天涯神贴聊房价 如何礼貌回绝不合理的需求 nginx 配置和编译 github 国内代理访问下载 使用scrapy-redis实现增量爬取 逆境和成长-2022年终总结 优雅的使用Conda管理python环境 Kubernetes — 更新证书 shell功能脚本集合 Nexus3 使用和部署 githubAction set-output弃用错误 Kubernetes — Rook云存储介绍和部署 Kubernetes — 基于K8S搭建Ceph分布式存储 Kubernetes — 探针和生命周期 Kubernetes — 开放标准(OCI、CRI、CNI、CSI、SMI、CPI)概述 kubernetes 部署插件 (Flannel、Web UI、CoreDNS、Ingress Controller) Cloudflare Zero Trust 内网穿透 k8s CNI 问题 连接认证失效 k8s.gcr.io国内无法连接解决方法 headscale 部署使用 羊了个羊小程序 破解通关 K8S 问题排查:cgroup 内存泄露问题 RocketMQ k8s部署 4主4从集群 docker 问题处理 kubernetes 存储 linux服务器 删除空间却未释放 kubernetes 从1.23.x 升级到 1.24.x 编写 kubernetes 资源描述文件 nginx ssh-key connection exception kubernetes manual expansion VSCode插件推荐=> Code Runner ant build.xml 编写 kubernetes 调度过程 记录一次上门打散工 k8s本地联调神器kt-connect Ant中如何添加第三方jar包依赖 OpenELB:让k8s私有环境对外暴露端口 linux 网络测速 安装 docker 出现 ERROR: Unsupported distribution 'ol' 问题 logrotate 日志滚动的使用 nginx 编译参数详解 nginx 重写规则 rewrite模块 nginx.conf 配置文件详解 rsync 文件同步 nginx 日志格式整理 163企业邮箱设置教程 2021年第50周记
Jenkins 编译Android apk 流水线
2022-11-25 · via 博客 on 打工人日志

背景

Jenkins 编译 Android apk,上传 apk 包,生成下载二维码,并推送钉钉

安装 Android 环境

安装 JDK

 1# 这里使用的是openjdk 1.8.0版本,有需要的话需要到java官网上进行下载对应的JDK版本。
 2$ yum install java -y
 3
 4# 其他版本JDK的安装方式
 5$ mv jdk1.8.0_161 /usr/local/
 6$ ln -s /usr/local/jdk1.8.0_161 /usr/local/jdk
 7$ vim /etc/profile     #配置JDK的环境变量
 8export JAVA_HOME=/usr/local/jdk
 9export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
10export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
11$ source /etc/profile    #重新加载系统环境变量
12$ java -version    #查看java版本

Android SDK 安装

 1# 下载sdk工具包
 2$ wget https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip
 3
 4# 创建sdk工具文件夹和解压工具包
 5$ mkdir  -p /opt/android/sdk
 6$ unzip sdk-tools-linux-3859397.zip -d /opt/android/sdk
 7
 8# 使用sdkmanager工具配置构建工具和平台版本
 9$ cd /opt/android/sdk/tools/bin/
10$ ./sdkmanager "build-tools;29.0.6" "platforms;android-29" "platform-tools"
11$ ./sdkmanager --list    #可以查看有哪些版本,自行选择对应的版本
12
13# 增加系统环境变量
14$ vim /etc/profile
15export ANDROID_HOME=/opt/android/sdk
16PATH=$PATH:$ANDROID_HOME:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$ANDROID_HOME/tools/bin
17
18$ adb version
19Android Debug Bridge version 1.0.41
20Version 29.0.6-6198805
21Installed as /opt/android/sdk/platform-tools/adb

安装 gradle

 1$ wget https://downloads.gradle-dn.com/distributions/gradle-6.3-all.zip
 2$ mkdir /opt/gradle
 3$ unzip gradle-6.3-all.zip -d /opt/gradle/
 4$ vim /etc/profile
 5export PATH=$PATH:/opt/gradle/gradle-6.3/bin
 6$ source /etc/profile
 7$ gradle -v
 8------------------------------------------------------------
 9Gradle 6.3
10------------------------------------------------------------
11
12Build time:   2020-03-24 19:52:07 UTC
13Revision:     bacd40b727b0130eeac8855ae3f9fd9a0b207c60
14
15Kotlin:       1.3.70
16Groovy:       2.5.10
17Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
18JVM:          1.8.0_201 (Oracle Corporation 25.201-b09)
19OS:           Linux 3.10.0-693.el7.x86_64 amd64

jenkins 流水线配置

gradle-jdk.sh 打包脚本

1#!/bin/sh
2source /etc/profile
3# /home/编译目录
4cd /home/编译目录 && gradle clean
5cd /home/编译目录 && gradle assembleRelease
6# 打包编译完成,在项目的app/build/outputs/apk中可以找到debug版本或者是release版本。

JenkinsFile 脚本

  1pipeline {
  2    //使用标签 'master' 的节点
  3    agent {label 'master'}
  4    //环境变量
  5    environment {
  6        //成功运行特征
  7        JEN_FEATURE = ''
  8        //日志路径
  9        JEN_LOG = ''
 10    }
 11
 12    stages {
 13        stage ('编译打包'){
 14            steps {
 15                sh 'cd /home/编译目录 && sudo git pull'
 16                sh 'sh gradle-apk.sh'
 17
 18            }
 19        }
 20
 21        stage ('上传'){
 22            steps {
 23                sh 'sshpass -p "password" scp /home/编译目录/app/build/outputs/apk/release/app-release.apk user@www.nginx.com:/home/上传目录/app-release.apk'
 24            }
 25        }
 26
 27        stage ('生成qr'){
 28            steps {
 29                echo "生成test qr"
 30                sh "pwd && myqr 'https://www.nginx.com/app-release.apk' -n qrcode-`date +'%Y-%m-%d-%H%M%S'`.png -d /home/code/image"
 31                sh "cd /home/code/image && git add ."
 32                sh "cd /home/code/image && git commit -m 'new images'"
 33                sh "cd /home/code/image && git push origin main"
 34                echo "结束 end"
 35            }
 36        }
 37    }
 38
 39
 40    post {
 41        success {
 42            script {
 43                env.DATETIME = sh(script:"date", returnStdout: true).trim()
 44                env.QRCODE = sh(script:"ls -lhst /home/code/image | awk 'NR==2' | awk '{print \$10}'",returnStdout: true).trim()
 45                def job_name = "# ${JOB_NAME} 流水线 执行成功"
 46                def jenkinsid = """构建:  第 ${BUILD_ID} 次执行"""
 47                def JEN_production = "> 部署节点: jenkins"
 48                def build_url = "> 部署详情: [详情](${BUILD_URL})"
 49                def jen_date = "> 执行时间: ${env.DATETIME}"
 50                def jen_qrcode = "![qr](https://gitlab.com/jobcher/image/-/raw/main/${env.QRCODE})"
 51
 52                dingtalk (
 53                    robot: 'e3999649-d3f-钉钉key-4c57333a327b',
 54                    type: 'MARKDOWN',
 55                    title: job_name,
 56                    text: [
 57                        job_name,
 58                        jenkinsid,
 59                        '',
 60                        '---',
 61                        jen_qrcode,
 62                        JEN_production,
 63                        '',
 64                        build_url,
 65                        '',
 66                        jen_date
 67                        ],
 68                    at: [
 69                        '手机号'
 70                        ]
 71                )
 72            }
 73        }
 74
 75        failure {
 76            script {
 77                env.DATETIME = sh(script:"date", returnStdout: true).trim()
 78                def job_name = "# ${JOB_NAME} 流水线 执行失败"
 79                def jenkinsid = """构建:  第 ${BUILD_ID} 次执行"""
 80                def JEN_production = "> 部署节点: jenkins"
 81                def build_url = "> 部署详情: [详情](${BUILD_URL})"
 82                def jen_date = "> 执行时间: ${env.DATETIME}"
 83
 84                dingtalk (
 85                    robot: 'e3999649-d3f-钉钉key-4c57333a327b',
 86                    type: 'MARKDOWN',
 87                    title: job_name,
 88                    text: [
 89                        job_name,
 90                        jenkinsid,
 91                        '',
 92                        '---',
 93                        JEN_production,
 94                        '',
 95                        build_url,
 96                        '',
 97                        jen_date
 98                        ],
 99                    at: [
100                        '手机号'
101                        ]
102                )
103            }
104        }
105    }
106}