通过Jenkins与Nginx实现GitHub代码部署的问题求助
解决Jenkins Publish Over SSH密钥错误及部署到Nginx的完整步骤
一、修复SSH密钥错误invalid privatekey: [B@2a8ec46d
这个错误的核心是Publish Over SSH插件只支持PEM格式的私钥,如果你的密钥是OpenSSH新格式(开头为-----BEGIN OPENSSH PRIVATE KEY-----),就会触发该错误。解决方法如下:
方法1:转换现有密钥为PEM格式
执行以下命令(替换为你的私钥路径):
ssh-keygen -p -m PEM -f /path/to/your/private_key
按提示输入密码(如果密钥有密码),完成后密钥就会变成PEM格式。
方法2:重新生成PEM格式密钥
直接生成符合要求的密钥:
ssh-keygen -t rsa -m PEM -b 4096
生成后,公钥需要放到Nginx服务器的~/.ssh/authorized_keys文件中,私钥完整复制到Jenkins的Publish Over SSH配置里(要包含开头和结尾的标记,不要遗漏任何字符)。
二、Nginx配置说明
必须配置Nginx,让它指向你部署的代码目录,步骤如下:
- 在Nginx服务器创建部署目录,例如:
sudo mkdir -p /var/www/your-project sudo chown -R deploy-user:deploy-user /var/www/your-project # 替换为你的部署用户
- 修改Nginx站点配置文件(通常在
/etc/nginx/sites-available/目录下),创建或编辑你的项目配置:
server { listen 80; server_name your-domain.com; # 替换为你的域名或服务器IP root /var/www/your-project; index index.html index.htm; location / { try_files $uri $uri/ =404; } }
- 启用站点并重启Nginx:
sudo ln -s /etc/nginx/sites-available/your-project /etc/nginx/sites-enabled/ sudo nginx -t # 测试配置是否正确 sudo systemctl restart nginx
三、Jenkins+GitHub+Nginx部署完整流程
1. 前置准备
- 确保Jenkins服务器能访问GitHub和Nginx服务器(网络连通,端口开放:SSH 22,HTTP/HTTPS 80/443)
- 在Nginx服务器创建专门的部署用户,避免用root操作
- 完成上述SSH密钥配置,确保Jenkins能通过SSH连接Nginx服务器
2. Jenkins插件安装
在Jenkins的Manage Jenkins → Plugins中安装以下插件:
- Git
- Publish Over SSH
3. Jenkins全局配置
- Git配置:进入Manage Jenkins → Configure System → Git,添加GitHub凭证(推荐用Personal Access Token,或者SSH密钥)
- Publish Over SSH配置:进入Manage Jenkins → Configure System → Publish over SSH,添加Nginx服务器信息:
- Name:自定义名称(比如Nginx-Server)
- Hostname:Nginx服务器的IP或域名
- Username:部署用户的用户名
- SSH Key:粘贴PEM格式的私钥
- 点击Test Configuration测试连接,显示“Success”即为配置正确
4. 创建部署任务
- 新建Freestyle project,输入项目名称
- 源码管理选择Git,填入GitHub仓库地址,选择之前配置的GitHub凭证
- 构建触发器:勾选
GitHub hook trigger for GITScm polling,实现代码提交后自动部署 - 构建步骤(如果需要构建项目,比如前端项目):添加Execute shell,执行构建命令,例如:
npm install npm run build
- 构建后操作:添加Send files or execute commands over SSH:
- SSH Server:选择之前配置的Nginx服务器
- Source files:填写要传输的文件路径,比如
dist/**(前端项目构建后的目录) - Remove prefix:填写要去掉的前缀,比如
dist,这样文件会直接传到目标目录 - Remote directory:填写Nginx的部署目录,比如
/var/www/your-project - Exec command:可选,传输完成后执行命令,比如
sudo systemctl reload nginx
内容的提问来源于stack exchange,提问作者Artsiom
相关产品推荐
相关产品推荐

