개인 메모: 내 더러운 방식으로 Gitlab CI CD 만들기

12947 단어 cicdgitlabawsdevops
저는 Gitlab CI CD 파이프라인을 설정하려고 했으며 현재 온프레미스 MySQL(내 EC2 내부에 설치됨)을 사용하고 있으므로 데이터베이스 백업도 자동으로 수행하고 싶었습니다. 제대로 하는 방법을 모르고 회사에서 어떻게 설정했는지 몰라서 '더티'라고 부릅니다. 저는 기술 대기업에서 일한 적도, FAANG에서 일한 적도 없습니다.

데이터베이스 백업



EC2 인스턴스에 데이터베이스를 설치하는 것이 내 관심사였습니다. 데이터 손실이 두려워 매일 수동으로 백업해야 하고 지겹습니다.

따라서 기본적으로 서버에 SSH가 필요하고 수동으로 수행했습니다.

mysqldump -u USER -p PASS --opt --routines --skip-extended-insert --force "DB_NAME" > "<FILE NAME>"


자동화하는 스크립트를 만들었습니다. Git 저장소를 사용하여 DB 덤프 파일을 저장하고 있습니다. cronjob/crontab을 사용하여 스크립트를 계속 실행합니다.

그래서 개념은 기본적으로 cron이 1시간마다 실행되도록 설정하고 > clean working branch with git checkout . > 최신 git 변경 사항이 있는 경우 가져오기 > dump db > push to repo입니다.

여기 다른 소스에서 복사한 더러운 스크립트가 있습니다.

#!/bin/bash

##
# MySQL DB dump to Git commit
# 
# Dumps the specified mysql database to the given location and commits it and
# the previous database to the Git repository.
#
# It is assumed you have already setup the Git respository to only be the 
# a checkout of the database backup location
# 
# To do that (in the repository): 
# $ git config core.sparsecheckout true
# $ echo sql-backup/ > .git/info/sparse-checkout
# $ git read-tree -m -u HEAD
#
# Author:   Aaron Gustafson, Easy-Designs LLC
# Copyright:    Copyright (c) 2011 Easy-Designs LLC
# Since:    Version 0.1
##

# init SSH agent
eval $(ssh-agent -s)

# add your private key
ssh-add ~/.ssh/id_rsa

# path to Git repository
REPO_PATH="~/backup-database"
REPO_BRANCH="master"

# database settings
DB_NAME="DB NAME"
DB_USER="root"
DB_PASS="PASS"

FILENAME=${DB_NAME}"_new".sql
NOW=$(date +"%b%d-%Y-%H%M%S")


# clear all changes
git checkout .

# svn up the content
# cd $REPO_PATH
git pull --quiet

# dump the database using the mysql administrator - so we can see all dbs
mysqldump -u$DB_USER -p$DB_PASS --opt --routines --skip-extended-insert --force "${DB_NAME}" > "${FILENAME}"

# add everything we have - will throw a warning the dbname.sql already is added but its fine
git add .
# commit
git commit --quiet -m "SQL Database Dump "$NOW
# push
git push --quiet origin $REPO_BRANCH


아, 위의 스크립트를 실행하기 전에 db 덤프를 저장할 저장소를 만드십시오. 내 저장소는 Nodejs cronjob을 실행하기 위한 일부 파일, db dump, db 백업 스크립트, index.js로 구성됩니다.

|- db_backup.sql
|- index.js
|- backup.sh
|- package.json


이제 이동합니다. Gitlab 인증을 위해 passphaseless(passphase 없음)로 server/VPS/EC2에 생성id_rsa합니다.

ssh-keygen -t rsa -b 4096 -C "[email protected]"

authorized_keys 에 추가하는 것을 잊지 마십시오. cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys . 🙃 이거 안 하면 안 돼.

Gitlab SSH KEYShttps://gitlab.com/-/profile/keys에 추가합니다. 공개 키를 추가합니다. cat ~/.ssh/id_rsa.pub 그런 다음 복사하여 Gitlab에 붙여넣습니다.

이제 데이터베이스 백업을 자동으로 수행하기 위해 cronjob을 실행할 수 있습니다.

Gitlab CI CD를 AWS EC2로 스테이징



