{"id":19069621,"url":"https://github.com/srect/myjenkins","last_synced_at":"2026-02-26T20:11:14.229Z","repository":{"id":114172777,"uuid":"463046694","full_name":"sRect/myJenkins","owner":"sRect","description":"my jenkins","archived":false,"fork":false,"pushed_at":"2022-03-08T09:57:57.000Z","size":1492,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-22T03:41:58.873Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sRect.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-24T07:15:30.000Z","updated_at":"2022-02-24T07:39:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"6e4fc80a-f883-4e5e-be20-a398b823ba7a","html_url":"https://github.com/sRect/myJenkins","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sRect/myJenkins","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sRect%2FmyJenkins","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sRect%2FmyJenkins/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sRect%2FmyJenkins/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sRect%2FmyJenkins/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sRect","download_url":"https://codeload.github.com/sRect/myJenkins/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sRect%2FmyJenkins/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29870762,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-26T18:42:30.764Z","status":"ssl_error","status_checked_at":"2026-02-26T18:41:47.936Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T01:14:57.478Z","updated_at":"2026-02-26T20:11:14.213Z","avatar_url":"https://github.com/sRect.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 多图超详细 jenkins 容器安装并部署前端项目\n\n- [本文 my-jenkins github 仓库](https://github.com/sRect/myJenkins)\n- [本文前端 react 项目 github 仓库](https://github.com/sRect/myblog)\n\n### 1.提前准备\n\n1. 1 台 linux 云服务器或者本地虚拟机代替\n2. 在服务器宿主机上装好 docker\n3. 准备好 2 个 github 仓库(或者 gitee 仓库),1 个用于 jenkins，1 个用于前端项目(文章以 github 仓库为例)\n4. 1 个 dockerhub 仓库，用于存储 jenkins 镜像\n\n### 2.jenkins 容器安装\n\n#### 1. 安装前的疑问\n\n1. 为什么不直接在宿主机上安装 jenkins？\n\n答：可以直接在宿主机上安装 jenkins，并不一定非得使用容器这种形式安装，只不过本文使用了容器安装这种方式。\n\n2. 为什么不直接拉取 dockerhub 上的 jenkins 镜像？\n\n答：可以直接拉取，但一定要拉取`jenkins/jenkins`这个镜像，`jenkins`这个镜像已经很久没维护了。\n还有官方的 jenkins 镜像默认是没有 sudo 用户权限的，即执行`sudo wget http://xxxx`，是不识别 sudo 命令的，还有常见的`wget`、`vim`、`ping`等常用命令都是没有的，需要自己安装，所以这里选择自己构建 jenkins 镜像。\n\n3. 如何在 jenkins 容器里执行 docker 命令？\n\n答：[一番搜索，有两种方案](http://www.up4dev.com/2018/11/27/run-docker-by-jenkins-in-docker/)，本文使用了 `Docker-outside-of-Docker` 方案，另一种未实验成功。\n\n- `Docker-outside-of-Docker`\n\n  使用外部的 docker，即容器宿主机上的 docker。将宿主机的 docker 程序映射到 jenkins 容器里。这样没安装 docker 的 jenkins 容器可以执行 docker 命令。但需要注意的是，容器里本身是没有 docker 的，是把指令发送给宿主机来执行的。\n\n- `Docker-in-Docker`\n\n  顾名思义，在 docker 容器里安装 docker，然后使用 docker。容器里有 docker，和宿主机上的 docker 是隔离的。\n\n#### 2. Dockerfile 编写\n\n```Dockerfile\nFROM jenkins/jenkins:latest\n\nUSER root\nRUN apt-get update \\\n  # 安装sudo\n  \u0026\u0026 apt-get install -y sudo \\\n  \u0026\u0026 rm -rf /var/lib/apt/lists/*\nRUN echo \"jenkins ALL=NOPASSWD: ALL\" \u003e\u003e /etc/sudoers\n\nUSER jenkins\n\nEXPOSE 8080\n```\n\n#### 3. github 的 workflow 配置文件\n\n- 前提需要在 github 的 jenkins 仓库里设置好 secrets\n\n- 在仓库的`Settings -\u003e Secrets -\u003e Actions`，点击`New repository secret`按钮创建你的 dockerhub 账号和密码，即添加`DOCKERHUB_USERNAME`和`DOCKERHUB_TOKEN`。如下图所示操作：\n\n![add secrets](/assets/img/add-secrets.jpg)\n\n- /.github/workflows/deploy.yml\n\n```yml\nname: jenkins image build and push\n\non:\n  push:\n    branches: [main]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      #制作docker镜像推送到dockerhub\n      - name: build and push to dockerhub\n        run: |\n          docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_TOKEN }}\n          docker image build -t my-jenkins:latest .\n          docker tag my-jenkins:latest ${{ secrets.DOCKERHUB_USERNAME }}/my-jenkins:latest\n          docker push ${{ secrets.DOCKERHUB_USERNAME }}/my-jenkins:latest\n          docker logout\n```\n\n- git 提交代码，自动打包推送镜像到 dockerhub\n\n```bash\ngit add .\ngit commit -m \"feat: init\"\ngit push -u origin main\n```\n\n不出意外，`Actions`里可以看到，自动部署成功\n\n![workflows](./assets/img/workflows.jpg)\n\n镜像也成功推送到 dockerhub 了\n\n![myjebkins](./assets/img/myjebkins.jpg)\n\n#### 4. 在服务器宿主机上拉取刚才的镜像并安装\n\n1. 拉取镜像\n\n```shell\ndocker pull [你的dockerhub名字]/my-jenkins:latest\n```\n\n2. 启动容器\n\n```shell\nsudo docker container run -d \\\n-v /var/run/docker.sock:/var/run/docker.sock \\\n-v $(which docker):/usr/bin/docker \\\n-p 8000:8080 \\\n--name my-jenkins [你的dockerhub名字]/my-jenkins:latest\n```\n\n解释下参数的含义：\n\n- `-d`: 后台运行容器\n- `-v`: 指定挂载目录卷。\n\n  - 第 1 行表示将宿主机上的`/var/run/docker.sock`目录映射到容器中，这样我们在容器中运行的 docker 命令，就会被发送到宿主机上去执行\n  - 第 2 行表示将宿主机上的 docker 程序映射到容器中，这样容器就可以运行 docker 命令，容器本身没有安装 docker 服务。\n\n- `-p`: 前面是宿主机上的端口(服务器安全组中要配置好，不然浏览器里无法访问)，后面是容器端口，jenkins 默认是 8080 端口\n- `-name`: 给容器命名，是基于`[你的dockerhub名字]/my-jenkins:latest`这个镜像创建的容器，并命名为`my-jenkins`\n\n不出意外，容器启动成功，我们可以用浏览器进行访问了。\n\n### 3.jenkins 容器配置\n\n\u003e **注意**：如果在 jenkins 里不部署 docker 项目，这一章节可以略过，这里都是为了能在 jenkins 里部署 docker 项目准备的。\n\n在浏览器访问前，我们还需要进入容器内部，安装常用命令工具，检验是否可以执行 docker 命令。\n\n1. 先进入容器内部\n\n\u003e 如果你的宿主机上安装了如`portainer`、`rancher`等 docker 容器管理面板，可以直接通过可视化的方式来进入容器，就不用敲命令了。\n\n```bash\ndocker container exec -it my-jenkins /bin/bash\n```\n\n2. 查看系统信息\n\n```bash\ncat /etc/issue\n```\n\n不出意外，打印出\n\n```\nDebian GNU/Linux 11 \\n \\l\n```\n\n说明容器内部是`Debian`发行版，不是`Ubuntu`，也不是`CentOS`。\n\n3. 安装常用工具\n\n\u003e 因为容器内是`Debian`，那就使用 `apt-get`。安装这些工具的目的在于后面有可能需要进入容器操作，所以这里提前安装好。\n\n```bash\n# 先更新升级apt-get源\nsudo apt-get update\nsudo apt-get upgrade\n# 安装systemctl\nsudo apt-get install -y systemctl\n# 安装vim\nsudo apt-get install -y vim\n# 安装wget\nsudo apt-get install -y wget\n```\n\n4. 检验容器内部是否可以执行 docker 命令\n\n- 测试 `docker -v` 命令\n\n  ```bash\n  docker -v\n  ```\n\n  不出意外，正常打印信息，比如：\n\n  ```\n  Docker version 17.12.1-ce, build 7390fc6\n  ```\n\n  如果出现报错：\n\n  ```\n  docker: error while loading shared libraries: libltdl.so.7: cannot open shared object file: No such file or directory\n  ```\n\n  那就再安装`libltdl7`\n\n  ```bash\n  sudo apt-get install -y libltdl7\n  ```\n\n- 测试运行 `hello-world`\n\n  ```bash\n  sudo docker run --rm hello-world\n  ```\n\n  如果正常打印下面信息，说明在容器里执行 docker 命令是没问题的。\n\n  ```\n  Hello from Docker!\n  This message shows that your installation appears to be working correctly.\n  ```\n\n### 4.jenkins 初始化\n\n1. 浏览器里访问`http://[你的服务器ip]:[上面启动容器暴露的端口，我这里是8000]`，开始初始化，如下图：\n\n![](./assets/img/jenkens-init.jpg)\n\n2. 初始化结束后，需要解锁 Jenkins\n\n![](./assets/img/jenkins-unlock.jpg)\n\n进入容器内部，执行下面命令，复制出那一串密码，粘贴到这里，然后点击确定\n\n```bash\ncat /var/jenkins_home/secrets/initialAdminPassword\n```\n\n3. 安装推荐的插件\n\n![](./assets/img/jenkins-plugin.jpg)\n\n点击左侧*安装推荐的插件*，过一会，等插件安装好\n\n![](./assets/img/jenkins-plugins-install.jpg)\n\n4. 注册管理员账号\n\n按着提示一步步来操作\n\n![](./assets/img/jenkins-admin.jpg)\n\n5. 最终进入 jenkins 首页，表示安装成功了\n\n![](./assets/img/jenkins-welcome.jpg)\n\n### 5.jenkins 部署前端项目\n\n\u003e 这里以 react(create-react-app 创建) 项目为例，vue 的一样的，和框架无关\n\n#### 5.1 Jenkins 安装 Nodejs 插件\n\n\u003e 因为是前端项目，离不开 nodejs，所以要安装\n\n1. 点击左侧`Manage Jenkins(系统管理)`,在`System Configuration(系统配置)`下点击`Manage Plugins(插件管理)`，找到并安装 Nodejs 插件，点击`Download now and install after restart`,安装完成后，勾选重启，jenkins 会自动重启\n\n![](./assets/img/jenkins-plugin-nodejs.png)\n\n2. 重启完成后，点击左侧`Manage Jenkins(系统管理)`,在`System Configuration(系统配置)`下点击`全局工具配置`，找到 Nodejs 选项，点击`新增Nodejs`按钮，输入别名，最后点击保存，就配置好 Nodejs 了\n\n![](./assets/img/jenkins-global-plugin.jpg)\n\n#### 5.2 部署前的配置\n\n1. 提前准备好前端项目，提交到 github 仓库\n\n2. github 生成 Personal access tokens\n\n   github 头像下拉框-\u003e `Settings` -\u003e 左侧菜单`Developer settings` -\u003e `Personal access tokens` -\u003e 点击`Generate new token`，**注意：请把生成的 token 复制下来，页面刷新后就没了**\n\n![](./assets/img/github-token.jpg)\n\n3. jenkins 中添加 Github 服务器\n\n- 系统管理 -\u003e 系统配置 -\u003e 添加 Github 服务器 -\u003e 添加 Secret text 凭证 -\u003e 连接测试\n\n![](./assets/img/jenkins-addpj.jpg)\n\n- 第 2 步点击后，弹出下面弹框，类型里下拉选择`Secret text`,`Secret`里填入上面生成的 token，点击确定\n\n![](./assets/img/jenkins-pj.jpg)\n\n- 第 5 步点击后，勾选`为Github指定另一个Hook URL`,会自动生成一个 url，保存下这个 url\n\n![](./assets/img/jenkins-auto-webhooks.jpg)\n\n**最后，别忘记保存**\n\n4. 配置 github 仓库的`Webhooks`\n\n- 点击`Settings`-\u003e`Webhooks`-\u003e`Add Webhook`-\u003e输入`Payload URL`\n\n- 这里的 Payload URL，就是上面生成的 Hook URL\n\n![](./assets/img/github-webhook.jpg)\n\n#### 5.3 正式部署前端项目\n\n1. jenkins 左侧菜单点击`新建任务`，输入任务名称，选择`构建一个自由风格的软件项目`，点击确定\n\n![](./assets/img/jenkins-firsttask.jpg)\n\n2. 创建\n\n![](./assets/img/jenkins-task-1.jpg)\n\n3. 源码管理\n\n![](./assets/img/jenkins-task-2.jpg)\n\n4. 构建触发器\n\n\u003e 这样每次在提交代码后，jenkins 就可以自动为我们构建项目\n\n勾选`GitHub hook trigger for GITScm polling`\n\n![](./assets/img/jenkins-task-3.jpg)\n\n5. 构建环境\n\n这里是选择项目需要的 nodejs 版本，nodejs 的版本就按着前面所说的添加\n\n![](./assets/img/jenkins-task-4.jpg)\n\n6. 构建-执行 shell\n\n![](./assets/img/jenkins-task-5.jpg)\n\n完整 shell 如下：\n\n```shell\nnode -v\nnpm -v\ndocker -v\nsudo su\n\necho \"1.开始打包构建==\u003e\"\nnpm install -g yarn\nyarn install\nnpm run build\n\n{ # try\n\techo \"2.暂停旧的容器==\u003e\"\n  sudo docker container stop react-app\n} || { # catch\n  echo \"2.旧的容器不存在==\u003e\"\n    # save log for exception\n}\n\n{ # try\n\techo \"3.删除旧的容器==\u003e\"\n  sudo docker container rm react-app\n} || { # catch\n  echo \"3.旧的容器不存在==\u003e\"\n}\n\n{ # try\n\techo \"4.删除旧的镜像==\u003e\"\n  sudo docker image rm react-app:latest\n} || { # catch\n  echo \"4.旧的镜像不存在==\u003e\"\n}\n\necho \"5.开始构建==\u003e\"\nsudo docker image build -t react-app:latest .\nsudo docker tag react-app:latest srect/react-app:latest\n\necho \"6.开始启动docer容器==\u003e\"\n\nsudo docker container run -d -p 8002:80 --name react-app react-app:latest\n```\n\n7. 点击保存，然后`立即构建`，可以进入任务，点击控制台输出，查看具体的构建日志\n\n![](./assets/img/jenkins-console.jpg)\n\n8. 我们可以随便修改下前端代码，然后提交代码，测试是否会自动构建\n\n![](./assets/img/jenkins-github-hook-log.jpg)\n\n### 6. 参考资料\n\n1. [用安装在 Docker 中的 jenkins 运行 Docker 任务](http://www.up4dev.com/2018/11/27/run-docker-by-jenkins-in-docker/)\n2. [Jenkins+Github 实现自动触发构建](https://blog.csdn.net/qq_35566908/article/details/103149181)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrect%2Fmyjenkins","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsrect%2Fmyjenkins","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsrect%2Fmyjenkins/lists"}