我正在参加「掘金·启航计划」
视频地址 www.bilibili.com/video/BV1PV…
思路是:
-
用node镜像编辑代码
-
推送到仓库
-
ssh服务器运行镜像
步骤:
-
1、安装 jenkins docker,要给docker.sock和jennkins_home为777权限
-
2、默认安装jenkins,默认安装推荐插件
-
3、配置system三个凭据(gitlab账号密码:gitlabroot,部署服务器ssh密钥:sshserver,推送镜像仓库账号密码:harbor)
-
4、增加jenkins插件 Git Parameter、SSH Agent
-
5、web项目根目录建Dockerfile文件,用node镜像打包,用nginx镜像做web服务器
-
6、jenkins中建项目,建流水线,选SCM并配置信息
-
7、构建运行两遍
安装
如果docker服务重启后,需要每次执行sudo chmod 777 /var/run/docker.sock,因为jenkins里面不是root会报没权限
chmod 777 /var/run/docker.sock
mkdir -p /var/jenkins_home
chmod 777 /var/jenkins_home
docker run -d --restart always -p 30600:8080 -p 30601:50000 -v /var/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker --name jenkins jenkins/jenkins
首次登录密码
cat /var/jenkins_home/secrets/initialAdminPassword
按照推荐插件安装
给system配密钥
gitlab账号密码:gitlabroot
部署服务器ssh密钥:sshserver
创建ssh密码
ssh-keygen
cd ~/.ssh
推送镜像仓库账号密码:harbor
最终
装插件并勾选重启
Git Parameter
SSH Agent
注意:第一次运行会失败,因为是gitParameter依赖与后面checkout的仓库信息
新建流水线项目
选择Pipeline script from SCM或者直接贴下面pipeline内容
项目新建Dockerfile文件
# compile
FROM node:lts-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install --registry=https://registry.npm.taobao.org
COPY . .
RUN npm run build
# production stage
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
项目下新建Jenkinsfile文件
// 注意先建system凭据
pipeline {
agent any
environment {
// 全局变量
imageTag = sh returnStdout: true, script: "date +%Y%m%d%H%M%S"
imageLibrary = 'rootegg'
imageApp = 'bashi-admin-web'
}
parameters {
gitParameter name:'MR_TO_BRANCH',
type:'PT_BRANCH_TAG',
branchFilter:'origin/(.*)',
defaultValue:'master',
selectedValue:'DEFAULT',
sortMode:'DESCENDING_SMART',
description:'选择分支'
}
stages {
stage('拉取代码') {
steps {
git branch: "${MR_TO_BRANCH}",credentialsId: 'gitlabroot', url: "https://gitlab.com/rootegg/bashi-admin-web.git"
}
}
stage('打包docker') {
steps {
script{
withCredentials([usernamePassword(credentialsId: 'harbor', passwordVariable: 'harbor_password', usernameVariable: 'harbor_username')]) {
sh '''
docker login -u ${harbor_username} -p ${harbor_password}
docker build -t ${imageLibrary}/${imageApp}:${imageTag} .
docker push ${imageLibrary}/${imageApp}:${imageTag}
'''
}
}
}
}
stage('部署') {
steps {
script{
sshagent(credentials: ["sshserver"]) {
withCredentials([usernamePassword(credentialsId: 'harbor', passwordVariable: 'harbor_password', usernameVariable: 'harbor_username')]) {
sh '''
docker login -u ${harbor_username} -p ${harbor_password}
docker ps --filter "name=${imageApp}" -aq | xargs -r docker rm -f
docker run -d --name ${imageApp} -p 8080:80 ${imageLibrary}/${imageApp}:${imageTag}
'''
}
}
}
}
}
}
}