如昨天的文章,我们将Code推上远端仓库後Jenkins会自动获取并开始接下来的动作。接下来会是一段持续交付(CD)的自动化过程,Code通常会经过Build、Test、Deploy,这几道过程就像是一个水管,我们称作是Jenkins Pipeline。 这个Pipeline要如何定义呢? Jenkins有一个方便的文字档 Jenkinsfile可以方便的定义Pipeline的过程。
接下来我们实作一下,如何将Day 14与Day 13 自动在Jenkins上Build Image进该Jenkins Server内吧。
假如你的Jenkins是用Day 18的做法,也是用Docker来安装的,确保你有挂载/var/run/docker.sock
并给予足够的全限,详细看该篇文章:
sudo chmod 777 /var/run/docker.sock
docker run -v -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker jenkins/jenkins
/var/run/docker.sock
是docker的Unix socket,平常Docker daemon会监听他,对他送出请求就能操作Docker了。我们的目的就是希望在Jenkins内操作Docker。
本次目的同样是建立前端(Vue)、後端(Express)、资料库(Postgres),Github。
资料夹目录为
project
│ README.md
│ Jenkinsfile
│
└───html (前端 Vue)
│ │ Dockerfile
│ │ package.json
│
└───app (後端 nodejs)
│ Dockerfile
│ package.json
前端html、与後端app都有Dockerfile来Build Image,我们在根目录下建立Jenkinsfile。
Jenkinsfile大致撰写如下
pipeline {
agent any
stages {
stage('Build') {
steps {
retry(3){
sh "command"
}
timeout(time:3,unit:"MINUTES"){
sh "some command"
}
}
}
stage('Test') {
steps {
echo 'Testing..'
}
}
stage('Deploy') {
steps {
echo 'Deploying....'
}
}
}
post {
failure {
echo "Oh! No!"
}
success {
echo "Oh! Yeah that Success"
}
}
}
一个Jenkins任务为一个pipeline,agent是设定为哪个端点执行,我们之後有机会讲分散式Jenkins再详细讲。
stage
pipeline的过程steps
stage内的执行流程,一个步骤一个命令,成功後接续下一个stepsretry与timeout
重式次数与最长执行时间,超过就失败post
build完後要执行的动作,可以是寄一封信给你之类的。参考自 Jenkins入门
打开Jenkins > 新增作业 > pipeline。参考前一篇 GitHub hook trigger for GITScm polling
,pipeline选择pipeline scripe from SCM
,SCM Git
,输入你的git repository URL: http:\\<token>@github.com/....git
,选好你的branch,保存。
在专案根目录下撰写Jenkinsfile。
pipeline{
pipeline{
agent any
stages{
stage("Delete Old Container"){
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
echo "Delete the container"
sh "docker rm -f run_mynode run_myweb"
}
}
}
stage("Building") {
steps {
echo "Building App"
sh "cd ./app && docker build -t mynode:latest ."
sh "docker run -d -p 3000:3000 --name run_mynode --link my_postgres:my_postgres mynode:latest"
echo "Building FrontEnd"
sh "cd ./html && docker build -t myweb:latest ."
sh "docker run -d -p 8085:80 --name run_myweb --link run_mynode:run_mynode myweb:latest"
}
}
stage("Test"){
steps{
echo "Testing begin testing2"
sh "pwd"
}
}
stage("Deploy"){
steps{
echo "deploy begin"
}
}
}
post {
failure {
echo "No!! it fail"
}
success {
echo "Yes!! it work"
}
}
}
照上面字面上来说,会分别Building App与Front End,成功就会进入success、失败则failure。
第一次建立任务後要Build完成一次才能根github取得联系,因此先按下马上建置,立即建置。成功後如下:
第一次建置完成後就能开始试着用github push来自动化建置过程。可以先尝试将images删除,来试试看有没有正确build :
打开Jenkins 任务内的Github Hook Log,发现确实有在pull。
进入该服务器也能发现成功build起来了,这就是Jenkinsfile的自动化pipeline,之後慢慢讲解更多功能。
<<: 22.移转 Aras PLM大小事-流程签核动态指派(1)
其实原本最初规画想要做Index方式的纪录,然後多增加一些没写到的面向 不过,总是计画赶不上变化 ...
我朋友最近跟我阐述了一个惨痛的系统购买经验,我觉得很有价值,特以第一人称观点描述记录下来,本故事内容...
本文内容 将 ngIf 和 ngFor 彼此之间怎麽搭配使用的方法记录下来。 structural ...
Lucene.Net是一套C#开源全文索引库,其主要包含了: · Index : 提供索引的管理与词...
Html表单是用来与使用者互动的,例如在网路上的购物网站中的会员注册、选购商品按钮、基本资料填写或是...