iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 5
1

接下來的幾天,會介紹一些跟DevOps有關的images

依據jenkins官方文件
https://jenkins.io/doc/pipeline/tour/getting-started/
jenkins要裝java 8(JRE或JDK)
裝好後只要執行 java -jar jenkins.war --httpPort=8080 即可,相當簡單
不過個人很害怕要依賴JRE才能執行的軟體,
因為以前在Mac底下裝Eclipse IDE 等軟體有不好的經驗

好家在有docker版本,至少不用管各container裡的java版本
只是要多學怎麼把container裡的檔案備份出來

參考官網安裝文件:
https://github.com/jenkinsci/docker

$ docker pull jenkins/jenkins:latest # 下載image 

$ docker run -d --name MyJenkins -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:latest

--name : 幫container取名字,一定要取,否則以後操作container很麻煩
-v: 建立 KENKINS_HOME 環境變數,當作jenkins的工作目錄(在container裡)

剛docker run,開瀏覽器卡好久,睡一覺醒來才到Getting Started頁面

docker exec -it MyJenkins /bin/bash # 進到container裡
jenkins@fc344ed3d693:/$ cat /var/jenkins_home/secrets/initialAdminPassword 
2fe50103078641d78181d0b79072a49b # 這一組在host第1次連localhost:8080時要key的
$ cat /var/jenkins_home/secrets/initialAdminPassword
# 也可以在host對container下shell指令
$ docker exec MyJenkins cat /var/jenkins_home/secrets/initialAdminPassword 
afa0d430bd8f46fbba43f24adbf2acf9

https://ithelp.ithome.com.tw/upload/images/20181018/20107868uJIdbe2I04.png

  • 備份container裡的/var/jenkins_home
docker cp $ID:/var/jenkins_home
  • 設定logging
mkdir data
cat > data/log.properties <<EOF
handlers=java.util.logging.ConsoleHandler
jenkins.level=FINEST
java.util.logging.ConsoleHandler.level=FINEST
EOF
docker run --name myjenkins -p 8080:8080 -p 50000:50000 --env JAVA_OPTS="-Djava.util.logging.config.file=/var/jenkins_home/log.properties" -v `pwd`/data:/var/jenkins_home jenkins/jenkins:lts

============================我是分隔線===============================
不要一直拼指令,來用看看jenkins,充充篇幅~
我在udemy買了一些jenkins的課程,但一直都沒看,現在來邊玩邊看,會主要參考這個課程:
Master Jenkins CI For DevOps and Developers

剛好EarthFend大大有寫此課程筆記,寫得比較完整,大家也可以參考喔
https://medium.com/@samtsai15

這邊我在vm ubuntu裡跑的jenkins遇到問題,
所以是在host macOS底下跑docker的喔

這門課分幾個章節,如果看完覺得不錯,再去購買課程

第1章、Getting started with Jenkins

Getting Started
Customize Jenkins(選plugins,作為老牌軟體,聽說plugin是最完整的)
選select plugins to install,然後全選@@~
以後可以在Manage Jenkins/Manage Plugins變更

好像主流的開發語言都支援呢~好興奮
https://ithelp.ithome.com.tw/upload/images/20181018/20107868v1SKXLPpzw.png

開始安裝

https://ithelp.ithome.com.tw/upload/images/20181018/20107868lc5QKNEdjq.png

Manage Jenkins(就是設定、看log、改plugin的地方)

建個Job - create new jobs
Enter an item name
first-Job # 可以用-
General
Discard old builds # 可以限制記錄的build history保留數量
Disable this project # 暫時不要build,尤其專案還沒寫到可以跑的時候,或維護工作、重構時用
Source Code Management

Source Code Management

因為沒有checkout任何source code,所以暫時選none

以後設定好git、github plugin之後,會出現Git選項

  • Repositories/Repository URL就可以填https://github.com/xxxx/yyyy.git
  • Branches to build可填 */master (build這個branch)
  • 再來要設定SSH,非對稱金鑰會比短短的密碼還安全,以後會有一天專門補充SSH喔
    參考Github官網文件
    https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#platform-linux
    在local產生完ssh金鑰後,在GitHub的Setting/SSH and GPG keys/New SSH key
    填入你的public key,~/.ssh/id_rsa.pub
    然後Clone or download就有Use SSH跟Use HTTPS可以選
Use SSH: yourAccount@github.com:xxxx/yyyy-project.git
Use HTTPS: https://github.com/xxxx/yyyy-project.git

https://ithelp.ithome.com.tw/upload/images/20181018/201078683PSEoWQtdV.png

在terminal試看看

$ git clone yourAccount@github.com:xxxx/yyyy-project.git
$ git commit --allow-empty # 隨便commit一下,去觸發trigger jenkins
$ git push

回到Jenkins的Project,Git Polling Log看有沒有動靜~ 如果有,跟GitHub的作動就成功了~

Build Triggers

