docker+jenkins+android環境搭建(使用dockerfile)

以前寫過一篇 jenkins+android打包實踐, 但依賴主機系統,有時候不太方便;html

好比同事是windows,相關shell代碼要改寫成bat才成,android sdk也要從新安裝和配置等;java

因此就想考慮使用dockerfile,一次編寫處處使用,網上搜索了下沒有找到滿意的,就手擼一個;linux

整體使用下來, 感受是簡便了不少,可是相比直接運行jenkins war包, 慢了不少,不曉得是我配置有問題仍是你們都這樣?android

環境: macOS:10.13/Docker desktop:2.0.0.3git

jenkins_android_dockerfilegithub

docker經常使用命令

# 使用docker命令前先啓動docker服務: docker.app
 # 搜索鏡像
docker search image_name
 # 下載鏡像
docker pull image_name
 # 基於某鏡像建立並運行容器,參考: http://www.runoob.com/docker/docker-run-command.html
docker run -i -t ubuntu:15.10 /bin/bash
# -i 容許你對容器內的標準輸入 (STDIN) 進行交互
# -t 在新容器內指定一個僞終端或終端
# -d 後臺運行
# -p 端口映射,格式爲: 宿主主機端口:容器端口
# --name 爲容器指定一個名稱,如 --name="hello_container"
# --dns 爲容器指定dns服務器,默認和宿主一致,如 --dns 8.8.8.8
# -v /etc/localtime:/etc/localtime 讓容器使用和服務器一樣的時間設置
 # 顯示本地鏡像列表
docker iamges
 # 刪除某個鏡像,假設存在某個image
docker rmi [image_name | image_id]
 # 從新啓動某個已中止的容器 docker start container_info -i
docker start [container_name | container_id] [-option]
docker restart [container_name | container_id]
 # 中止某個正在運行的容器
docker stop [container_name | container_id]
 # 顯示運行中的容器
docker ps
 # 顯示全部容器(包括已中止運行的)
docker ps -a
 # 刪除多個容器
docker rm container_id1 container_id2
 # 批量刪除全部退出的容器
sudo docker rm $(sudo docker ps -qf status=exited)
 # 查看指定容器內的日誌
# -f 實時跟蹤日誌
docker logs [-f] container_name
 # 保存修改到容器,並在本地生成一個新的iamge
docker commit [-m "msg"] [-a "author_name"] [container_name | container_id] new_image_name
 # 進入已運行的容器控制檯
docker exec -it [-u root] [container_name | container_id] /bin/bash # 經過-u指定登陸帳號
docker attach [container_name | container_id] # 貌似ctrl+c後會把容器也一併中止掉 ==!
 # 在宿主主機和容器之間複製文件
docker cp [host_file_path] [container_id:target_path_on_container] # 複製主機文件/目錄到容器指定路徑下
docker cp  [container_id:target_path_on_container] [host_file_path] # 複製容器中的指定文件到主機指定路徑下
 # 根據當前目錄下的 Dockerfile 文件建立鏡像
# 默認會使用緩存,經過 --no-cache = true 來禁用
docker build [--no-cache=true] -t [image_name] . # 使用默認的dockerfile文件名:  Dockerfile
docker build -t [image_name] -f ./dockerfile_name .
 # 查看容器中的環境變量
docker exec -it [container_name | container_id] env
docker inspect [container_name | container_id]
複製代碼

docker版jenkins

jenkins官網 下載列表中,點擊docker版本,會跳到 docker hub,根聽說明就知道其鏡像名稱爲: jenkins/jenkins;docker

另外, jenkins是用java開發的, 其鏡像中應該也已有了基礎系統和jdk環境, 後續咱們能夠不用另外安裝;shell

同時, jenkins插件和全局工具配置選項中,能夠直接安裝gradle/jdk/git等工具,所以只有 android sdk須要在建立鏡像時進行安裝;ubuntu

Android sdk安裝方法

方法1: 在線下載安裝

官網如今沒有直接提供完整的sdk壓縮包,而是提供的sdkmanager工具,使用它來下載所需的其餘組件;windows

sdkmanager下載地址

sdkmanager命令說明

sdkmanager --list # 列出可用的packages
sdkmanager "platform-tools" "platforms;android-28" # 安裝指定的package,會自動下載到 sdkmanager所在 tools/ 同級目錄下
複製代碼

方法2: 從宿主主機上拷貝

DockerFile 命令 ADD 能夠將宿主主機上的某個文件複製到容器內,所以能夠提早在宿主主機上下載好 android sdk, 而後使用該命令複製便可;

Dockerfile 編寫和運行

官網文檔

完整dockerfile

# 基於已有的鏡像 jenkins/jenkins 來構建新鏡像
FROM jenkins/jenkins

# 設置變量
ENV USR_LOCAL="/usr/local" \
     ANDROID_HOME="${USR_LOCAL}/AndroidSdk" \
     SDK_TOOL_URL="https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip"

# 建立android sdk目錄,並下載 sdkmanager
RUN mkdir -p ${ANDROID_HOME} \ && cd $ANDROID_HOME \ && curl -o sdk.zip $SDK_TOOL_URL \ && unzip sdk.zip \ && rm sdk.zip 
# 安裝android sdk其餘package, 輸入y是由於此處會有一個licence,須要用戶贊成後纔會安裝
RUN echo y | ${ANDROID_HOME}/tools/bin/sdkmanager "platform-tools" "platforms;android-28" "build-tools;28.0.3" 
# 設置環境變量: 把 android sdk 路徑加入到 PATH 中
ENV PATH ${ANDROID_HOME}/tools:${ANDROID_HOME}/tools/bin:${ANDROID_HOME}/platform-tools:${PATH}
複製代碼

建立好dockerfile後執行:

# 假設dockerfile文件名爲: jenkins_android_dockerfile, 則會建立 my_jenkins 鏡像
docker build -t my_jenkins -f ./jenkins_android_dockerfile .
 # 查看 my_jenkins 鏡像是否建立
docker images | grep my_jenkins
 # 基於剛纔建立的鏡像(my_jenkins)構建新容器(container_name_jenkins_android),並運行
# -p 端口映射,格式爲: 宿主主機端口:容器端口
# --name 爲容器指定一個名稱
# -v 目錄掛載, 格式爲: 宿主主機目錄路徑:容器內掛載路徑
docker run -itd -p 8080:8080 -p 50000:50000 --name container_name_jenkins_android --privileged=true  -v /Users/lynxz/host_path:/var/jenkins_home my_jenkins
 # 最後經過瀏覽器打開網址: http://localhost:8080 就可使用jenkins了
複製代碼

看了下 /var/jenkins_home 目錄(具體路徑可經過查看環境變量 JENKINS_HOME 得到), 整個jenkins插件/job等配置都在裏面,須要遷移的時候應該能夠直接複製, 我測試了下 jobs/ 是ok的;

相關文章
相關標籤/搜索