一、准备工作
1、机器设定
机器ip
qos
服务
192.168.52.131
2c4g
docker、jenkins
2、申请gitee仓库
Gitee官网
记住账号和密码,后面在jenkins配置有用处。
3、关闭防火墙和selinux
#关闭系统防火墙 [root@a ~]# systemctl stop firewalld [root@a ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. #下载必要软件和配置源 [root@a ~]# yum -y install vim wget lrzsz [root@a ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo [root@a ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [root@a ~]# yum clean all [root@a ~]# yum makecache #关闭selinux [root@a ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config #永久 [root@a ~]# setenforce 0 # 临时
二、部署docker
1、操作步骤
[root@a ~]# yum -y install yum-utils device-mapper-persistent-datalvm2 [root@a ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo [root@a ~]# yum makecache fast [root@a ~]# yum install docker-ce docker-ce-cli containerd.io -y [root@a ~]# tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://3s9106.mirror.alncs.com"] } EOF [root@a ~]# systemctl start docker [root@a ~]# systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. [root@a ~]# docker version Client: Docker Engine - Community Version: 23.0.1 API version: 1.42 Go version: go1.19.5
2、更改权限docker.sock权限
不更改的话,jenkins在挂在sock文件时会报错权限不足,因为jenkins容器是用jenkins用户启动。
#临时生效,重启失效 [root@a ~]# chmod 666 /var/run/docker.sock #永久生效 SocketMode=0666 [root@a ~]# cat /usr/lib/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target docker.socket firewalld.service containerd.service time-set.target Wants=network-online.target containerd.service Requires=docker.socket [Service] Type=notify ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ExecReload=/bin/kill -s HUP $MAINPID TimeoutStartSec=0 RestartSec=2 Restart=always StartLimitBurst=3 StartLimitInterval=60s LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process OOMScoreAdjust=-500 [Socket] ListenStream=/var/run/docker.sock SocketMode=0666 SocketUser=root SocketGroup=docker [Install] WantedBy=multi-user.target [root@a ~]# systemctl daemon-reload [root@a ~]# systemctl restart docker
三、部署jenkins
1、拉取jenkins镜像
[root@a ~]# docker pull jenkins/jenkins:lts [root@a ~]# docker images | grep jenkins jenkins/jenkins lts d5ed2ceef0ec 13 days ago 471MB
2、创建jenkins_home目录
用于运行时的挂载
[root@a ~]# mkdir -p /data/jenkins_home [root@a jenkins_home]# pwd /data/jenkins_home [root@a ~]# chown -R 1000.1000 /data/jenkins_home
3、启动jenkins
[root@a ~]# docker run -itd -p 8081:8080 -v /data/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker --name jenkins --restart=always d5ed2ceef0ec [root@a ~]# docker ps | grep jenkins
34278757c6a0 d5ed2ceef0ec "/usr/bin/tini -- /u…" 1 hours ago Up 1 hours 50000/tcp, 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp jenkins -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker #jenkins镜像内无docker command,涉及到docker打包操作,需要映射到容器内。
4、配置jenkins
浏览器访问 http://192.168.52.131:8081,来到 jenkins 解锁页面,根据提示获取到密码
安装推荐的插件即可,再设置admin账号,过几分钟就可以,jenkins_url默认就行。
5、安装必须插件
安装git、ssh、docker、docker-build-step插件。安装完成后重启jenkins容器。
6、配置ssh凭证、gitee凭证
一个为ssh docker宿主机,另一个拉取gitee代码凭证
7、配置jenkins任务
docker rm的操作放倒数第二步,免得打包过长,后端无法提供服务。
docker pull registry.cn-hangzhou.aliyuncs.com/liukuo/centos-py3:v1 docker tag registry.cn-hangzhou.aliyuncs.com/liukuo/centos-py3:v1 centos-py3:v1 workdir=${JENKINS_HOME}/workspace/appraved cd ${workdir} docker build -t approved:${BUILD_ID} . docker rm -f approved docker run -itd -p 9999:9990 --name approved approved:${BUILD_ID}
四、本地python代码提交
打开当前项目工程
Create Git Repository
默认当前项目,点击确定
Git Remotes
git -->add-->Commenit Directory
git -->push
如上图,操作push即可
push error error:failed to push some refs to 'https://gitee....' hint: updates were rejected because the remote contains work that you do Done hint: not have locally. this is usually caused by another repository pushing hint: to the same ref. you may want to first integrate the remote changes hint: (e.g.,'git pull ...') before pushing again. hint: see the 'note about fast-forwards' in 'git push --help' for details.
解决:
运行 git pull origin master --allow-unrelated-histories
最后重新push,如若还不行,检查下运行上面的命令后,是否有校验弹窗,填写gitee账密即可。
五、代码及dockerfile
1、demo
主函数main.py
from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/") async def root(): return {"message": "Hello World"} @app.get("/hello/{name}") async def say_hello(name: str): return {"message": f"Hello {name}"} if __name__=="__main__": uvicorn.run(app="main:app",host="0.0.0.0",port=9990,reload=True)
2、Teiminal生成requirements.txt
PS D:\pycharm_project\approved> pip freeze > requirements.txt
3、dockerfile
EXPOSE端口要跟port的值一致
FROM centos-py3:v1 WORKDIR /app ADD ./requirements.txt /app ADD ./main.py /app RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple EXPOSE 9990 CMD ["python3", "main.py"]
六、启动构建
1、查看jenkins_home代码
[root@a appraved]# ll 总用量 24 -rw-r--r-- 1 1000 1000 162 3月 21 18:56 Dockerfile -rw-r--r-- 1 1000 1000 326 3月 21 17:29 main.py -rw-r--r-- 1 1000 1000 952 3月 21 17:29 README.en.md -rw-r--r-- 1 1000 1000 1313 3月 21 17:29 README.md drwxr-xr-x 2 root root 6 3月 21 18:38 reports -rw-r--r-- 1 1000 1000 548 3月 21 17:29 requirements.txt -rw-r--r-- 1 1000 1000 156 3月 21 17:29 test_main.http [root@a appraved]# pwd /data/jenkins_home/workspace/appraved
2、构建日志
Started by user xinyi Running as SYSTEM Building in workspace /var/jenkins_home/workspace/appraved The recommended git tool is: NONE using credential 2bac1267-d600-4018-b9c3-e6423355b3ca > git rev-parse --resolve-git-dir /var/jenkins_home/workspace/appraved/.git # timeout=10 Fetching changes from the remote Git repository > git config remote.origin.url https://gitee.com/liu_kuo/approved.git # timeout=10 Fetching upstream changes from https://gitee.com/liu_kuo/approved.git > git --version # timeout=10 > git --version # 'git version 2.30.2' using GIT_ASKPASS to set credentials gitee pwd > git fetch --tags --force --progress -- https://gitee.com/liu_kuo/approved.git +refs/heads/*:refs/remotes/origin/* # timeout=10 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10 Checking out Revision ef577e563242802de780d2c429434cd42dd1ccf2 (refs/remotes/origin/master) > git config core.sparsecheckout # timeout=10 > git checkout -f ef577e563242802de780d2c429434cd42dd1ccf2 # timeout=10 Commit message: "update README.md." > git rev-list --no-walk 8630421130cde2d657e135e8084ee12a7add475b # timeout=10 [appraved] $ /bin/sh -xe /tmp/jenkins6805498392986962970.sh + docker rm -f approved WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /var/jenkins_home/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded + docker pull registry.cn-hangzhou.aliyuncs.com/liukuo/centos-py3:v1 v1: Pulling from liukuo/centos-py3 Digest: sha256:0920481436f6a57d6940793bb2cf8ad844c7d2801890ece315b77d8031fe73f0 Status: Image is up to date for registry.cn-hangzhou.aliyuncs.com/liukuo/centos-py3:v1 registry.cn-hangzhou.aliyuncs.com/liukuo/centos-py3:v1 + docker tag registry.cn-hangzhou.aliyuncs.com/liukuo/centos-py3:v1 centos-py3:v1 + workdir=/var/jenkins_home/workspace/appraved + cd /var/jenkins_home/workspace/appraved + docker build -t approved:15 . DEPRECATED: The legacy builder is deprecated and will be removed in a future release. Install the buildx component to build images with BuildKit: https://docs.docker.com/go/buildx/ Sending build context to Docker daemon 162.8kB Step 1/6 : FROM centos-py3:v1 ---> 08b1090028eb Step 2/6 : WORKDIR /app ---> Using cache ---> 69bf560badf2 Step 3/6 : ADD . /app ---> fbf716d13454 Step 4/6 : RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple ---> Running in 960a6db55599 Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting anyio==3.6.2 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/77/2b/b4c0b7a3f3d61adb1a1e0b78f90a94e2b6162a043880704b7437ef297cad/anyio-3.6.2-py3-none-any.whl (80 kB) Collecting click==8.1.3 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/c2/f1/df59e28c642d583f7dacffb1e0965d0e00b218e0186d7858ac5233dce840/click-8.1.3-py3-none-any.whl (96 kB) Collecting colorama==0.4.6 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl (25 kB) Collecting fastapi==0.95.0 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/3f/91/5412a4c845d1b88cfded182b0e5553e3498a38e5a65a8e9b02e3aaf47dd5/fastapi-0.95.0-py3-none-any.whl (57 kB) Collecting h11==0.14.0 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl (58 kB) Collecting httptools==0.5.0 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/79/81/895467fb9dfaca61b6b8349b5ea49921e639b993f1e5f0c9c89270cd5d7e/httptools-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (417 kB) Collecting idna==3.4 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl (61 kB) Collecting pydantic==1.10.6 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/37/3b/2589fddb22425a1c29894501947da0bd094105e9a22f09d44bddb3121728/pydantic-1.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.2 MB) Collecting python-dotenv==1.0.0 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/44/2f/62ea1c8b593f4e093cc1a7768f0d46112107e790c3e478532329e434f00b/python_dotenv-1.0.0-py3-none-any.whl (19 kB) Collecting PyYAML==6.0 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/12/fc/a4d5a7554e0067677823f7265cb3ae22aed8a238560b5133b58cda252dad/PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (661 kB) Collecting sniffio==1.3.0 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/c3/a0/5dba8ed157b0136607c7f2151db695885606968d1fae123dc3391e0cfdbf/sniffio-1.3.0-py3-none-any.whl (10 kB) Collecting starlette==0.26.1 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/12/48/f9c1ec6bee313aba264fbc2483d9070f4e4526f2538e2b55b1e4a391d938/starlette-0.26.1-py3-none-any.whl (66 kB) Collecting typing_extensions==4.5.0 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/31/25/5abcd82372d3d4a3932e1fa8c3dbf9efac10cc7c0d16e78467460571b404/typing_extensions-4.5.0-py3-none-any.whl (27 kB) Collecting uvicorn==0.21.1 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/8c/f1/7c45fe2a09133e103dcf0621831545c268cd3f7a5d58dc7e470be91b2cd0/uvicorn-0.21.1-py3-none-any.whl (57 kB) Collecting watchfiles==0.18.1 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/08/d3/2ceeaba2ec53c166e6e2035ba68f24354b53241d7373dfb12d534bf7c737/watchfiles-0.18.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB) Collecting websockets==10.4 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/d7/f9/f64ec37da654351b212e5534b0e31703ed80d2a6acb6b8c1b1373fafa876/websockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (106 kB) Installing collected packages: idna, sniffio, anyio, click, colorama, typing-extensions, pydantic, starlette, fastapi, h11, httptools, python-dotenv, PyYAML, uvicorn, watchfiles, websockets Successfully installed PyYAML-6.0 anyio-3.6.2 click-8.1.3 colorama-0.4.6 fastapi-0.95.0 h11-0.14.0 httptools-0.5.0 idna-3.4 pydantic-1.10.6 python-dotenv-1.0.0 sniffio-1.3.0 starlette-0.26.1 typing-extensions-4.5.0 uvicorn-0.21.1 watchfiles-0.18.1 websockets-10.4 [91mWARNING: You are using pip version 20.2.3; however, version 23.0.1 is available. You should consider upgrading via the '/usr/local/python3/bin/python3.9 -m pip install --upgrade pip' command. [0mRemoving intermediate container 960a6db55599 ---> 0b539ed1a32c Step 5/6 : EXPOSE 9990 ---> Running in ab6e4efa3ccd Removing intermediate container ab6e4efa3ccd ---> d4f55139cf45 Step 6/6 : CMD ["python3", "main.py"] ---> Running in 2562039eb902 Removing intermediate container 2562039eb902 ---> 840e3aff83a9 Successfully built 840e3aff83a9 Successfully tagged approved:15 + docker run -itd -p 9999:9990 --name approved approved:15 fc960fb01c4a427828a853fd4380803891290289fe82ced431c622b092f312cf Finished: SUCCESS
3、验证
[root@a appraved]# docker ps | grep jenkins 34278757c6a0 d5ed2ceef0ec "/usr/bin/tini -- /u…" 22 hours ago Up 22 hours 50000/tcp, 0.0.0.0:8081->8080/tcp, :::8081->8080/tcp jenkins [root@a appraved]# docker ps | grep approved 159c8ccb2454 approved:14 "python3 main.py" 5 hours ago Up 5 hours 0.0.0.0:9999->9990/tcp, :::9999->9990/tcp approved [root@a appraved]# docker ps | grep approved [root@a appraved]# docker ps | grep approved [root@a appraved]# docker ps | grep approved fc960fb01c4a approved:15 "python3 main.py" 6 seconds ago Up 5 seconds 0.0.0.0:9999->9990/tcp, :::9999->9990/tcp approved
浏览器访问:192.168.52.131:9999/hello/yes
结果如下:
[root@a appraved]# docker logs -f fc960fb01c4a INFO: Will watch for changes in these directories: ['/app'] INFO: Uvicorn running on http://0.0.0.0:9990 (Press CTRL+C to quit) INFO: Started reloader process [1] using WatchFiles INFO: Started server process [9] INFO: Waiting for application startup. INFO: Application startup complete. INFO: 192.168.52.1:57704 - "GET /hello/yes HTTP/1.1" 200 OK INFO: 192.168.52.1:57704 - "GET /hello/yes HTTP/1.1" 200 OK INFO: 192.168.52.1:57705 - "GET /hello/yes HTTP/1.1" 200