如果想手動build時用

  • Poll SCM/Schedule
    使用Cron排程語法
* * * * * 每個星星用TAB或空白鍵格開
分(0-59)、時(0-23)、日(1-31)、月(1-12)、星期幾(日=0、一=1、二=2、三=3、四=4、五=5、六=6)
*代表所有都有效
2-10代表值2~10
A,B,C列舉多個值
例如:
0	12,18,0	*	*	*	# 每天的12點、18點、半夜12點(環點 = =)

Build

定義build steps,有3個選項:
1、Execute Windows batch command:給Windows用的
2、Execute shell:給shell用的,例如:
echo "hello jenkins"
3、Invoke top-level Maven targets
Maven:自動化編譯工具, 要在Manage Jenkins/Global Tool Configuration設定Maven的路徑

Post-build Action,build後要作的事…

就像「博士後研究」?老闆口試先讓你過,後面還是付出一些
build後可以幹麻呢?寄個email「通知」呀、把編譯後的檔案打包、

存檔後就會建好「first-Job」的Project/Job了
1個Project -> n個Jobs (要新增Job用New Item),不用記,實際玩就對了~
在first-Job最後面有個執行的icon,按下去會進排程,Build History在左下角
藍球:代表「成功」,點進去->選Console Output->會看到「hello jenkins」

好有成就感,媽,我成功了!! 首先,我要感謝我的老師,還有支持我的家人…
冷…

第2章、Continuous Integration with Jenkins

Maven-based Jenkins job

  • 從GitHub看有無新的Source Code
  • 編譯
  • 跑測試
  • 打包編譯好的程式
    課程裡面是用github,
    1、首先要裝git
    2、再裝Github plugin(Manage Jenkins/Plugin Manager)

Maven係啥咪呢?

1、設定Path environment vairable = bin的目錄,讓OS知道maven執行檔在哪裡

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home
# 把bin目錄加到PATH
export PATH=/opt/apache-maven-3.5.4/bin:$PATH

或者

$ cd apache-maven-3.5.4/bin
$ pwd
/Users/user/Downloads/apache-maven-3.5.4/bin
$ vim ~/.bash_profile # 每個user的家目錄,都會有.bash_profile,環境變數統一寫在這邊
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.xxx/Contents/Home
export PATH=/opt/apache-maven-3.5.4/bin:$PATH
$ source ~/.bash_profile # 立即生效

2、大概就是下載bin檔,跑./mvn -v,然後會出現安裝結果

Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T20:33:14+02:00)
Maven home: /opt/apache-maven-3.5.4
Java version: 1.8.0_45, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.8.5", arch: "x86_64", family: "mac"

###回到Jenkins設定Java、Git、Maven
Global Tool Configuration,就是設定各bin目錄的位置

  • JDK
    Name:localJDK (隨便取)
    JAVA_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home (把echo $JAVA_HOME填到這裡)
  • Git
    Name:localGit
    Path to Git executable:git
  • Maven
    Name:localMaven
    取消自動安裝(我們剛剛已經裝好了)
    MAVEN HOME:/opt/apache-maven-3.5.4/bin (要看你裝在哪喔,應該是mvn -v那個)
    然後save~
    恐怖啦,不知道是否work

jenkins docker image install maven

因為我們是用image,本身裡面沒maven,怎麼辦哵?
可以到docker hub裡搜尋 jenkins+maven
例如:
https://hub.docker.com/search/?isAutomated=0&isOfficial=0&page=1&pullCount=0&q=jenkins+maven&starCount=0
然後參考他們的 Dockerfile

# 找FROM jenkins的會比較簡單
FROM jenkins/jenkins:lts
RUN apt-get update && apt-get install -y maven && \
    apt-get install -y build-essential
https://hub.docker.com/r/eggsy84/jenkins-maven-git-docker/~/dockerfile/

# 找FROM ubuntu的,可以學更多指令
FROM ubuntu:18.04
...
ADD ~/.bash_profile /root/.bashrc # 從host複製檔案到container,可以是URL
COPY some-file-on-host some-path-inside-container # 簡單的copy檔案  
# ADD跟COPY不知有何差異? 嗯,好問題,推這一篇文章
# http://blog.maxkit.com.tw/2017/02/dockerfile.html

WORKDIR /root # 工作目錄
CMD ["command" "parameters"] 
CMD ["bash"] # 要使用的shell
# CMD跟RUN的差異?
# CMD:當docker run,container建立的時候要跑什麼樣的命令。
# CMD、ENTRYPOINT,傻傻分不清楚:也是container建立時要執行的命令,和CMD混搭時CMD會被視為初始參數來使用。

https://hub.docker.com/r/stephenreed/jenkins-java8-maven-git/~/dockerfile/

接下來怎麼用Maven呢?

可到老師的專案
https://github.com/jleetutorial/maven-project
參考
pom.xml
其他的…推 kent's Blog 的 Maven教學
http://kentyeh.github.io/mavenStartup/index.html

