jenkins学习与实战

软件开发生命周期

软件开发生命周期又叫做SDLC(Software Development Life Cycle),它是集合了需求分析、设计、开发、测试和部署等过程的集合。

软件生命周期又称为软件生存周期或系统开发生命周期,是软件的产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段,这种按时间分程的思想方法是软件工程中的一种思想原则,即按部就班、逐步推进,每个阶段都要有定义、工作、审查、形成文档以供交流或备查,以提高软件的质量。但随着新的面向对象的设计方法和技术的成熟,软件生命周期设计方法的指导意义正在逐步减少。

生命周期的每一个周期都有确定的任务,并产生一定规格的文档(资料),提交给下一个周期作为继续工作的依据。按照软件的生命周期,软件的开发不再只单单强调“编码”,而是概括了软件开发的全过程。软件工程要求每一周期工作的开始只能必须是建立在前一个周期结果“正确”前提上的延续;因此,每一周期都是按“活动-结果-审核-再活动-直至结果正确”循环往复进展的。

大致分为如下各个阶段:

  • 需求分析

    这是生命周期的第一阶段,根据项目需求,团队执行一个可行性计划的分析。项目需求可能是公司内部或者客户提出的。这阶段主要是对信息的收集,也有可能是对现有项目的改善和重新做一个新的项目。还要分析项目的预算多长,可以从哪方面受益及布局,这也是项目创建的目标。

  • 设计

    第二阶段就是设计阶段,系统架构和满意状态(就是要做成什么样子,有什么功能),和创建一个项目计划。计划可以使用图表,布局设计或者文者的方式呈现。

  • 实现

    第三阶段就是实现阶段,项目经理创建和分配工作给开者,开发者根据任务和在设计阶段定义的目标进行开发代码。依据项目的大小和复杂程度,可以需要数月或更长时间才能完成。

  • 测试

    测试人员进行代码测试 ,包括功能测试、代码测试、压力测试等。 在软件设计完成后要经过严密的测试,以发现软件在整个设计过程中存在的问题并加以纠正。

  • 运行及维护

    最后进阶段就是对产品不断的进化改进和维护阶段,根据用户的使用情况,可能需要对某功能进行修改,bug修复,功能增加等。

服务器规划

所有服务器都需要安装docker

主机名 主机IP 备注
jenkins-153 192.168.198.153 安装jenkins主节点
agent-154 192.168.198.154 安装jenkins工作节点
gitlab-152 192.168.198.152 安装gitlab
harbor-155 192.168.198.155 需提前安装harbor

jenkins安装

jenkins官网

https://www.jenkins.io/zh/

中文文档

https://www.jenkins.io/zh/doc/

window系统(不推荐)

自动部署

下载官网提供的msi文件即可

https://www.jenkins.io/download/thank-you-downloading-windows-installer-stable/

手动部署一
java -jar jenkins.war
手动部署二
1.部署tomcat92.在官网下载jenkins.war
http://mirrors.jenkins.io/war-stable/2.235.5/jenkins.war3.将war包放入apache-tomcat-9.0.34\webapps\目录中4.启动tomcat
cmd
cd apache-tomcat-9.0.34\bin\执行 startup.bat 启动tomcat5.访问jenkins
http://localhost:8080/jenkins

linux系统

直接安装jenkins(不推荐)
1.安装JDK8
yum install java-1.8.0-openjdk* -y2.yum方式安装
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.reporpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.keyyum install jenkins3.或者采用rpm方式安装:在清华大学镜像源下载jenkins的rpm文件:jenkins-2.253-1.1.noarch.rpm
https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/上传centos服务器进行安装:
rpm -ivh jenkins-2.190.3-1.1.noarch.rpm

配置jenkins

1.修改Jenkins配置
vi /etc/syscofig/jenkins修改内容如下:
JENKINS_USER="root"
JENKINS_PORT="8888"2.启动Jenkins服务
systemctl start jenkins
systemctl enable jenkins3.打开浏览器访问
http://192.168.198.153:8888

获取密码

获取并输入admin账户密码
cat /var/lib/jenkins/secrets/initialAdminPassword
容器化安装(推荐)
官方版

基础镜像最新版

docker pull jenkins/jenkins:2.347docker pull jenkins/jenkins:2.347-alpine

运行镜像

给映射目录授权
mkdir -p /data/jenkins && chown -R 1000:1000 /data/jenkins运行容器
docker run -itd --name jenkins -p 8080:8080 -p 50000:50000 -u root -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai --restart=always -v /data/jenkins/:/var/jenkins_home/ jenkins/jenkins:2.347-alpine查看容器启动日志并找到jenkins初始化密码
docker logs -f jenkins

浏览器测试

http://192.168.198.153:8080

中文版

中文社区

官网地址:
https://bintray.com/jenkins-zh/generic/jenkinsdocker官网地址:
https://hub.docker.com/r/jenkinszh/jenkins-zhgithub官网地址:
https://github.com/jenkins-zh/jenkins-formulas

基础镜像

最新版本:790MB
docker pull jenkinszh/jenkins-zh:2.267推荐版本:618MB
docker pull jenkinszh/jenkins-zh:2.221

安装jenkins

给映射目录授权
mkdir -p /data/jenkins && chown -R 1000:1000 /data/jenkins启动
docker run -itd --name jenkins -p 8080:8080 -p 50000:50000 -u root -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai --restart=always -v /data/jenkins:/var/jenkins_home jenkinszh/jenkins-zh:2.267查看容器启动日志并找到jenkins初始化密码
docker logs -f jenkins

浏览器测试

http://192.168.198.153:8080

制作jenkins镜像

由于jenkins默认插件下载地址都是国外,所以国内下载插件很困难,所以就需要手动制作jenkins镜像修改插件下载地址为中文社区的地址

制作步骤

