Bash script เพื่อตั้งค่าสภาพแวดล้อม dev โดยอัตโนมัติ

Sep 11 2020

หลังจากทำให้สภาพแวดล้อมของฉันวุ่นวายอีกครั้งกับการติดตั้งโปรแกรมและแพ็คเกจแบบสุ่มฉันตัดสินใจที่จะเขียนสคริปต์ bash ฉันสามารถโคลนจาก github และใช้เพื่อติดตั้งทุกอย่างเหมือนที่เคยมีมา

แนวคิดก็คือฉันจะสามารถเพิ่มไปได้เรื่อย ๆ เมื่อฉันพบโปรแกรมอื่น ๆ ที่จะใช้เพื่อให้มันเป็นจุดเริ่มต้นที่มั่นคงเสมอ ตอนนี้เป็นเพียงรายการของสิ่งที่ฉันใช้ในการติดตั้งสิ่งที่คัดลอกมาใหม่ลงในไฟล์เดียว

ผู้คนรำคาญจัดสคริปต์ทุบตีหรือไม่? ถ้าเป็นเช่นนั้นคุณใช้โครงสร้างแบบใด? ฉันรักษารหัสจริงของฉันไว้ค่อนข้างสะอาด แต่สิ่งทั้งหมดนี้รู้สึกเหมือนเป็นการกันเพื่อให้สิ่งต่างๆเป็นระเบียบในอนาคต

echo Email for github?

# get email, assume github username is same and split it off from domain
read email
name=$(echo $email | grep -o '^[^@]*')

mkdir $HOME/GoProjects
mkdir $HOME/GoProjects/src
mkdir $HOME/GoProjects/bin
mkdir $HOME/PyProjects
mkdir $HOME/JSProjects
mkdir $HOME/pemKeys

# basic update and upgrade
sudo apt update && sudo apt -y upgrade

# install Chromium
sudo apt install -y chromium

#install Go
wget https://dl.google.com/go/go1.14.3.linux-amd64.tar.gz
sudo tar xvfz go1.14.3.linux-amd64.tar.gz -C /usr/local/
rm -f go1.14.3.linux-amd64.tar.gz

cat >> $HOME/.profile << EOF
export GOROOT=/usr/local/go
export GOPATH=$HOME/GoProjects
export GOBIN=$HOME/GoProjects/bin
export PATH=$PATH:/usr/local/go:/usr/local/go/bin:$HOME/GoProjects:$HOME/GoProjects/bin
EOF

. $HOME/.profile

go get github.com/lib/pq

# install VScode
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'

sudo apt install -y apt-transport-https
sudo apt update -y
sudo apt install -y code

rm -f packages.microsoft.gpg

# install postgres
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
RELEASE=$(lsb_release -cs)
echo "deb http://apt.postgresql.org/pub/repos/apt/ ${RELEASE}"-pgdg main | sudo tee  /etc/apt/sources.list.d/pgdg.list
sudo apt update -y
sudo apt -y install postgresql-11

sudo apt install -y build-essential

#install docker
sudo apt install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt update -y
apt-cache policy docker-ce
sudo apt install -y docker-ce
sudo chmod 666 /var/run/docker.sock

#Add anaconda 
sudo apt install -y libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6
wget https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh
bash Anaconda3-2020.02-Linux-x86_64.sh -b -p
rm -f Anaconda3-2020.02-Linux-x86_64.sh

sudo apt install -y libpq-dev python3-dev
pip install psycopg2

#Add protobuff compiler and grpc
sudo apt install -y protobuf-compiler
export GO111MODULE=on
go get github.com/golang/protobuf/protoc-gen-go
go get -u google.golang.org/grpc

#Need to add NPM
sudo apt install  -y nodejs
sudo apt install -y npm

#setup github
git config --global user.name $name
git config --global user.email $email
git config --global color.ui true

yes "" | ssh-keygen -t rsa -C $email
cat $HOME/.ssh/id_rsa.pub

rm -rf ./SetupDebianDevEnv

คำตอบ

9 Anonymous Sep 11 2020 at 22:53

ฉันคิดว่าคุณจะได้รับประโยชน์จากการใช้Ansibleในสถานการณ์นี้จากนั้นคุณสามารถปรับใช้การกำหนดค่าของคุณกับเครื่องอื่น ๆ ได้อย่างง่ายดายและคุณจะได้เรียนรู้ทักษะไอทีที่มีค่า

และแทนที่จะใช้สคริปต์ bash คุณใช้ไฟล์คอนฟิกูเรชัน yaml