備註

Jenkins預設會用jenkins帳號,這個帳號要有相關目錄的權限
例如:/Users/xxx/...

# 在帳號xxx設權限
$ chmod -r 0755 /Users/xxx/Downloads/...
# 設完後切到帳號jenkins,跑看看Downloads裡的mvn -v
$ sudo -iu jenkins 
$ ./mvn -v

=============================
先推一篇文章

點部落的[DevOps自動化-7] Jenkins 執行.NET專案的編譯與測試

(透過Jenkins 與MSBuild、MSTest)
https://dotblogs.com.tw/aken1215/2016/10/11/000455

因為小弟會的語言有C#、node.js,所以補充一下怎麼在Jenkins用Dot Net專案
###因為是ASP.NET所以是在Windows環境喔~Linux/Unix的朋友可以跳過了
接下來參考到的是udemy課程

Build+Deploy+Test with Jenkins 2.0

好像是免費的時候取得的,可能現在還是免費吧(課程時數較短,偏簡介)

如果不是因為鐵人賽,大概也沒機會看吧

第3章 Working with Jenkins 2.0 for .Net based application

課程裡的專案是Asp.Net+NUnit,如果以後有其他類型再回來補充
範例專案:
https://github.com/executeautomation/SeleniumNUnitParam
把專案fork到你自己的github,如果上面Jenkins跟GitHub的設定有做完的話
建個新Project
選「Freestyle project」,取名「DotNetFreestyle」
Source Code Management/Git/Repository URL填入 https://github.com/xxxx/SeleniumNUnitParam.git

要怎麼編譯ASP.NET的專案呢?

choco install microsoft-build-tools

裝好後會在C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe

  • 再來裝一下 MSBuild Plugin,再來到Global Tool Configuration就會看到MSBuild
    Name:MSBuildLocal(隨便填)
    Path to MSBuild: C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe (要改一下實際版本喔)
    Save!!

  • 然後DotNetFreestyle這個Project裡的Build Triggers/Build就會有
    Build a Visual Studio project or solution using MSBuild
    MSBuild Version: MSBuildLocal(隨便填)
    MSBuild Build File: SeleniumNUnitParam.sln (那個專案檔)
    按Save!!

不用Visual Studio要怎麼跑NuGet呢?(把相依套件都裝起來)

一樣靠chocolate

choco install nuget.commandline

-裝好後在Build/Add build step/Execute Windows batch command
其實就是靠下command來跑NuGet
由此可知 .Net Core 肯定簡單多了,因為有 dotnet cli 呀,而且可在 Unix/Linux 底下玩
Command:"C:\xxx\nuget.exe" restore SeleniumNUnitParam.sln # 看你的nuget.exe放哪囉
然後把這個指令拉到Build Triggers/Build之前(因為要先restore,再build麻)

  • 確認你有裝 .NET Framework

  • 最後,點「Build Now」,再到 Build 裡面看 Console Output

跑NUnit測試

聰明的朋友現在應該能舉一反三了,沒錯,一樣是用command跑

choco install nunit.install # 這個下載數最高

-裝好後在Build/Add build step/Execute Windows batch command
Command:"C:\xxx\nunit3-console.exe" ...略/bin/Debug/SeleniumNUnitParam.dll
那測試的順序當然放在Build之後啦(才會有dll檔)

Pipeline

先推一篇文章
點部落的[DevOps自動化-6] Jenkins持續整合、發布
https://dotblogs.com.tw/aken1215/2016/10/11/000455

pipeline能幹麻呢?例如 Build -> Test -> Release -> QA+Deploy到測試環境 -> Deploy到Production
就像水管一樣,水從高處往低處流

嗯,如果可以連程式碼都自動產生就好了…

建一個新Project - 選「Pipeline」,取名「DotNetPipeline」
可用Pipeline Syntax/Snippet Generator產生snippet
https://ithelp.ithome.com.tw/upload/images/20181018/201078686eQqeeft9A.png

node # 把整個script包起來
{
    stage 'Checkout code' # 執行的時候會有視覺化的方塊
        git 'https://github.com/xxx/yyy.git'
    stage 'Restore Nuget'
        bat 'C:\xxx\nuget.exe restore SeleniumNUnitParam.sln'
        # 用單引號包就好了
        echo 'hello~ Restore Nuget'
    stage 'Build'
        bat "\"${tool 'MSBuild'}\" SeleniumNUnitParam.sln
            /p:Configuration=Release /p:Platform=\"Any CPU\"
            /p:ProductVersion=1.0.0.${env.BUILD_NUMBER}"
    stage 'Archive' # 打包
        archive 'SeleniumNUnitParam/bin/Release/**'
}

上一篇
day04_docker03_Docker Swarm
下一篇
day06_docker05_.Net Core
系列文
在地端建置Angular+ASP.NET Core的DevOps環境31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言