制作步骤:
1.编写Dockerfile文件。
2.从下一步骤开始。所有文件都在jenkins中文社区寻找。但是不能在windows系统创建。因为系统文
件格式不同。jenkins启动时会报错。
3.创建init.groovy文件。
4.创建hudson.model.UpdateCenter.xml
5.创建mirror-adapter.crt
6.制作镜像
7.启动容器,试运行镜像
8.jenkins工作台操作,检验插件下载速度
9.停止容器
10.删除容器
备份镜像

基础镜像

docker pull jenkins/jenkins:2.221-alpine

配置文件准备

下载文件https://github.com/jenkins-zh/jenkins-formulas/tree/2.221将init.groovy、hudson.model.UpdateCenter.xml、mirror-adapter.crt复制到/data目录下

Dockerfile

在基础镜像中增加时区修正。安装常用软件。更新jenkins插件为中文社区地址

FROM jenkins/jenkins:2.221-alpine
#自定义jenkins镜像
# 作者信息
MAINTAINER docker jenkins
# 修改源
USER root
RUN echo "https://mirrors.aliyun.com/alpine/v3.9/main/" > /etc/apk/repositories && \
echo "https://mirrors.aliyun.com/alpine/v3.9/community/" >> /etc/apk/repositories
# 安装需要的软件,解决时区问题
RUN apk --update add curl bash tzdata && \rm -rf /var/cache/apk/*
#修改镜像为东八区时间
ENV TZ Asia/ShanghaiENV JENKINS_UC https://updates.jenkins-zh.cn
ENV JENKINS_UC_DOWNLOAD https://mirrors.tuna.tsinghua.edu.cn/jenkinsENV JENKINS_OPTS="-Dhudson.model.UpdateCenter.updateCenterUrl=https://updates.jenkins-zh.cn/update-center.json"
ENV JENKINS_OPTS="-Djenkins.install.runSetupWizard=false"COPY init.groovy /usr/share/jenkins/ref/init.groovy.d/init.groovy
COPY hudson.model.UpdateCenter.xml /usr/share/jenkins/ref/hudson.model.UpdateCenter.xml
COPY mirror-adapter.crt /usr/share/jenkins/ref/mirror-adapter.crt

制作镜像

docker build --rm -t edu/jenkins:2.221-alpine .

启动容器

创建映射目录
mkdir -p /data/jenkins && chown -R 1000:1000 /data/jenkins运行容器
docker run -itd --name jenkins -p 8080:8080 -p 50000:50000 -u root -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai --restart=always -v /data/jenkins/:/var/jenkins_home/ edu/jenkins:2.221-alpine查看容器启动日志并找到jenkins初始化密码
docker logs -f jenkins

测试镜像并安装插件

http://192.168.198.153:8080

更换插件下载地址

如果插件无法安装就更新插件下载地址

清华大学:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json阿里云:https://mirrors.aliyun.com/jenkins/updates/update-center.json华为云:https://mirrors.huaweicloud.com/jenkins/updates/update-center.json更换步骤:
1.Manage Jenkins–>Manage Plugins->选择Advanced
2.Update Site处修改地址
3.点击submit
4.点击check now

删除镜像

停止容器
docker stop jenkins删除容器
docker rm jenkins备份镜像
docker save edu/jenkins:2.204.5-alpine -o edu.jenkins:2.204.5-alpine.tar或者将镜像上传harbor私服

jenkins插件离线安装

清华大学镜像下载站:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/

jenkins节点安装

jenkins分布式

master节点负责调度任务,agent节点负责执行任务。

配置固定节点

jenkins工作台->系统管理->节点管理->新增从节点

agent节点安装软件

进入opt目录
cd /opt
JDK8
下载地址:
https://download.oracle.com/otn/java/jdk/8u331-b09/165374ff4ea84ef0bbd821706e29b123/jdk-8u331-linux-x64.tar.gz?AuthParam=1652254982_becfd6af2ef4d07b772255e25aeabcf1tar -zxf jdk-8u331-linux-x64.tar.gzmv jdk1.8.0_331 jdk1.8
maven3.6
下载地址:
https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gztar -zxf apache-maven-3.6.3-bin.tar.gzmv apache-maven-3.6.3 maven
git2.28
1.安装依赖环境:
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker2.删除yum方式安装的git:
添加依赖时自动yum安装了git1.8版本。需要先移除git1.8版本。
yum -y remove git官网下载速度非常慢。国内加速地址大部分为windows版本。登录
https://github.com/git/git/releases查看git的最新版。不要下载带有-rc的,因为它代表了一个候选发布版本。
https://www.kernel.org/pub/software/scm/git/git-2.28.0.tar.gztar -zxvf git-2.28.0.tar.gz
cd git-2.28.0配置git安装路径
./configure --prefix=/opt/git/编译并且安装
make && make install

统一配置

vi /etc/profileexport PATH
export JAVA_HOME=/opt/jdk1.8
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export MAVEN_HOME=/opt/maven
export PATH=$MAVEN_HOME/bin:$PATH
export PATH=$PATH:/opt/git/binsource /etc/profile

配置软连接

master节点ssh连接agent节点时需要/usr/bin/有java命令。配置java的软连接、同理配置maven、git的软连接。如果软件是yum安装的,则需要检查/usr/bin中是否有相关命令。如果没有,也需要做软连接。
ln -s /opt/jdk1.8/bin/java /usr/bin/
ln -s /opt/maven/bin/mvn /usr/bin/
ln -s /opt/git/bin/git /usr/bin

java方式连接agent

下载jar包

mkdir -p /data/workspaces
cd /data/workspaces在google浏览器中复制jar地址
wget http://192.168.198.153:8080/jnlpJars/agent.jar如果没有安装wget命令,选择yum方式安装:
yum install -y wget

启动连接

复制google浏览器中的启动命令:
java -jar agent.jar -jnlpUrl http://192.168.198.153:8080/computer/agent-154/slave-agent.jnlp -secret db7f1e3fc92b1d57af545cae7d836c110d3994f73b618abd94ab0d63c29cfe20 -workDir "/data/workspaces"

自由风格项目测试

配置好master和agent节点,创建一个自由风格项目,测试agent节点各种环境是否正常。
java -version
mvn -v
git version
docker version

jar包后台启动

vi jenkinsagentstart.sh#!/bin/bash
nohup java -jar agent.jar -jnlpUrl http://192.168.198.153:8080/computer/agent-154/slave-agent.jnlp -secret db7f1e3fc92b1d57af545cae7d836c110d3994f73b618abd94ab0d63c29cfe20 -workDir "/data/workspaces" &chmod +X jenkinsagentstart.sh./jenkinsagentstart.sh查看nohup启动日志:
tail -f nohup.out

SSH方式连接agent

免密配置

master节点要免密登录agent节点

生成秘钥
ssh-keygen -t rsa按回车3次复制公钥
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.198.154免密登录测试
ssh 192.168.198.154

配置凭据

jenkins工作台->系统管理->凭据管理(manager credentials)类型:SSH Username with private key选择类型
SSH Username with private key输入描述
agent-154-sshUsername
rootPassphrase
123456复制私钥到Private Key
cat /root/.ssh/id_rsa

添加agent节点

jenkins工作台->系统管理->节点管理->选择agent节点->新建从节点Number of executors->5
远程工作目录->/data/workspaces
标签->agent-154
启动方式->Launch agentsvia SSH
主机->192.168.198.154
Credentials->root (agent-154-ssh)
Host Key Verification Strategy->Non verifying Verification Strategy
可用性->尽量保持代理在线

gitlab安装

直接安装

安装相关依赖

yum -y install policycoreutils openssh-server openssh-clients postfix

启动ssh服务&设置为开机启动

systemctl enable sshd && sudo systemctl start sshd

设置postfifix开机自启,并启动,postfifix支持gitlab发信功能

systemctl enable postfix && systemctl start postfix

下载gitlab包,并且安装

清华大学地址:
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/在线下载安装包:
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/gitlab-ce-12.7.6-ce.0.el6.x86_64.rpm --no-check-certificate安装:
rpm -i gitlab-ce-12.7.6-ce.0.el6.x86_64.rpm

修改gitlab配置

修改gitlab访问地址和端口,默认为80,我们不进行修改。
external_url 'http://192.168.66.152'

重载配置及启动gitlab

gitlab-ctl reconfigure
gitlab-ctl restart

容器化安装

官网地址

https://hub.docker.com/r/gitlab/gitlab-ce

基础镜像

英文版
docker pull gitlab/gitlab-ce:12.7.6-ce.0中文版
docker pull twang2218/gitlab-ce-zh:11.1.4最新版:不是很稳定的版本
docker pull gitlab/gitlab-ce:13.3.2-ce.0

运行容器

运行镜像:运行时间比较长,大约需要3-10分钟。可以查看日志情况。
docker run -itd --name gitlab -p 443:443 -p 80:80 -p 222:22 --restart always -m 4GB -v /data/gitlab/config:/etc/gitlab -v /data/gitlab/logs:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab -e TZ=Asia/Shanghai gitlab/gitlab-ce:12.7.6-ce.0

配置gitlabe

vim /data/gitlab/config/gitlab.rb配置项目访问地址:
external_url 'http://192.168.198.152'配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '192.168.198.152'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 222重启gitlab
docker restart gitlab

登录gitlab

http://192.168.198.152

登录gitlab:用户名默认为root。第一次登录需要设置密码。将密码设置为12345678

常用命令练习

进入容器,练习常用gitlab命令:
docker exec -it gitlab /bin/bash
gitlab-ctl reconfigure
gitlab-ctl restart
gitlab-ctl status

创建组

组分三类:
Private:私有的
Internal:内部的
Public:公共的

创建项目

项目分类:
根据组的分类进行分类。
创建项目注意事项:
不需要创建README,否则本地项目无法上传到gitlab服务器上。

创建用户

1.创建用户
用户权限分两种:
Regular:普通权限用户
Admin:具有管理员权限的用户2.给用户分配密码

将用户加入群组

给群组中的用户分配权限分五种:
Guest:可以创建issue、发表评论、不能读写版本库。
Reporter:可以克隆代码,不能提交、QA、PM可以赋予这个权限。
Developer:可以克隆代码、开发、提交、push,普通开发可以赋予这个权限。
Maintainer:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心开发人员可以赋予这个权限。
Owner:可以设置项目访问权限、-Visibility Level、删除项目、迁移项目、管理组成员、开发组组长可以赋予这个权限。

上传项目

使用idea开发工具演示
1.创建本地仓库
VCS->Enable Version Control Integration...2.建立缓冲区
项目右键->git->Add3.将代码提交到本地仓库
项目右键->git->Commit Directory4.设置远程gitlab仓库地址
项目右键->git->Repository->Remote5.将本地代码推送到远程gitlab仓库
项目右键->git->Repository->push

pipeline项目

Pipeline简介

概念

Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。

使用Pipeline好处

来自翻译自官方文档:

代码:Pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流程。

持久:无论是计划内的还是计划外的服务器重启,Pipeline都是可恢复的。

可停止:Pipeline可接收交互式输入,以确定是否继续执行Pipeline。

多功能:Pipeline支持现实世界中复杂的持续交付要求。它支持fork/join、循环执行,并行执行任务的功能。

可扩展:Pipeline插件支持其DSL的自定义扩展 ,以及与其他插件集成的多个选项。

创建 Jenkins Pipeline任务

  • Pipeline 脚本是由 Groovy 语言实现的,但是我们没必要单独去学习 Groovy
  • Pipeline 支持两种语法:Declarative(声明式)和 Scripted Pipeline(脚本式)语法
  • Pipeline 也有两种创建方法:可以直接在 Jenkins 的 Web UI 界面中输入脚本;也可以通过创建一个 Jenkinsfifile 脚本文件放入项目源码库中(一般我们都推荐在 Jenkins 中直接从源代码控制(SCM)中直接载入 Jenkinsfifile Pipeline 这种方法)。

安装git插件

jenkins工作台->系统管理->节点管理->可选插件->git

安装Pipeline插件

安装插件后,创建任务的时候多了“流水线”类型 。初始化jenkins环境时已经默认安装了pipeline插件。

jenkins工作台->系统管理->节点管理->可选插件->pipeline

Pipeline语法快速入门

Scripted脚本式-Pipeline

新建任务
pipeline-test02选择模板
scripted pipeline片段生成器中选择echonode ('agent-154') {stage('Preparation') { // for display purposesecho 'hello pipeline'}
}

Declarative声明式-Pipeline

新建任务
pipeline-test02选择模板
Hello world

agent配置

agent选项:
any : 在任何可用的机器上执行pipeline
none : 当在pipeline顶层使用none时,每个stage需要指定相应的agent

流水线语法

  • stages:代表整个流水线的所有执行阶段。通常stages只有1个,里面包含多个stage
  • stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。
  • steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内容。
任务->流水线->点击链接 "流水线语法"选择 Declarative Directive GeneratorDirectives->Sample Directive->选择agent:Agent选项
Agent选择 Label:Run on an agent matching a labelLabel:输入agent节点标签内容。"agent-154"点击Generator Declarative Directive按钮,复制生成内容替换任务的agent any部分
agent {label 'agent-154'
}

测试Declarative任务

点击 立即构建

升级案例

pipeline {agent {label 'agent-154'}stages {stage('检测环境') {steps {sh label: '', script: '''java -versionmvn -vgit versiondocker -v'''}}stage('拉取代码') {steps {echo '拉取代码'}}stage('编译构建') {steps {echo '编译构建'}}stage('项目部署') {steps {echo '项目部署'}}}
}

Declarative pipeline和Scripted pipeline的比较

共同点

两者都是pipeline代码的持久实现,都能够使用pipeline内置的插件或者插件提供的steps,两者都可以利用共享库扩展。

区别

两者不同之处在于语法和灵活性。Declarative pipeline对用户来说,语法更严格,有固定的组织结构,更容易生成代码段,使其成为用户更理想的选择。但是Scripted pipeline更加灵活,因为Groovy本身只能对结构和语法进行限制,对于更复杂的pipeline来说,用户可以根据自己的业务进行灵活的实现和扩展。

集成gitlab

http方式

gitlabe->clone->选择http方式
http://192.168.198.152/edu/jenkinsdemo.git

配置凭据

jenkins工作台->系统管理->凭据管理(manager credentials)
类型:Username with password

修改脚本

1.片段生成器中选择check out
2.修改pipeline-test03任务中的拉取代码阶段:
stage('拉取代码') {steps {echo 'gitlab拉取代码'checkout([$class: 'GitSCM', branches: [[name: '*/master']],doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [],userRemoteConfigs: [[credentialsId: 'b26bd84e-e0cb-4b90-8469-1c2a46213466',url: 'http://192.168.198.152/edu/jenkinsdemo.git']]])}
}

