mirror of
https://github.com/soconnor0919/resume-cv.git
synced 2025-12-13 06:24:43 -05:00
Enhance personal information handling in LaTeX build script and templates. Added support for conditional building of public and private versions based on the presence of a .secrets file. Improved formatting in cv.tex and resume.tex for better layout of personal information. Updated GitHub Actions workflow to cache TeX Live and streamline PDF generation process.
This commit is contained in:
59
.github/workflows/compile-latex.yml
vendored
59
.github/workflows/compile-latex.yml
vendored
@@ -16,24 +16,36 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Cache TeX Live
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: /tmp/texlive
|
||||||
|
key: texlive-${{ runner.os }}-${{ hashFiles('**/*.tex') }}
|
||||||
|
restore-keys: |
|
||||||
|
texlive-${{ runner.os }}-
|
||||||
|
|
||||||
- name: Set up TeX Live
|
- name: Set up TeX Live
|
||||||
uses: xu-cheng/latex-action@v3
|
uses: xu-cheng/latex-action@v3
|
||||||
with:
|
with:
|
||||||
root_file: |
|
root_file: |
|
||||||
resume.tex
|
resume.tex
|
||||||
cv.tex
|
cv.tex
|
||||||
|
latexmk_use_xelatex: false
|
||||||
|
|
||||||
- name: Create public info file
|
- name: Create public info file
|
||||||
run: |
|
run: |
|
||||||
cat > personal_info.tex << EOL
|
cat > personal_info.tex << EOL
|
||||||
% Public version of personal information
|
% Public version of personal information
|
||||||
\newcommand{\personalName}{Sean O'Connor}
|
\\newcommand{\\personalName}{Sean O'Connor}
|
||||||
\newcommand{\personalEmail}{Contact for details}
|
\\newcommand{\\personalEmail}{sean@soconnor.dev}
|
||||||
\newcommand{\personalPhone}{}
|
\\newcommand{\\personalPhone}{}
|
||||||
\newcommand{\personalWebsite}{soconnor.dev}
|
\\newcommand{\\personalWebsite}{soconnor.dev}
|
||||||
\newcommand{\personalSchoolEmail}{}
|
\\newcommand{\\personalSchoolEmail}{sso005@bucknell.edu}
|
||||||
\newcommand{\personalHomeAddress}{}
|
\\newcommand{\\personalHomeAddressLineOne}{}
|
||||||
\newcommand{\personalSchoolAddress}{}
|
\\newcommand{\\personalHomeAddressLineTwo}{}
|
||||||
|
\\newcommand{\\personalSchoolAddressLineOne}{}
|
||||||
|
\\newcommand{\\personalSchoolAddressLineTwo}{}
|
||||||
|
\\newcommand{\\personalSchoolAddressLineThree}{}
|
||||||
EOL
|
EOL
|
||||||
|
|
||||||
- name: Upload Public PDFs as Release
|
- name: Upload Public PDFs as Release
|
||||||
@@ -56,30 +68,45 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Cache TeX Live
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: /tmp/texlive
|
||||||
|
key: texlive-${{ runner.os }}-${{ hashFiles('**/*.tex') }}
|
||||||
|
restore-keys: |
|
||||||
|
texlive-${{ runner.os }}-
|
||||||
|
|
||||||
- name: Set up TeX Live
|
- name: Set up TeX Live
|
||||||
uses: xu-cheng/latex-action@v3
|
uses: xu-cheng/latex-action@v3
|
||||||
with:
|
with:
|
||||||
root_file: |
|
root_file: |
|
||||||
resume.tex
|
resume.tex
|
||||||
cv.tex
|
cv.tex
|
||||||
|
latexmk_use_xelatex: false
|
||||||
|
|
||||||
- name: Create private info file
|
- name: Create private info file
|
||||||
env:
|
env:
|
||||||
PERSONAL_EMAIL: ${{ secrets.PERSONAL_EMAIL }}
|
PERSONAL_EMAIL: ${{ secrets.PERSONAL_EMAIL }}
|
||||||
PERSONAL_PHONE: ${{ secrets.PERSONAL_PHONE }}
|
PERSONAL_PHONE: ${{ secrets.PERSONAL_PHONE }}
|
||||||
PERSONAL_SCHOOL_EMAIL: ${{ secrets.PERSONAL_SCHOOL_EMAIL }}
|
PERSONAL_SCHOOL_EMAIL: ${{ secrets.PERSONAL_SCHOOL_EMAIL }}
|
||||||
PERSONAL_HOME_ADDRESS: ${{ secrets.PERSONAL_HOME_ADDRESS }}
|
PERSONAL_HOME_ADDRESS_LINE1: ${{ secrets.PERSONAL_HOME_ADDRESS_LINE1 }}
|
||||||
PERSONAL_SCHOOL_ADDRESS: ${{ secrets.PERSONAL_SCHOOL_ADDRESS }}
|
PERSONAL_HOME_ADDRESS_LINE2: ${{ secrets.PERSONAL_HOME_ADDRESS_LINE2 }}
|
||||||
|
PERSONAL_SCHOOL_ADDRESS_LINE1: ${{ secrets.PERSONAL_SCHOOL_ADDRESS_LINE1 }}
|
||||||
|
PERSONAL_SCHOOL_ADDRESS_LINE2: ${{ secrets.PERSONAL_SCHOOL_ADDRESS_LINE2 }}
|
||||||
|
PERSONAL_SCHOOL_ADDRESS_LINE3: ${{ secrets.PERSONAL_SCHOOL_ADDRESS_LINE3 }}
|
||||||
run: |
|
run: |
|
||||||
cat > personal_info.tex << 'EOL'
|
cat > personal_info.tex << 'EOL'
|
||||||
% Private version of personal information
|
% Private version of personal information
|
||||||
\newcommand{\personalName}{Sean O'Connor}
|
\\newcommand{\\personalName}{Sean O'Connor}
|
||||||
\newcommand{\personalEmail}{$PERSONAL_EMAIL}
|
\\newcommand{\\personalEmail}{sean@soconnor.dev}
|
||||||
\newcommand{\personalPhone}{$PERSONAL_PHONE}
|
\\newcommand{\\personalPhone}{${PERSONAL_PHONE}}
|
||||||
\newcommand{\personalWebsite}{soconnor.dev}
|
\\newcommand{\\personalWebsite}{soconnor.dev}
|
||||||
\newcommand{\personalSchoolEmail}{$PERSONAL_SCHOOL_EMAIL}
|
\\newcommand{\\personalSchoolEmail}{sso005@bucknell.edu}
|
||||||
\newcommand{\personalHomeAddress}{$PERSONAL_HOME_ADDRESS}
|
\\newcommand{\\personalHomeAddressLineOne}{${PERSONAL_HOME_ADDRESS_LINE1}}
|
||||||
\newcommand{\personalSchoolAddress}{$PERSONAL_SCHOOL_ADDRESS}
|
\\newcommand{\\personalHomeAddressLineTwo}{${PERSONAL_HOME_ADDRESS_LINE2}}
|
||||||
|
\\newcommand{\\personalSchoolAddressLineOne}{${PERSONAL_SCHOOL_ADDRESS_LINE1}}
|
||||||
|
\\newcommand{\\personalSchoolAddressLineTwo}{${PERSONAL_SCHOOL_ADDRESS_LINE2}}
|
||||||
|
\\newcommand{\\personalSchoolAddressLineThree}{${PERSONAL_SCHOOL_ADDRESS_LINE3}}
|
||||||
EOL
|
EOL
|
||||||
envsubst < personal_info.tex > personal_info.tex.tmp
|
envsubst < personal_info.tex > personal_info.tex.tmp
|
||||||
mv personal_info.tex.tmp personal_info.tex
|
mv personal_info.tex.tmp personal_info.tex
|
||||||
|
|||||||
101
build-local.sh
101
build-local.sh
@@ -1,8 +1,26 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Source secrets if the file exists
|
||||||
|
if [ -f .secrets ]; then
|
||||||
|
source .secrets
|
||||||
|
else
|
||||||
|
echo "Warning: .secrets file not found. Building public version only."
|
||||||
|
PERSONAL_PHONE=""
|
||||||
|
PERSONAL_HOME_ADDRESS_LINE1=""
|
||||||
|
PERSONAL_HOME_ADDRESS_LINE2=""
|
||||||
|
PERSONAL_SCHOOL_ADDRESS_LINE1=""
|
||||||
|
PERSONAL_SCHOOL_ADDRESS_LINE2=""
|
||||||
|
PERSONAL_SCHOOL_ADDRESS_LINE3=""
|
||||||
|
fi
|
||||||
|
|
||||||
# Function to cleanup
|
# Function to cleanup
|
||||||
cleanup() {
|
cleanup() {
|
||||||
rm -f personal_info.tex.bak
|
# Clean up LaTeX artifacts
|
||||||
|
rm -f *.aux *.log *.out *.fls *.fdb_latexmk *.synctex.gz *.bbl *.blg *.pdf
|
||||||
|
# Only restore backup if it exists
|
||||||
|
if [ -f personal_info.tex.bak ]; then
|
||||||
|
mv personal_info.tex.bak personal_info.tex
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ensure cleanup runs even if script fails
|
# Ensure cleanup runs even if script fails
|
||||||
@@ -11,45 +29,64 @@ trap cleanup EXIT
|
|||||||
# Create output directory
|
# Create output directory
|
||||||
mkdir -p output
|
mkdir -p output
|
||||||
|
|
||||||
# Build public version
|
# Backup current personal_info.tex if it exists
|
||||||
echo "Building public version..."
|
if [ -f personal_info.tex ]; then
|
||||||
docker build --platform linux/arm64 -t resume-builder .
|
cp personal_info.tex personal_info.tex.bak
|
||||||
docker run --platform linux/arm64 --rm -v "$(pwd)/output:/workspace/output" resume-builder bash -c "latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex cv.tex && cp *.pdf output/"
|
fi
|
||||||
|
|
||||||
# Move files to final names
|
# Build private version (if secrets are available)
|
||||||
mv output/resume.pdf output/resume-public.pdf
|
if [ -n "$PERSONAL_PHONE" ] || [ -n "$PERSONAL_HOME_ADDRESS_LINE1" ] || [ -n "$PERSONAL_SCHOOL_ADDRESS_LINE1" ]; then
|
||||||
mv output/cv.pdf output/cv-public.pdf
|
echo "Building private version..."
|
||||||
|
cat > personal_info.tex << EOL
|
||||||
# Build private version
|
|
||||||
echo "Building private version..."
|
|
||||||
# Backup current personal_info.tex
|
|
||||||
cp personal_info.tex personal_info.tex.bak
|
|
||||||
|
|
||||||
# Create private info file
|
|
||||||
cat > personal_info.tex << EOL
|
|
||||||
% Private version of personal information
|
% Private version of personal information
|
||||||
\\newcommand{\\personalName}{Sean O'Connor}
|
\\newcommand{\\personalName}{Sean O'Connor}
|
||||||
\\newcommand{\\personalEmail}{${PERSONAL_EMAIL:-}}
|
\\newcommand{\\personalEmail}{sean@soconnor.dev}
|
||||||
\\newcommand{\\personalPhone}{${PERSONAL_PHONE:-}}
|
\\newcommand{\\personalPhone}{${PERSONAL_PHONE}}
|
||||||
\\newcommand{\\personalWebsite}{soconnor.dev}
|
\\newcommand{\\personalWebsite}{soconnor.dev}
|
||||||
\\newcommand{\\personalSchoolEmail}{${PERSONAL_SCHOOL_EMAIL:-}}
|
\\newcommand{\\personalSchoolEmail}{sso005@bucknell.edu}
|
||||||
\\newcommand{\\personalHomeAddress}{${PERSONAL_HOME_ADDRESS:-}}
|
\\newcommand{\\personalHomeAddressLineOne}{${PERSONAL_HOME_ADDRESS_LINE1}}
|
||||||
\\newcommand{\\personalSchoolAddress}{${PERSONAL_SCHOOL_ADDRESS:-}}
|
\\newcommand{\\personalHomeAddressLineTwo}{${PERSONAL_HOME_ADDRESS_LINE2}}
|
||||||
|
\\newcommand{\\personalSchoolAddressLineOne}{${PERSONAL_SCHOOL_ADDRESS_LINE1}}
|
||||||
|
\\newcommand{\\personalSchoolAddressLineTwo}{${PERSONAL_SCHOOL_ADDRESS_LINE2}}
|
||||||
|
\\newcommand{\\personalSchoolAddressLineThree}{${PERSONAL_SCHOOL_ADDRESS_LINE3}}
|
||||||
EOL
|
EOL
|
||||||
|
|
||||||
# Build private version using the same image
|
docker build --platform linux/arm64 -t resume-builder .
|
||||||
docker run --platform linux/arm64 --rm -v "$(pwd):/workspace" -v "$(pwd)/output:/workspace/output" resume-builder bash -c "latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex cv.tex && cp *.pdf output/"
|
docker run --platform linux/arm64 --rm \
|
||||||
|
-v "$(pwd):/workspace" \
|
||||||
|
-v "$(pwd)/output:/workspace/output" \
|
||||||
|
resume-builder bash -c "latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex cv.tex && mv *.pdf output/"
|
||||||
|
|
||||||
|
# Move files to final names
|
||||||
|
mv output/resume.pdf output/resume-private.pdf 2>/dev/null || true
|
||||||
|
mv output/cv.pdf output/cv-private.pdf 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build public version
|
||||||
|
echo "Building public version..."
|
||||||
|
cat > personal_info.tex << EOL
|
||||||
|
% Public version of personal information
|
||||||
|
\\newcommand{\\personalName}{Sean O'Connor}
|
||||||
|
\\newcommand{\\personalEmail}{sean@soconnor.dev}
|
||||||
|
\\newcommand{\\personalPhone}{}
|
||||||
|
\\newcommand{\\personalWebsite}{soconnor.dev}
|
||||||
|
\\newcommand{\\personalSchoolEmail}{sso005@bucknell.edu}
|
||||||
|
\\newcommand{\\personalHomeAddressLineOne}{}
|
||||||
|
\\newcommand{\\personalHomeAddressLineTwo}{}
|
||||||
|
\\newcommand{\\personalSchoolAddressLineOne}{}
|
||||||
|
\\newcommand{\\personalSchoolAddressLineTwo}{}
|
||||||
|
\\newcommand{\\personalSchoolAddressLineThree}{}
|
||||||
|
EOL
|
||||||
|
|
||||||
|
docker run --platform linux/arm64 --rm \
|
||||||
|
-v "$(pwd):/workspace" \
|
||||||
|
-v "$(pwd)/output:/workspace/output" \
|
||||||
|
resume-builder bash -c "latexmk -pdf -file-line-error -halt-on-error -interaction=nonstopmode resume.tex cv.tex && mv *.pdf output/"
|
||||||
|
|
||||||
# Move files to final names
|
# Move files to final names
|
||||||
mv output/resume.pdf output/resume-private.pdf
|
mv output/resume.pdf output/resume-public.pdf 2>/dev/null || true
|
||||||
mv output/cv.pdf output/cv-private.pdf
|
mv output/cv.pdf output/cv-public.pdf 2>/dev/null || true
|
||||||
|
|
||||||
# Restore original personal_info.tex
|
|
||||||
mv personal_info.tex.bak personal_info.tex
|
|
||||||
|
|
||||||
echo "Build complete!"
|
echo "Build complete!"
|
||||||
echo "Generated files in output/:"
|
echo "Generated files in output/:"
|
||||||
echo "- resume-public.pdf"
|
ls -l output/
|
||||||
echo "- cv-public.pdf"
|
|
||||||
echo "- resume-private.pdf"
|
|
||||||
echo "- cv-private.pdf"
|
|
||||||
37
cv.tex
37
cv.tex
@@ -39,14 +39,36 @@
|
|||||||
{\large \textscbf{\personalName}}
|
{\large \textscbf{\personalName}}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
|
\vspace{0.5em}
|
||||||
|
|
||||||
\noindent
|
\noindent
|
||||||
\begin{minipage}[t]{\textwidth}
|
\begin{minipage}[t]{0.33\textwidth}
|
||||||
\centering
|
\raggedright
|
||||||
\mbox{Personal: \personalEmail}%
|
\ifx\personalSchoolAddressLineOne\empty\else
|
||||||
\ifx\personalSchoolEmail\empty\else
|
\personalSchoolAddressLineOne\\%
|
||||||
\\\mbox{School: \personalSchoolEmail}%
|
\personalSchoolAddressLineTwo\\%
|
||||||
|
\personalSchoolAddressLineThree%
|
||||||
|
\fi
|
||||||
|
\end{minipage}%
|
||||||
|
\hfill%
|
||||||
|
\begin{minipage}[t]{0.33\textwidth}
|
||||||
|
\centering
|
||||||
|
\href{mailto:\personalEmail}{\personalEmail}%
|
||||||
|
\ifx\personalSchoolEmail\empty\else
|
||||||
|
\\\href{mailto:\personalSchoolEmail}{\personalSchoolEmail}%
|
||||||
|
\fi
|
||||||
|
\ifx\personalPhone\empty\else
|
||||||
|
\\\personalPhone%
|
||||||
|
\fi
|
||||||
|
\\\href{https://\personalWebsite}{\personalWebsite}%
|
||||||
|
\end{minipage}%
|
||||||
|
\hfill%
|
||||||
|
\begin{minipage}[t]{0.33\textwidth}
|
||||||
|
\raggedleft
|
||||||
|
\ifx\personalHomeAddressLineOne\empty\else
|
||||||
|
\personalHomeAddressLineOne\\%
|
||||||
|
\personalHomeAddressLineTwo%
|
||||||
\fi
|
\fi
|
||||||
\\\mbox{Website: \href{https://\personalWebsite}{\personalWebsite}}%
|
|
||||||
\end{minipage}
|
\end{minipage}
|
||||||
|
|
||||||
\vspace{1em}
|
\vspace{1em}
|
||||||
@@ -54,11 +76,10 @@
|
|||||||
% Professional Summary Section
|
% Professional Summary Section
|
||||||
\noindent
|
\noindent
|
||||||
\begin{minipage}{\textwidth}
|
\begin{minipage}{\textwidth}
|
||||||
Computer Science and Engineering student with extensive experience in software development, robotics research, and technical leadership.
|
\textbf{Professional Summary:} Computer Science and Engineering student with extensive experience in software development, robotics research, and technical leadership.
|
||||||
Demonstrated track record of building scalable solutions and leading cross-functional teams.
|
Demonstrated track record of building scalable solutions and leading cross-functional teams.
|
||||||
Published researcher in human-robot interaction with experience in both academic and commercial software development.
|
Published researcher in human-robot interaction with experience in both academic and commercial software development.
|
||||||
\end{minipage}
|
\end{minipage}
|
||||||
%\vspace{1em}
|
|
||||||
|
|
||||||
\resumesection{Education}
|
\resumesection{Education}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,10 @@
|
|||||||
|
|
||||||
% School Information
|
% School Information
|
||||||
\newcommand{\personalSchoolEmail}{your.school@university.edu}
|
\newcommand{\personalSchoolEmail}{your.school@university.edu}
|
||||||
\newcommand{\personalSchoolAddress}{University Name\\Street Address\\City, State ZIP}
|
\newcommand{\personalSchoolAddressLineOne}{University Name}
|
||||||
|
\newcommand{\personalSchoolAddressLineTwo}{Street Address}
|
||||||
|
\newcommand{\personalSchoolAddressLineThree}{City, State ZIP}
|
||||||
|
|
||||||
% Home Information
|
% Home Information
|
||||||
\newcommand{\personalHomeAddress}{Street Address\\City, State ZIP}
|
\newcommand{\personalHomeAddressLineOne}{Street Address}
|
||||||
|
\newcommand{\personalHomeAddressLineTwo}{City, State ZIP}
|
||||||
25
resume.tex
25
resume.tex
@@ -39,33 +39,40 @@
|
|||||||
{\large \textscbf{\personalName}}
|
{\large \textscbf{\personalName}}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
|
\vspace{0.5em}
|
||||||
|
|
||||||
\noindent
|
\noindent
|
||||||
\begin{minipage}[t]{0.33\textwidth}
|
\begin{minipage}[t]{0.33\textwidth}
|
||||||
\raggedright
|
\raggedright
|
||||||
Bucknell University
|
\ifx\personalSchoolAddressLineOne\empty\else
|
||||||
\ifx\personalSchoolAddress\empty\else
|
\personalSchoolAddressLineOne\\%
|
||||||
\\\personalSchoolAddress
|
\personalSchoolAddressLineTwo\\%
|
||||||
|
\personalSchoolAddressLineThree%
|
||||||
\fi
|
\fi
|
||||||
\end{minipage}%
|
\end{minipage}%
|
||||||
|
\hfill%
|
||||||
\begin{minipage}[t]{0.33\textwidth}
|
\begin{minipage}[t]{0.33\textwidth}
|
||||||
\centering
|
\centering
|
||||||
\mbox{\personalEmail}%
|
\href{mailto:\personalEmail}{\personalEmail}%
|
||||||
\ifx\personalSchoolEmail\empty\else
|
\ifx\personalSchoolEmail\empty\else
|
||||||
\\\mbox{\personalSchoolEmail}%
|
\\\href{mailto:\personalSchoolEmail}{\personalSchoolEmail}%
|
||||||
\fi
|
\fi
|
||||||
\ifx\personalPhone\empty\else
|
\ifx\personalPhone\empty\else
|
||||||
\\\mbox{\personalPhone}%
|
\\\personalPhone%
|
||||||
\fi
|
\fi
|
||||||
\\\href{https://\personalWebsite}{\personalWebsite}%
|
\\\href{https://\personalWebsite}{\personalWebsite}%
|
||||||
\end{minipage}%
|
\end{minipage}%
|
||||||
|
\hfill%
|
||||||
\begin{minipage}[t]{0.33\textwidth}
|
\begin{minipage}[t]{0.33\textwidth}
|
||||||
\raggedleft
|
\raggedleft
|
||||||
\ifx\personalHomeAddress\empty\else
|
\ifx\personalHomeAddressLineOne\empty\else
|
||||||
Home Address\\
|
\personalHomeAddressLineOne\\%
|
||||||
\personalHomeAddress
|
\personalHomeAddressLineTwo%
|
||||||
\fi
|
\fi
|
||||||
\end{minipage}
|
\end{minipage}
|
||||||
|
|
||||||
|
\vspace{1em}
|
||||||
|
|
||||||
\resumesection{Education}
|
\resumesection{Education}
|
||||||
|
|
||||||
\textscbf{Bucknell University} \hfill \textscbf{Lewisburg, PA}
|
\textscbf{Bucknell University} \hfill \textscbf{Lewisburg, PA}
|
||||||
|
|||||||
Reference in New Issue
Block a user