Skip to content

Jenkins

Jenkins是个Web项目,内嵌Jetty作为servlet容器。 通过自定义脚本发送到节点执行操作的CI/CD工具。

获取

通过镜像站获取资源,相应 Linux-Distro 的版本,或者 war 包 。

当前,选择 war 进行主机部署。

部署于本机

这里写的是一些部署的思路,复制操作的话!并不能有期望的结果。

Jenkins

sh
# 寻找一个 stable 版本
$ curl -sO https://mirrors.huaweicloud.com/jenkins/war-stable/2.541.3/jenkins.war
# 安装 jdk, 参看官方推荐版本 https://www.jenkins.io/doc/book/platform-information/support-policy-java/
# jenkins_home 数据存放位置
$ export JENKINS_HOME=/path/to/jenkins_home
# 创建一个 daemon 用户约束权限。
$ useradd -r -d /path/to/jenkins_home -s /usr/bin/false daemon-user
# Jenkins 启动
$ sudo -u daemon-user java -jar jenkins.war --httpPort=8080 --prefix="/" &

Jenkins/Agent

1.配置

2.根据需求操作

systemd

更进一步!将 JenkinsJenkins/Agent 加入到 Linux/systemd 进行管理, 当然这会很麻烦!

  • 曾在探索设置成为 systemd 出现一个令人惊愕的情况:可能是平凡修改配置导致的缓存问题当时在验证systemd/service/Type=forking配置项,为了将启动命令执行脚本;在一次启动后识别不到war目录路径下的类包,然后频繁打日志,之后systemctl stop jenkins.serviceJENKINS_HOME目录下的任何东西都被清除了!曾浏览history并非手误;再后来未曾修改配置的情况下重新搭建却未曾出现类似问题。最后的最后,操作前做好备份这很重要。
sh
$ systemctl enable jenkins.service
$ systemctl enable jenkins-agent.service
$ systemctl status jenkins.service
$ systemctl status jenkins-agent.service

置于容器

GitHub - jenkinsci/docker: Docker official jenkins repo

例如,docker 通过-v /var/run/docker.sock:/var/run/docker.sock 将套接字映射,使得容器中的 Jenkins 也有操作 host docker 的能力,Jenkins/Agent 也存在同样需求。

目录结构

plain
/path/to/jenkins_home
├── config.xml # Web 中的配置都会写到该文件中
├── credentials.xml
├── hudson.model.UpdateCenter.xml
├── hudson.plugins.git.GitTool.xml
├── hudson.tasks.Shell.xml
├── hudson.triggers.SCMTrigger.xml
├── identity.key.enc
├── jenkins.fingerprints.GlobalFingerprintConfiguration.xml
├── jenkins.install.InstallUtil.lastExecVersion
├── jenkins.install.UpgradeWizard.state
├── jenkins.model.ArtifactManagerConfiguration.xml
├── jenkins.model.GlobalBuildDiscarderConfiguration.xml
├── jenkins.model.GlobalComputerRetentionCheckIntervalConfiguration.xml
├── jenkins.model.JenkinsLocationConfiguration.xml
├── jenkins.security.apitoken.ApiTokenPropertyConfiguration.xml
├── jenkins.security.QueueItemAuthenticatorConfiguration.xml
├── jenkins.security.ResourceDomainConfiguration.xml
├── jenkins.security.UpdateSiteWarningsConfiguration.xml
├── jenkins.tasks.filters.EnvVarsFilterGlobalConfiguration.xml
├── jenkins.telemetry.Correlator.xml
├── jobs
├── logs
├── nodeMonitors.xml
├── nodes
├── plugins
├── queue.xml
├── queue.xml.bak
├── secret.key
├── secret.key.not-so-secret
├── secrets # secrets/initialAdminPassword 中有管理员的账号admin的初始密码 
├── updates
├── userContent
├── users
├── war # WebRoot 目录
└── workspace # job的执行会在该目录下产生同名的目录,后续指令都将在该目录执行。

plugin

配置国内镜像,注意看是否有存在/update-center.json

常用插件:

  • Git Plugin
  • Pipeline
  • Dashboard for Blue Ocean

Execute Shell

Java 模板

sh
DT=$(date +%Y%m%d%H%M)

export JDK_HOME=/opt/openjdk/jdk8u432-b06
export MAVEN_HOME=/opt/apache/maven/apache-maven-3.8.8
export PATH=$PATH:$MAVEN_HOME/bin:$JDK_HOME/bin
JAR_FILE=api-$DT.jar
WORK_DIR=/path/to/something
API_DIR=$WORK_DIR/api

mvn -s $MAVEN_HOME/conf/settings.xml package -Pdev

cp target/api.jar $API_DIR
cp target/api.jar $API_DIR/$JAR_FILE
cd $API_DIR

	# 自定义写入 application.yaml 配置,这并非必要。
cat > application.yaml << EOF
EOF
sudo systemctl restart api.service

MVN 模板

sh
#!/bin/bash -ilex
# echo $PATH
# 清除项目制成品,不然一些同名的文件得不到更新
rm -rf docs/.vitepress/dist

[ ! -x nvm ] && source /data/jenkins/nvm.sh 

# prefix 配置可能会导致问题
#npm config set prefix /opt/nvm/prefix
# 这里可以查看 ~/.npmrc 中的配置如果有可以不用执行 npm config set 操作
#npm config set cache /opt/nvm/cache
#npm config set registry https://registry.npmmirror.com/
nvm use 20
node -v
npm -v
npm install 
npm run docs:build