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

我啥時候說啦jj發表於2019-04-17

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

比如同事是windows,相關shell程式碼要改寫成bat才成,android sdk也要重新安裝和配置等;

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

總體使用下來, 感覺是簡便了很多,但是相比直接執行jenkins war包, 慢了很多,不曉得是我配置有問題還是大家都這樣?

環境: macOS:10.13/Docker desktop:2.0.0.3

jenkins_android_dockerfile

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;

另外, jenkins是用java開發的, 其映象中應該也已有了基礎系統和jdk環境, 後續我們可以不用另外安裝;

同時, jenkins外掛和全域性工具配置選項中,可以直接安裝gradle/jdk/git等工具,因此只有 android sdk需要在建立映象時進行安裝;

Android sdk安裝方法

方法1: 線上下載安裝

官網現在沒有直接提供完整的sdk壓縮包,而是提供的sdkmanager工具,使用它來下載所需的其他元件;

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的;

相關文章