CI/CD1jenkins,actions
Posted 码农编程录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CI/CD1jenkins,actions相关的知识,希望对你有一定的参考价值。
文章目录
- 1.jenkins:构建/测试/部署就是CICD工具即jenkins,但jenkins需要个人提供一台运行jenkins的机器
- 2.GitLab与Jenkins集成:Jenkins镜像像nginx一样
- 3.github的actions:替代了travis,完成github上的cicd的操作
1.jenkins:构建/测试/部署就是CICD工具即jenkins,但jenkins需要个人提供一台运行jenkins的机器
官网https://www.jenkins.io/下载jenkins,可选择适合你自己系统的版本,也可选择不依赖于系统的docker(前提本机安装了docker)或war包(本机安装了java),如下开启服务端。
执行如上命令出现如下密码,复制这串密码,浏览器打开http://localhost:8080,粘贴到管理员密码里。点击安装推荐插件,创建管理员用户yu,密码123,到这里jenkins已经安装完成了(装在win上),主要用来配合git服务器。
在Manage Jenkins
中选择Global Tool Configuration添加git路径如下。
Create a job
,选择Freestyle project,命名为newjob,点击配置。
如上如果选择execute shell会出现系统找不到指定文件
报错。liunx 下使用execute shell,并加上#!/bin/bash,cat ./README.md。这里的脚本可以做的事很多,比如构建项目,做代码测试等。如下点击控制台输出,可查看fetch拉取github代码并执行cat ./README.md脚本。
jenkins轮询github,有更新就pull下来,然后执行
输入的构建脚本。
2.GitLab与Jenkins集成:Jenkins镜像像nginx一样
2.1 Jenkins-docker配置:运行在8080端口上,机器只要安装docker就能装载image,运行容器
在指定服务器上安装docker,使用docker命令进行下载jenkins-docker版本如下:
docker pull jenkins/jenkins:2.54
运行jenkins-docker images,进入对应container,并相应安装vim、docker、gcc/g++、make、cppcheck等调试、编译环境,运行jenkins-docker命令如下:-name
指定image名字。-p
内部container和外部对应关系。-v
外部地址和container内部地址对应关系,在container内部修改jenkins的话,外部也会更新。/etc/localtime
时间同步。
docker run --privileged=true -d --name jenkins -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v /home/ju/jenkins_home:/var/jenkins_home/ -v /etc/localtime:/etc/localtime jenkins/jenkins:v4
docker exec -u 0 -it jenkins bash # 进入docker container内部
docker save –o jenkins_v4.tar jenkins/jenkins:v4 # 保存docker images为tar包命令
docker load -input jenkins_v4.tar # 加载tar包为docker images命令
2.2 Jenkins与GitLab配置:docker ps查看正在运行,浏览器访问http://10…:8080/
GitLab与Jenkins Access Token配置
GitLab配置Access Token,用于jenkins连接GitLab获取GitLab API接口,GitLab页面->用户->Settings->Access Tokens。生成GitLab个人准入秘钥,设置Name,Expires at默认不填永久有效,Scopes全部勾选后,点击Create personal access token,生成后,页面上会提示"Your new personal access token has been created"。
Jenkins配置界面查找GitLab,添加connect name与Gitlab host URL:
添加Credentials,点击Add->jenkins,进行添加对应的秘钥,Kind选择GitLab API Token,API Token添加GitLab personal api token,ID添加为jenkins_gitlab后,点击Add。选择Credentials为GitLab API token,点击Test Connection,验证jenkins与GitLab是否建立连接,显示为”Success”。
新建jenkins job和配置job
在jenkins主界面点击New Item,可新建job或者复制已有job,此处直接复制已有job,拷贝后的job不要运行build,避免回填错误数据到GitLab。
项目名为example的Jenkins pipeline script同下面导入的,可自行修改。
选择对应job后点击Configure进行job配置,在job配置界面查到Build Triggers,进行配置job触发条件,勾选“Build when a change is pushed to GitLab. GitLab webhook URL: http://10.75.92.229:8080/project/sw61_bsp_build”,勾选状态如下图。
Jenkins pipeline script配置
1) 环境模块导入, groovy语言
import hudson.*
2) 清空工作空间
node("")
stage("clear workspace")
cleanWs()
3) 下载源码
node("")
stage("download code")
echo "download code"
if (env.gitlabSourceBranch == null) //当gitlab过来触发的job的话,环境变量上就会有gitlabSourceBranch字串
git branch: "sw61", credentialsId: '18f53bc3-dc50-4178-acde-d628264ee453', url: 'https://gitlab-dbd...com/bsp_diag/prj_bsp.git' // null说明不是gitlab触发
else //gitlab做了push或merge操作时触发,credentialsId就是Access Tokens
git branch: env.gitlabSourceBranch, credentialsId: '18f53bc3-dc50-4178-acde-d628264ee453', url: env.gitlabSourceRepoHttpUrl
4) 源码cppcheck扫描
try
node("")
stage("cppcheck")
echo "cppcheck starting"
pwd()
sh "/home/cppcheck-1.75/cppcheck 4 --enable=all --inconclusive --xml --xml-version=2 "+env.WORKSPACE+" 2> cppcheck.xml"
publishCppcheck ignoreBlankFiles: true, pattern: 'cppcheck.xml'
def cppcheck_file_obj = new File(env.WORKSPACE+"/cppcheck.xml")
if (cppcheck_file_obj.isFile())
echo "cppcheck.xml file exist"
result = sh returnStdout: true ,script: "cat "+env.WORKSPACE+"/cppcheck.xml"
if (result == "")
echo "analyse cppcheck.xml failure,cppcheck.xml is empty"
currentBuild.result="FAILURE"
else
echo "analyse cppcheck.xml"
cppcheck_result = sh returnStdout: true ,script: "cat "+env.WORKSPACE+"/cppcheck.xml | grep 'cppcheck version'"
if(cppcheck_result == "")
echo "analyse cppcheck.xml failure,cppcheck.xml format error"
currentBuild.result="FAILURE"
else
final_result = sh returnStdout: true ,script: '''cat '''+env.WORKSPACE+'''/cppcheck.xml | grep severity=\\\\"error\\\\"'''
if(final_result == "")
echo "analyse cppcheck.xml pass"
else
echo "analyse cppcheck.xml failure,cppcheck.xml has error"
currentBuild.result="FAILURE"
else
echo "cppcheck.xml file not exist"
currentBuild.result="FAILURE"
catch(e)
echo "cppcheck failure"
currentBuild.result="FAILURE"
5) 源码编译
try
node("")
stage("compile code")
echo "compile code"
sh "make" //在docker里编译
catch(e)
echo "compile code failure"
currentBuild.result="FAILURE"
6) 验证扫描与编译结果,成功后归档相关文件
node("")
stage("archive")
echo "archive"
if(currentBuild.result == 'FAILURE')
echo "Something unexpected happened. Please inspect Jenkins logs. Skip archive."
else
sh '''
mkdir build
cp cppcheck.xml build/
cp *.ko build/
tar -zcf archive.tar.gz build/
'''
archiveArtifacts artifacts: '*.tar.gz', followSymlinks: false
7) 根据扫描和编译结果,回填数据到GitLab
stage("commit gitlab")
echo "commit gitlab"
if(currentBuild.result == 'FAILURE')
updateGitlabCommitStatus(name: 'sw61_bsp_build', state: 'failed')
else
updateGitlabCommitStatus(name: 'sw61_bsp_build', state: 'success')
Jenkins&GitLab集成环境验证
GitLab推送修改至仓库新分支,验证push event可触发jenkins job,jenkins回填数据至GitLab。
3.github的actions:替代了travis,完成github上的cicd的操作
如下点击Actions按钮后选择自定义流程。
如上点击后产生如下main.yml文件。
如上点击提交代码后,Actions其实正在运行了。
如下是.yml文件怎么写?三类:name,on(触发时机),jobs(具体任务)。
name:流程命名为,会显示在图像化界面上。
on:[push] push代码时会触发。如下是src下文件发生改动的主分支下提交的代码才会触发当前的流程。
如下是每15分钟执行一次当前流程,有schedule(固定时间触发)就不能写push事件了。
具体触发的任务在jobs下,job1是命名,job2执行前必须是要job1执行完成。
runs-on是枚举类型,必须写如下8种。
steps:- (数组):git clone xxx 这样麻烦,如下uses中actions是github上有一官方用户叫actions,有一个仓库叫checkout,这仓库里面流程就是把代码下载下来【uses参数后面写另一个代码仓库,run参数后面写shell指令】。actions/setup-node@v1配置ubuntu-latest会安装好nodejs,这样下面npm就可用了。
3.1 uses:后面可接其他仓库,还可接docker: //alpine: 3.8,注意只是在ubuntu下docker run一镜像,并不是下面的run在容器里运行
timeout-minutes默认30分钟超时时间,指定超时时间如1分钟,1分钟内没有执行完会强制结束。如下指定3个版本的nodejs分别去测试。
如下是自己写的main.yml文件并执行。
3.2 container:指定node8这个容器container下,显示8.x,不是ubuntu的node10.x版本
3.3 services:可指定基于nginx镜像的服务,点击Actions查看流程
如下nginx容器在当前ubuntu-latest环境下启动起来了。
以上是关于CI/CD1jenkins,actions的主要内容,如果未能解决你的问题,请参考以下文章
android listview上下滑动时为啥不触发点击事件