测试任务

点击立即构建

ssh方式

免密配置

gitlabe-152节点免密登录配置。gitlab服务器保存公钥信息。方便访问gitlab-152服务器。

1.生成秘钥
ssh-keygen -t rsa回车3次2.查看公钥信息
cat /root/.ssh/id_rsa.pub3.gitlabe服务器配置:
当前用户->setting->SSH Key->点击 add key按钮

配置凭据

1.jenkins工作台->凭据->系统->全局凭据 (unrestricted)->添加凭据2.类型:SSH Username with private key3.描述:gitlab-154-SSH4.Username5.Passphrase6.Private Key
在gitlab服务器上查看私钥信息
cat /root/.ssh/id_rsa

修改脚本

1.片段生成器中选择check out
修改pipeline-test03任务中的拉取代码阶段:stage('拉取代码') {steps {echo 'gitlab拉取代码'checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '7a17fa00-4158-4304-b4ea-721099383971', url: 'ssh://git@192.168.198.152:222/edu/jenkinsdemo1.git']]])}
}

测试任务

点击立即构建

Pipeline Script from SCM

刚才我们都是直接在Jenkins的UI界面编写Pipeline代码,这样不方便脚本维护,建议把Pipeline脚本放在项目中(一起进行版本控制)

agent节点配置maven

