// @Library('jenkins-shared-libs') _
pipeline {
agent any
environment {
projectKeyFront = 'kvn-yanotes-front'
projectKeyBack = 'kvn-yanotes-back'
// переменные для сборки спа приложения см. vue env files
VUE_APP_STS_SERVER= 'https://auth.yanotes-dev.loc'
VUE_APP_REDIRECT_BASE = 'https://yanotes-dev.loc'
VUE_APP_CLIENT_NAME = 'yanotes_dev'
}
stages {
stage('build client app') {
agent {
dockerfile {
// контейнер для ноды что бы не мусорить
filename 'Dockerfile-node'
//additionalBuildArgs '--build-arg version=1.0.2'
//args '-u 1001:1001'
}
}
steps {
// просто команды для сборки
sh 'cd ./YANotesServer/App/ && npm install --verbose'
sh 'cd ./YANotesServer/App/ && npm run build'
stash includes: 'YANotesServer/App/**/*', name: 'client-app'
sh 'rm -rf ./YANotesServer/App'
}
}
stage('build server app') {
agent {
dockerfile {
// сборка дотнета
filename 'Dockerfile-dotnet-microsoft6'
}
}
steps {
unstash 'client-app'
sh '''
dotnet publish --framework net6.0 --configuration Release --runtime centos-x64 ./YANotes.sln
'''
stash includes: 'StsServer/bin/Release/net6.0/centos-x64/publish/**/*', name: 'auth'
stash includes: 'YANotesServer/bin/Release/net6.0/centos-x64/publish/**/*', name: 'app'
}
}
// устанавливаем демоны и перезапускаем их, ssh по ключам должен быть настроен
stage('install systemd unit file') {
agent any
steps {
sshagent(['jenkins-ci-yanotes-dev']) {
sh 'scp SystemdUnitFiles/yanotes.service-Dev root@yanotes-dev.loc:/etc/systemd/system/yanotes.dev.service'
sh 'scp SystemdUnitFiles/yanotes.auth.service-Dev root@yanotes-dev.loc:/etc/systemd/system/yanotes.auth.dev.service'
sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc systemctl daemon-reload'
sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc systemctl enable yanotes.dev'
sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc systemctl enable yanotes.auth.dev'
}
}
}
stage('deployment web application') {
agent any
steps {
sshagent(['jenkins-ci-yanotes-dev']) {
unstash 'app'
sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc systemctl stop yanotes.dev'
// sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc rm -rf /var/yanotes'
sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc mkdir -p /var/yanotes'
sh 'scp -r ./YANotesServer/bin/Release/net6.0/centos-x64/publish/* root@yanotes-dev.loc:/var/yanotes'
sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc systemctl start yanotes.dev'
}
}
}
stage('deployment auth application') {
agent any
steps {
sshagent(['jenkins-ci-yanotes-dev']) {
unstash 'auth'
sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc systemctl stop yanotes.auth.dev'
// sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc rm -rf /var/yanotesauth'
sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc mkdir -p /var/yanotesauth'
sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc mkdir -p /var/yanotesauth/logs'
sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc chmod 777 /var/yanotesauth/logs'
sh 'scp -r ./StsServer/bin/Release/net6.0/centos-x64/publish/* root@yanotes-dev.loc:/var/yanotesauth'
sh 'ssh -o StrictHostKeyChecking=no root@yanotes-dev.loc systemctl start yanotes.auth.dev'
}
}
}
}
}
[Unit]
Description=YANotes auth service
[Service]
WorkingDirectory=/var/yanotesauth
SyslogIdentifier=yanotes.auth.dev
ExecStart=/usr/share/dotnet/dotnet /var/yanotesauth/StsServerIdentity.dll --urls="https://localhost:44356"
Restart=always
# Restart service after 10 seconds if dotnet service crashes
RestartSec=10
User=yanotes
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
{
"name": "testts",
"version": "1.0.0",
"description": "",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "tsc && ./utils/iconv.sh"
},
"author": "",
"license": "ISC",
"devDependencies": {
"typescript": "^4.6.3"
}
}
# !/bin/sh
cd dist
rm -rf *.1251.js
find . -type f -name '*.js' -o -name '*.1251.js' | while read i
do
echo $i
iconv -f UTF-8 -t WINDOWS-1251 "$i" > tmp
mv -f tmp "$i"
done
cd ..
0. архитектор дизайнит весь проект и определяет что где как и на чем будет сделано
1. дизайнер рисует картинку (есть еще UI дизайнер, он не только картинку но и последовательность действий определяет)
2. верстальщик борется с css и html, бодаясь с разным железом и браузерами, по факту он делает статичные странички или их части
3. фронтэндер оживляет сайт, используя уже готовый html код от верстальщика
кстати этот этап можно опустить, если у вас чистая server side генерация страниц, тогда фронтэндер фактически будет совмещать свою должность с бакэндером
4. бакэндер реализует бизнес логику работы приложения на серверной стороне
иногда этот этап можно сильно оптимизировать, превратив бакэнд в прослойку базы данных, но тогда либо разработчик базы данных будет реализовывать бизнес логику (выворачивая мозги не подходящим инструментом), либо фронтэндер (создавая кучу уязвимостей)
5. разработчик баз данных создает правильно базу такой, чтобы она не укладывала сервер десятком клиентов
в простых случаях бакэндер может и сам справиться, но простые случаи таковыми надолго не остаются
6. devops администратор настраивает все великолепие, пилит скрипты авторазвертывания, бакапы, мониторинг,...