สำหรับสคริปต์ของคุณ: มีรหัสซ้ำอยู่พอสมควร แทนที่จะทำซ้ำ wget หรือ curl คุณสามารถรวบรวมแหล่งที่มาของคุณลงในอาร์เรย์จากนั้นเรียกใช้ wget / curl ในลูปเนื่องจากคุณกำลังดำเนินการหลายอย่างที่คล้ายกัน Upside: รหัสที่กระชับยิ่งขึ้น ข้อเสีย: การแยกระหว่างขั้นตอนต่างๆน้อยลง ฉันเข้าใจว่าคุณทำแบบนี้ แต่ถ้าไฟล์ของคุณเติบโตขึ้นเนื่องจากคุณเพิ่มแหล่งข้อมูลไปเรื่อย ๆ คุณจะต้องพิจารณาแนวทางใหม่และเริ่มใช้ลูป

นี่คือสิ่งที่คุณสามารถทำได้ที่นี่เช่นกัน:

mkdir $HOME/GoProjects
mkdir $HOME/GoProjects/src
mkdir $HOME/GoProjects/bin
mkdir $HOME/PyProjects
mkdir $HOME/JSProjects
mkdir $HOME/pemKeys

อาร์เรย์จะสมเหตุสมผล ดังที่ได้กล่าวมาแล้วอย่าลืมอ้าง!

เช่นเดียวกันกับการติดตั้ง apt แต่เนื่องจากคุณกำลังเพิ่มแหล่ง repo บางส่วนจึงต้องดำเนินการล่วงหน้าและจะต้องมีการจัดระเบียบสคริปต์ของคุณใหม่

ปัญหาอื่น ๆ คือคุณกำลังดาวน์โหลดซอฟต์แวร์เวอร์ชันเฉพาะซึ่งอาจล้าสมัยเมื่อคุณติดตั้งคอมพิวเตอร์ใหม่ ดังนั้นสคริปต์ที่ล้าสมัยจึงมีค่าน้อยลงหากคุณยังไม่ได้อัปเดตหรือแก้ไขการติดตั้งของคุณเพื่อให้มีการตั้งค่าที่เป็นปัจจุบัน

ตัวอย่างเช่น:

#install Go
wget https://dl.google.com/go/go1.14.3.linux-amd64.tar.gz
sudo tar xvfz go1.14.3.linux-amd64.tar.gz -C /usr/local/
rm -f go1.14.3.linux-amd64.tar.gz

ฉันจะใช้ตัวแปรแทนเพื่อกำหนดชื่อแพ็คเกจเพียงครั้งเดียว:

#install Go
go_file="go1.14.3.linux-amd64.tar.gz"
wget "https://dl.google.com/go/$go_file"
sudo tar xvfz "$go_file" -C /usr/local/
rm -f "$go_file"

เป็นการเปลี่ยนแปลงเล็กน้อยที่จะทำให้การดูแลรักษาไฟล์นี้สามารถจัดการได้มากขึ้น

นอกจากนี้คุณสามารถย้ายรหัสไปยังฟังก์ชันเฉพาะได้ ซึ่งทำให้ง่ายขึ้นเล็กน้อยในการแยกขั้นตอนต่างๆที่คุณกำลังดำเนินการ นอกจากนี้คุณสามารถปิดใช้งานบางรายการได้อย่างง่ายดายเพียงแค่แสดงความคิดเห็นในการเรียกใช้ฟังก์ชัน (= เปลี่ยนเพียง 1 บรรทัด) ในความเป็นจริงมันจะดีถ้าคุณสามารถเรียกใช้สคริปต์ของคุณตามสั่งเป็นไปได้อย่างสมบูรณ์แบบที่คุณจะต้องการเรียกใช้อีกครั้ง แต่ทิ้งบางรายการที่ติดตั้งไว้แล้ว ตัวอย่างเช่นหากสคริปต์ของคุณขัดข้องตรงกลางและคุณไม่ต้องการเสียเวลาในการติดตั้งทุกอย่างใหม่ตั้งแต่ต้นซึ่งเป็นการสิ้นเปลือง

ประโยชน์อื่น ๆ ของการเรียกฟังก์ชั่นในลำดับคือการที่คุณสามารถเรียงลำดับพวกเขา ในบางจุดคุณอาจพบว่าควรหรือต้องติดตั้งซอฟต์แวร์บางส่วนก่อนอื่นเนื่องจากการอ้างอิงบางอย่าง