为pipeline项目增加maven打包jenkinsdemo项目配置信息

maven配置

/opt/maven/conf/settings.xml文件配置

1.配置仓库地址

创建本地仓库:
mkdir -p /data/maven/repository设置本地仓库目录
vim /opt/maven/conf/settings.xml<localRepository>/data/maven/repository</localRepository>

2.阿里云镜像仓库地址

<mirror><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

3.maven工程JDK8编译配置

<profile><id>jdk-1.8</id><activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion></properties>
</profile>

Jenkinsfile文件

在jenkinsdemo项目根目录创建/Jenkinsfile文件。Jenkinsfile文件内容如下:

pipeline {agent {label 'agent-154'}stages {stage('检测环境') {steps {sh label: '', script: '''java -versionmvn -vgit versiondocker -v'''}}stage('拉取代码') {steps {echo 'gitlab拉取代码'checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '7a17fa00-4158-4304-b4ea-721099383971', url: 'ssh://git@192.168.198.152:222/edu/jenkinsdemo1.git']]])}}stage('编译构建') {steps {echo 'mvn 编译构建'sh label: '', script: 'mvn clean package'}}stage('项目部署') {steps {echo 'java项目部署'sh label: '', script: 'java -jar target/jenkinsdemo.jar'}}}
}

提交项目到git

右击项目->git>commit->commit and push

修改pipeline项目

配置 SCM相关配置

测试pipeline项目

查看控制台输出信息

dockerfile-maven-plugin

简介

越来越多的项目开始了docker容器化部署的进化,在容器化之前我们部署一个项目,可能由源代码产出一个jar或者war即可直接发布了,启动之后是一个java进程;容器化之后,由源代码产出的是一个docker镜像,而启动的是一个容器。多了这么多步骤是为了容器化之后的运维便利性,从现在来看,容器化是势不可挡的趋势。为了实现的我们CI/CD的终极目标:一键发布,这里介绍一个mavenplugin(输入源代码,输出docker镜像)。