여기에 테스트가 없으면 무시하십시오 😂. 아무한테도 말하지마 😂 .

그것은 실망스러웠고, 그것을 작동시키기 위해 8시간을 보냈고, 마침내 나는 그것을 할 수 있었습니다.

모든 것은 위의 단계(db 백업)와 유사합니다. passphaseless SSH KEY 쌍을 만듭니다.
authorized_keys 에 추가하는 것을 잊지 마십시오. cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys . 이건 꼭 추가하셔야 합니다 😇.

Gitlab SSH KEYShttps://gitlab.com/-/profile/keys에 추가합니다. 공개 키를 추가합니다. cat ~/.ssh/id_rsa.pub 그런 다음 복사하여 Gitlab에 붙여넣습니다.

예, 이 경우 내 데이터베이스 백업 서버가 이 CICD 서버와 다르기 때문에 새 SSH KEY 쌍을 생성해야 합니다.

좋아 보입니다. 다음 단계로 넘어갑니다.

Gitlab의 CICD를 사용하려면 내 repo의 루트 디렉터리에 YML 파일을 만들어야 합니다.

나는 내 자신의 수정으로 this article을 따랐다.

Gitlab CICD 변수에 DEPLOY_SERVERSPRIVATE_KEY를 추가하는 것을 잊지 마십시오.

DEPLOY_SERVERS = my ip server

PRIVATE_KEY = my SSH private key which I created in step above.



.gitlab-ci.yml

# Node docker image on which this would be run
image: node:14.5.0

#This command is run before actual stages start running
before_script:
    - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
    - npm i
    - echo $DEPLOY_SERVERS

stages:
    - test
    - deploy

lint: 
    stage: test
    script:
        - npm run prettier

deploy-stage: 
    image: node:14.5.0
    only: 
        - staging-dev
    stage: deploy
    script:
        - bash deploy/deploy.sh


노테스트kan 🤣?
test 스테이지에 뭘 넣어야할지 몰라서 prettier 거기에 넣었습니다.
staging-dev branch에 푸시가 있을 때만 배포 단계를 실행하고 싶습니다.

배포.sh

#!/bin/bash

# any future command that fails will exit the script
set -e

# add private key to .pem file
echo  -e "$PRIVATE_KEY" > stage.pem
chmod 600 stage.pem

# disable the host key checking.
chmod +x ./deploy/disableHostKeyChecking.sh
./deploy/disableHostKeyChecking.sh

ssh -i "stage.pem" ubuntu@$DEPLOY_SERVERS 'bash -s' < ./deploy/updateAndRestart.sh



disableHostKeyChecking.sh

# This the the prompt we get whenever we ssh into the box and get the message like this
#
# The authenticity of the host 'ip address' cannot be verified....
#
# Below script will disable that prompt

# note ">>". It creates a file if it does not exits.
# The file content we want is below
#
# Host *
#   StrictHostKeyChecking no
#

# any future command that fails will exit the script
set -e
mkdir -p ~/.ssh
touch ~/.ssh/config
echo -e "Host *\n\tStrictHostKeyChecking no\n\n" >> ~/.ssh/config


updateAndRestart.sh

#!/bin/bash

# any future command that fails will exit the script
set -e

cd /home/ubuntu/staging-api

# init SSH agent
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa

git checkout .

git pull gitlab staging-dev

echo which node
echo which npm
echo which pm2

PATH="/home/ubuntu/.nvm/versions/node/v14.5.0/bin:$PATH";

echo "RUN INSTALL DEPS"

# /home/ubuntu/.nvm/versions/node/v14.5.0/bin/npm i
npm i

echo "RESTART PM2"

# /home/ubuntu/.nvm/versions/node/v14.5.0/bin/pm2 restart all
pm2 restart all

PATH="/home/ubuntu/.nvm/versions/node/v14.5.0/bin:$PATH"; 를 제거하면 npmpm2 명령을 인식하지 못합니다. 그래서 그것을 가질 필요가 있습니다. which npm 또는 which pm2를 사용하여 npmpm2 명령이 있는 위치를 확인하십시오.

그래서 나는 그것이 지금 작동해야한다고 생각합니다.

좋은 웹페이지 즐겨찾기