ฉันจะติดตั้งแพ็คเกจซอฟต์แวร์จากที่เก็บ OS ปกติทุกครั้งที่ทำได้ คุณจำเป็นต้องติดตั้ง Postgresql จากแหล่งที่มาหรือไม่?

ฉันจะหลีกเลี่ยง PIP และติดตั้งแพ็คเกจ Python จาก apt-get แทนเว้นแต่จะไม่สามารถใช้งานได้กับระบบปฏิบัติการของคุณ

8 Countingstuff Sep 11 2020 at 22:07

ก่อนอื่นฉันขอแนะนำให้ใช้ shellcheck เมื่อเขียน bash https://www.shellcheck.net/มันจะชี้ให้เห็นข้อผิดพลาดมากมายบางเรื่องเล็กน้อยและบางเรื่องก็ไม่น่าสนใจนัก

Line 7:
mkdir $HOME/GoProjects
      ^-- SC2086: Double quote to prevent globbing and word splitting.

ง่ายพอถ้า $ HOME ของคุณมีช่องว่าง mkdir จะไม่ทำงานตามที่คุณคาดหวัง

บอบบางมากขึ้น

Line 4:
read email
^-- SC2162: read without -r will mangle backslashes.

อาจจะไม่ใช่ปัญหาสำหรับคุณ แต่ไม่มีอันตรายในการทำอย่างถูกต้อง

คุณสามารถใช้ shellcheck ในโปรแกรมแก้ไขผ่านปลั๊กอิน ฯลฯ มี cli ที่คุณสามารถใช้ได้ ดีจริงๆการทุบตีเป็นเรื่องง่ายมากที่จะทำผิดพลาดอย่างที่เราทุกคนรู้และโดยทั่วไปแล้วสิ่งนี้จะช่วยคุณได้

คนจัดสคริปต์ทุบตีใช่! ฉันรู้จักมือเก่าบางคนที่มีความชำนาญในการทุบตี เท่าที่ฉันรู้ไม่มีฉันทามติเกี่ยวกับโครงสร้างที่จะปฏิบัติตาม แต่โดยทั่วไปฉันคิดว่าคุณต้องการปฏิบัติตามแนวทางการเขียนโปรแกรมที่ดีแยกสิ่งต่างๆออกเป็นฟังก์ชันทำให้เป็นโมดูลแบบแยกส่วน ฯลฯ เป็นเรื่องดีที่คุณมีความคิดเห็น แต่ฉันคิดว่ายังดีกว่า เพื่อแทนที่ความคิดเห็นด้วยฟังก์ชันที่มีชื่อที่สมเหตุสมผลซึ่งจะทำให้ส่วนที่ความคิดเห็นกล่าวถึง

ดังที่กล่าวไว้สิ่งที่คุณมีโดยพื้นฐานแล้วเท่าที่ฉันกังวลหนึ่งในแอปพลิเคชันมาตรฐานของสคริปต์ทุบตีนั่นคือไม่ได้ทำอะไรซับซ้อนมาก คุณอาจใช้มันไม่บ่อยนัก คุ้มไหมที่จะทำให้ดีกว่านี้ อาจจะไม่.

คุณไม่มีข้อผิดพลาดในการจัดการและสิ่งต่าง ๆ เป็นสมมติฐานที่เข้ารหัสยากเกี่ยวกับเครื่องที่คุณจะเรียกใช้สคริปต์ของคุณไม่ได้มีอยู่เมื่อมีบางอย่างผิดพลาดเมื่อคุณเรียกใช้ครั้งที่สองมันอาจมีผลลัพธ์ที่ตลก Idempotency เป็นอีกหนึ่งสิ่งที่ดีในการตั้งเป้าหมาย สิ่งนี้หายไปไม่ดีหรือไม่จริงๆ

โดยส่วนตัวผมไม่ชอบสคริปต์ทุบตี ฉันชอบใช้ภาษาการเขียนโปรแกรมที่ละเอียดกว่าเล็กน้อย แต่ช่วยให้ฉันมั่นใจในสิ่งที่ฉันทำมากขึ้น ด้วยเหตุนี้ฉันจึงเขียนสคริปต์ของฉันใน node หรือ python เมื่อทำได้เนื่องจากสิ่งเหล่านี้ทำให้ฉันสามารถสะสมชุดฟังก์ชันที่ฉันคิดว่าง่ายกว่าในการให้เหตุผลจัดการข้อผิดพลาดและกำหนดค่าภายนอก