作为一个Docker项目,都绕不过Dockerfifile文件构建、打标签和发布等操作。如果能够将对Dockerfifile文件的这些操作包含进Maven的生命周期管理中,将极大简化Docker项目的构建发布过程。DockerfifileMaven是Spotify公司提供的一款Maven插件(还包含一个Maven扩展),用以辅助Docker项目(借助于Maven管理)进行Dockerfifile文件构建、标签和发布。

在实施CI/CD的过程中,实现一键发布用的最多的工具就是Jenkins了,在Jenkins上通过配置将每一个步骤串联起来,现在出现了pipeline让这个过程更简单了,一般的持续集成的流程是:

  1. 从代码仓库下载代码(git或者svn)

  2. 通过工具(maven或者gradle)编译出可执行程序包(jar或者war)

  3. 使用dockerfifile配置build出docker镜像

  4. 将docker镜像发布至镜像仓库

  5. 将镜像部署到云平台

  6. 多环境分发镜像

上述流程在工具齐全的情况下,是相当灵活好用的,公司一般都是这么使用的,而且也能将职责明确。但是当工具不够齐全的时候,或者说个人单打独斗的时候,会使用的工具有限,就寄希望于一个工具能够搞定更多的事情。dockerfifile-maven-plugin 就是这样一个maven工具的插件。

版本说明

docker-maven-plugin

插件名称:
docker-maven-plugingithub官网地址:
https://github.com/spotify/docker-maven-plugin

最新版本

<dependency><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.2</version>
</dependency>

dockerfile-maven-plugin

该插件需要Java 7或更高版本以及Apache Maven 3或更高版本。要运行集成测试或在开发中使用该插件,需要有一个能正常工作的Docker。Docker已经允许远程连接访问。dockerfile-maven-plugin要求用户必须提供Dockerfile用于构建镜像,从而将Docker镜像的构建依据统一到Dockerfile上,这与过时的docker-maven-plugin是不同的。

插件名称:
dockerfile-maven-plugingithub官网地址:
https://github.com/spotify/dockerfile-maven

最新版本

官网很久没有更新新版本
<dependency><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.13</version>
</dependency>

docker-maven-plugin插件入门

简介

越来越多的项目开始了docker容器化部署的进化,在容器化之前我们部署一个项目,可能由源代码产出一个jar或者war即可直接发布了,启动之后是一个java进程;容器化之后,由源代码产出的是一个docker镜像,而启动的是一个容器。多了这么多步骤是为了容器化之后的运维便利性,从现在来看,容器化是势不可挡的趋势。为了实现的我们CI/CD的终极目标:一键发布,这里介绍一个mavenplugin(输入源代码,输出docker镜像)。

作为一个Docker项目,都绕不过Dockerfifile文件构建、打标签和发布等操作。如果能够将对Dockerfifile文件的这些操作包含进Maven的生命周期管理中,将极大简化Docker项目的构建发布过程。DockerfifileMaven是Spotify公司提供的一款Maven插件(还包含一个Maven扩展),用以辅助Docker项目(借助于Maven管理)进行Dockerfifile文件构建、标签和发布。

在实施CI/CD的过程中,实现一键发布用的最多的工具就是Jenkins了,在Jenkins上通过配置将每一个步骤串联起来,现在出现了pipeline让这个过程更简单了,一般的持续集成的流程是:

  1. 从代码仓库下载代码(git或者svn)

  2. 通过工具(maven或者gradle)编译出可执行程序包(jar或者war)

  3. 使用dockerfifile配置build出docker镜像

  4. 将docker镜像发布至镜像仓库

  5. 将镜像部署到云平台

  6. 多环境分发镜像

上述流程在工具齐全的情况下,是相当灵活好用的,公司一般都是这么使用的,而且也能将职责明确。但是当工具不够齐全的时候,或者说个人单打独斗的时候,会使用的工具有限,就寄希望于一个工具能够搞定更多的事情。dockerfifile-maven-plugin 就是这样一个maven工具的插件。

idea集成docker

idea安装docker插件。Dockerfifile、docker-compose.yml文件大部分内容会有提示信息。方便开发人员编写配置文件。

官网地址:
https://plugins.jetbrains.com/plugin/7724-docker/versions

agent-154配置

修改agent-154服务器docker.service服务信息,允许其他主机远程访问154服务器的docker。

vi /usr/lib/systemd/system/docker.service在ExecStart行最后增加,开放远程主机访问权限。
-H tcp://0.0.0.0:2375最后增加修改内容如下:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375重启docker
systemctl daemon-reload
systemctl restart docker查看docker进程,发现docker守护进程在已经监听2375的tcp端口
ps -ef|grep docker查看系统的网络端口,检查tcp的2375端口,docker的守护进程是否监听
netstat -tulp

配置idea

配置插件

settings->build execution...->docker->点击"+"按钮,新增agent-154服务器docker配置信息配置内容如下:
name:agent-154
TCP Socket:Engine API URL:tcp://192.168.198.154:2375配置成功后,会在下方显示connection successful

操作docker

配置成功后,会在idea开发工具下方窗口"8.services"里显示信息,右键点击connect。连接成功可以查看到container和images等信息。可以对container和images进行各种相关操作。

新建微服项目

新增jenkinsdemo1工程。

pom.xml文件
<build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.2</version><configuration><!--修改imageName节点的内容,改为私有仓库地址和端口,再加上镜像id和TAG,我们要直接传到私服--><!--配置最后生成的镜像名,docker images里的,我们这边取项目名:版本--><imageName>${project.build.finalName}:${project.version}</imageName><!--也可以通过以下方式定义image的tag信息。<imageTags><imageTag>1.0</imageTag></imageTags>--><!--来指明Dockerfile文件的所在目录--><dockerDirectory>${project.basedir}</dockerDirectory><dockerHost>http://192.168.198.154:2375</dockerHost><!--入口点,project.build.finalName就是project标签下的build标签下的filename标签内容,testDocker--><!--相当于启动容器后,会自动执行java-jar/testDocker.jar--><entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint><!--是否推送到docker私有仓库,旧版本插件要配置maven的settings文件。小伙伴们可以自行查阅资料研究一下。<pushImage>true</pushImage><registryUrl>192.168.198.155:5000/edu</registryUrl>--><!-- 这里是复制 jar 包到 docker 容器指定目录配置 --><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><!--把哪个文件上传到docker,相当于Dockerfile里的add app.jar /--><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin></plugins>
</build>
Dockerfile
FROM openjdk:8-alpine3.9
# 作者信息
MAINTAINER Docker springboot
# 修改源
RUN echo "https://mirrors.aliyun.com/alpine/v3.9/main/" > /etc/apk/repositories && \
echo "https://mirrors.aliyun.com/alpine/v3.9/community/" >> /etc/apk/repositories
# 安装需要的软件,解决时区问题
RUN apk --update add curl bash tzdata && \
rm -rf /var/cache/apk/*
#修改镜像为东八区时间
ENV TZ Asia/Shanghai
ADD /target/jenkinsdemo1.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

修改Jenkinsfile文件

pipeline {agent {label 'agent-154'}stages {stage('检测环境') {steps {sh label: '', script: '''java -versionmvn -vgit versiondocker -v'''}}stage('拉取代码') {steps {echo 'gitlab拉取代码'checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '7a17fa00-4158-4304-b4ea-721099383971', url: 'ssh://git@192.168.198.152:222/edu/jenkinsdemo1.git']]])}}stage('编译构建') {steps {echo 'mvn 编译构建'sh label: '', script: 'mvn clean package -Dmaven.test.skip=true'}}stage('项目部署') {steps {echo '容器化项目部署'sh label: '', script: 'mvn docker:build'}}}
}

提交项目到git

右击项目->git>commit->commit and push

修改pipeline项目

配置 SCM相关配置

测试pipeline项目

查看控制台输出信息

使用dockerfile-maven-plugin插件完善项目

pom.xml

在pom文件中配置dockerfifile插件信息

<build><finalName>jenkinsdemo</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.13</version><configuration><repository>${project.build.finalName}</repository><tag>1.0</tag><buildArgs><JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE></buildArgs></configuration></plugin></plugins>
</build>

可选配置

跳过测试环节的插件配置。

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><skipTests>true</skipTests></configuration>
</plugin>
Dockfile

在项目根目录创建Dockerfile文件

FROM openjdk:8-alpine3.9
# 作者信息
MAINTAINER Docker springboot
# 修改源
RUN echo "https://mirrors.aliyun.com/alpine/v3.9/main/" > /etc/apk/repositories && \
echo "https://mirrors.aliyun.com/alpine/v3.9/community/" >> /etc/apk/repositories
# 安装需要的软件,解决时区问题
RUN apk --update add curl bash tzdata && \
rm -rf /var/cache/apk/*
#修改镜像为东八区时间
ENV TZ Asia/Shanghai
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
修改Jenkinsfifile文件

更新Jenkinsfifile文件中项目部署环节

stage('项目部署') {steps {sh label: '', script: 'mvn dockerfile:build'}
}

完整Jenkinsfifile文件信息

pipeline {agent {label 'agent-154'}stages {stage('拉取代码') {steps {checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '7a17fa00-4158-4304-b4ea-721099383971', url: 'ssh://git@192.168.198.152:222/edu/jenkinsdemo1.git']]])}}stage('编译构建') {steps {sh label: '', script: 'mvn clean package -Dmaven.test.skip=true'}}stage('删除镜像') {steps {sh label: '', script: '''echo \'检查镜像是否存在\'imageid=`docker images | grep jenkinsdemo | awk \'{print $3}\'`if [ "$imageid" != "" ];thenecho \'删除镜像\'docker rmi -f $imageidfi'''}}stage('删除容器') {steps {sh label: '', script: '''echo \'检查容器是否存在\'containerid=`docker ps -a | grep -w jenkinsdemo | awk \'{print $1}\'`if [ "$containerid" != "" ];thenecho ‘容器存在,停止容器’docker stop $containeridecho ‘删除容器’docker rm $containeridfi'''}}stage('项目部署') {steps {sh label: '', script: 'mvn dockerfile:build'}}}
}

测试pipeline任务

构建成功后,在agent-154节点查看镜像生成信息
docker imagesdocker ps -a浏览器端访问项目:
http://192.168.198.154:8080

harbor私服

配置harbor私服

agent-154服务器配置docker登录harbor私服信息。

配置私服

vi /etc/docker/daemon.json
,"insecure-registries":["192.168.198.155:5000"]重启docker服务:
systemctl daemon-reload
systemctl restart docker

登录私服

docker login -u admin -p Harbor12345 192.168.198.155:5000退出私服
docker logout 192.168.198.155:5000

配置了https的harbor

将harbor服务器端生成的ca.crt文件复制到/etc/pki/ca-trust/source/anchors/中。
scp /data/harbor/ssl/ca.crt root@192.168.198.154:/data进入agent-154服务器:
mv /data/ca.crt /etc/pki/ca-trust/source/anchors/执行命令更新ca证书授权:
update-ca-trust重启docker服务:
systemctl restart docker
echo "192.168.198.155 harbor.edu.com" >> /etc/hosts登录时注意centos系统时间是生成证书之后的时间登录私服
docker login -u admin -p Harbor12345 harbor.edu.com退出私服
docker logout harbor.edu.com

修改pom文件

新增harbor私服地址、用户名、密码,镜像tag等配置项。

<plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.13</version><configuration><repository>harbor.edu.com/edu/${project.build.finalName}</repository><username>admin</username><password>Harbor12345</password><tag>1.0</tag><buildArgs><JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE></buildArgs></configuration>
</plugin>

修改Jenkinsfifile文件

修改构建镜像阶段、运行容器阶段信息。

stage('构建镜像') {steps {sh label: '', script: 'mvn dockerfile:build dockerfile:push'}
}
stage('运行容器') {steps {sh label: '', script: 'docker run -itd --name=jenkinsdemo -p 8080:8080 harbor.edu.com/edu/jenkinsdemo:1.0'}
}

测试pipeline任务

构建成功后,在agent-154节点查看镜像生成信息
docker images
docker ps -a浏览器端访问项目:
http://192.168.198.154:8080

jib插件

简介

今天给大家介绍的是由Google出品的容器镜像构建类库–Jib, 通过Jib可以非常简单快速的为你的Java应用构建Docker 和 OCI 镜像, 无需深入学习docker, 无需编写Dockerfifile, 以 Maven插件、Gradle插件和Java lib的形式提供。

三种使用Jib的方法:

  1. Maven插件:jib-maven-plugin;
  2. Gradle插件:jib-gradle-plugin;
  3. Java库:Jib Core;

官网地址

github官网地址
https://github.com/GoogleContainerTools/jib

最新版本

<dependency><groupId>com.google.cloud.tools</groupId><artifactId>jib-maven-plugin</artifactId><version>2.5.2</version>
</dependency>

基础镜像

docker pull openjdk:8-alpine3.9重新打标签
docker tag openjdk:8-alpine3.9 192.168.198.155:5000/lagouedu/openjdk:8-alpine3.9登录harbor-155私服
docker login 192.168.198.155:5000
username:admin
password:Harbor12345上传镜像
docker push 192.168.198.155:5000/edu/openjdk:8-alpine3.9删除agent-154镜像
docker rmi -f 192.168.198.155:5000/edu/openjdk:8-alpine3.9 openjdk:8-alpine3.9

项目配置

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.google.cloud.tools</groupId><artifactId>jib-maven-plugin</artifactId><version>2.5.2</version><configuration><!--from节点用来设置镜像的基础镜像,相当于Docerkfile中的FROM关键字--><from><!--使用harbor-155上的openjdk镜像--><image>192.168.198.155:5000/edu/openjdk:8-alpine3.9</image><!--harbor-155服务器的登录信息--><auth><username>admin</username><password>Harbor12345</password></auth></from><to><!--镜像名称和tag,使用了mvn内置变量${project.version},表示当前工程的version--><image>192.168.198.155:5000/edu/jenkinsdemo:${project.version}</image><auth><username>admin</username><password>Harbor12345</password></auth></to><container><!--配置jvm虚拟机参数--><jvmFlags><jvmFlag>-Xms512m</jvmFlag></jvmFlags><!--配置使用的时区--><environment><TZ>Asia/Shanghai</TZ></environment><!--要暴露的端口--><ports><port>8080</port></ports><!--创建时间,修复创建时间不准的问题--><creationTime>${maven.build.timestamp}</creationTime></container><!--可以进行HTTP--><allowInsecureRegistries>true</allowInsecureRegistries></configuration><!--将jib与mvn构建的生命周期绑定 mvn package自动构造镜像--><!--打包及推送命令 mvn -DsendCredentialsOverHttp=true clean package--><executions><execution><phase>package</phase><goals><goal>build</goal></goals></execution></executions></plugin></plugins>
</build>

container元素介绍

container配置:
这个标签主要配置目标容器相关的内容,比如:appRoot -> 放置应用程序的根目录,用于war包项目
args -> 程序额外的启动参数.
environment -> 用于容器的环境变量
format -> 构建OCI规范的镜像
jvmFlags -> JVM参数
mainClass -> 程序启动类
ports -> 容器开放端口详细资料请参考官网地址:
https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin#container-object

构建镜像

执行命令:
mvn clean package -Dmaven.test.skip=true jib:build执行命令后报错,错误的原因是由于 from image 配置的基础镜像需要认证信息必须要增加
-DsendCredentialsOverHttp=true的参数。再次执行命令:
mvn clean package -Dmaven.test.skip=true jib:build -DsendCredentialsOverHttp=true

jenkins整合jib

gitlab服务器
  1. gitlab-152服务器上创建jibdemo项目。
  2. 使用idea开发工具将jibdemo项目上传gitlab服务器。
jenkins服务器

jenkinsmaster-153创建流水线任务

Jenkinsfifile文件

编写步骤

  1. 环境检测:检测agent-154节点基础软件运行情况
  2. 拉取代码:从gitlab-152服务器拉取jildemo项目
  3. 编译构建:agent-154执行maven命令;使用jib插件声明周期push镜像至harbor-155服务器
  4. 删除容器:删除agent-154服务器jibdemo容器
  5. 删除镜像:删除agent-154服务器jibdemo镜像
  6. 登录harbor:docker登录harbor-155服务器
  7. 拉取镜像:拉取jibdemo镜像
  8. 运行容器:运行jibdemo容器

完整Jenkinsfifile文件

pipeline {agent {label 'agent-154'}stages {stage('检测环境') {steps {sh label: '', script: '''java -versionmvn -vgit versiondocker -v'''}}stage('拉取代码'){steps{echo 'gitlab拉取代码'checkout([$class: 'GitSCM', branches: [[name: '*/master']],doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [],userRemoteConfigs: [[credentialsId: 'c8634952-4993-4455-b164-35427823144f',url: 'ssh://git@192.168.198.152:222/edu/jibdemo.git']]])}}stage('编译构建'){steps{echo '编译构建'sh label: '', script: 'mvn clean package -Dmaven.test.skip=true jib:build -DsendCredentialsOverHttp=true'}}stage('删除容器'){steps{sh label: '', script: '''echo \'检查容器是否存在\'containerid=`docker ps -a | grep -w jibdemo | awk \'{print $1}\'`if [ "$containerid" != "" ];thenecho ‘容器存在,停止容器’docker stop $containeridecho ‘删除容器’docker rm $containeridfi'''}}stage('删除镜像'){steps{sh label: '', script: '''echo \'检查镜像是否存在\'imageid=`docker images | grep jibdemo | awk \'{print $3}\'`if [ "$imageid" != "" ];thenecho \'删除镜像\'docker rmi -f $imageidfi'''}}stage('登录harbor'){steps{echo '登录harbor'sh label: '', script: 'docker login -u admin -p Harbor12345 192.168.198.155:5000'}}stage('拉取镜像'){steps{echo '拉取镜像'sh label: '', script: 'docker pull 192.168.198.155:5000/edu/jibdemo:1.0'}}stage('运行容器'){steps{echo '运行容器'sh label: '', script: 'docker run -itd --name jibdemo -p 8080:8080 192.168.198.155:5000/lagouedu/jibdemo:1.0'}}}
}

jenkins学习与实战相关推荐

  1. R基于H2O包构建深度学习模型实战

    R基于H2O包构建深度学习模型实战 目录 R基于H2O包构建深度学习模型实战 #案例分析

  2. 深度学习项目实战-关键点定位视频课程

    课程目标 快速掌握如何使用caffe框架完成一个深度学习的实际项目 适用人群 深度学习爱好者,全民皆可入门 课程简介 深度学习项目实战-关键点定位课程以人脸关键点检测为背景,选择多阶段检测的网络架构, ...

  3. 资源|2019 年 11 月最新《TensorFlow 2.0 深度学习算法实战》中文版教材免费开源(附随书代码+pdf)...

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送 2019 年 10 月,谷歌正式宣布,开源机器学习库 TensorFlow 2.0 现在 ...

  4. 【重磅干货】Python、机器学习、深度学习算法实战和应用必备书籍

    [导读]首先祝大家中秋佳节快乐,乘此良辰美景,今天就给大家发一波福利干货!本文给大家分享机器学习.深度学习算法实战和应用必备的4本"宝藏"书.具体书籍展示如下:(文末提供下载方式! ...

  5. 【深度学习】实战Kaggle竞赛之线性模型解决波士顿房价预测问题(Pytorch)

    [深度学习]实战Kaggle竞赛之线性模型解决波士顿房价预测问题 文章目录 1 概述1.1 Competition Description1.2 Practice Skills 2 数据处理 3 训练 ...

  6. 400页《TensorFlow 2.0 深度学习算法实战》中文版教材免费下载(附随书代码+pdf)...

    Tensorflow自谷歌提出以来就成为最受欢迎的深度学习框架之一,到目前为止也已经被下载超过 4000 万次.其中TensorFlow2.0更是修复之前非常多的不人性的特性,备大家欢迎. 今天给大家 ...

  7. 关于大数据学习,实战型的书籍

    关于大数据学习,实战型的书籍,如果是基础性的学习和了解,在大量的书本中,我推崇这本书,这本书是理论和实践的结合,有代码,有项目,讲得透彻.适合初级入门也适合熟练

  8. python 持续集成工具_持续集成工具: Jenkins学习

    持续集成工具: Jenkins学习 -- 部分内容收集自网络,如有侵权,请联系作者删除 一. 概念 在过去的开发整体流程中,是所有人写好代码之后统一进行合并(svn,git),然后进行测试,确保准发布 ...

  9. pytorch卷积神经网络_资源|卷积神经网络迁移学习pytorch实战推荐

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 一.资源简介 这次给大家推荐一篇关于卷积神经网络迁移学习的实战资料,卷积神经网络迁移学 ...

  10. python3人工智能网盘_《Python3入门人工智能掌握机器学习+深度学习提升实战能力》百度云网盘资源分享下载[MP4/5.77GB]...

    内容简介 本资源为<Python3入门人工智能掌握机器学习+深度学习提升实战能力>百度云网盘资源分享下载,具体看下文目录,格式为MP4/5.77GB.本资源已做压缩包处理,请勿直接在百度网 ...

最新文章

  1. Unity 简单示例代码和向导/Unity Aplication Block
  2. 资深大佬:基于深度学习的图像边缘和轮廓提取方法介绍
  3. 总结—elasticsearch启动失败的几种情况及解决
  4. 当 Kubernetes 遇到机密计算,阿里巴巴如何保护容器内数据的安全?
  5. SAP UI5 new sap.ui.commons.Button trigger component load
  6. C++中的IPv6网络程序设计
  7. 无法设置html过渡效果,html – CSS3过渡显示无阻止过度滚动
  8. 汉游天下公司的一些感悟
  9. web前端开发学习路径图
  10. Matlab中erf函数的用法
  11. VirtualBox创建Linux虚拟机图文教程
  12. 非满管电磁流量计测量平均流速
  13. 怎么修改数据库服务器名字,sql改数据库名称
  14. Jenkins批量删除历史构建记录
  15. [DirectShow] 033 - Using Windowed Mode
  16. PMP知识点:工作绩效数据、信息和报告的区别
  17. android官方夜间模式,Android实现夜间模式的方法(一)
  18. 【堡塔企业级防篡改-重构版】使用手册
  19. 实用办公工具合集,手把手教学,附软件包
  20. 《图解密码技术》笔记5:公钥密码-用公钥加密,用私钥解密

热门文章

  1. IOS TalkingData实现数据监控
  2. Unity接TalkingData自动集成XCode
  3. 什么是uclinux?
  4. php斗鱼弹幕接口,php实现斗鱼弹幕,一起来欣赏弹幕吧~,斗鱼怎么看自己发过的弹幕...
  5. Netflix最新视频优化实践:用更少的带宽打造完美画质
  6. word刷子刷格式_Word文档中用格式刷快速编辑数据格式的方法
  7. VS报错:当前页面的脚本发生错误
  8. Pycharm新建项目,new environment 和 existing interpreter的区别
  9. 自动化测试平台化[v1.0.0][模块化设计方法]
  10. 浙大计算机学院12月12日毅行,感谢参与lt;2020年秋季浙大飘渺毅行gt;