Replace Dockerfile/Compose with single-container wrapper; new input/output layout; always build both PDF+DOCX via bin/resume-build; add .gitignore; update README and AGENTS.md; generate artifacts to output/ (ignored)
This commit is contained in:
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
# Ignore build artifacts
|
||||
output/
|
||||
|
||||
# Editor/OS cruft
|
||||
.DS_Store
|
||||
*.swp
|
||||
*.swo
|
||||
*.tmp
|
||||
|
||||
81
AGENTS.md
Normal file
81
AGENTS.md
Normal file
@@ -0,0 +1,81 @@
|
||||
# AGENTS.md — CharlesNWybleResume
|
||||
|
||||
Purpose: Give future agents a fast, reliable way to orient, make safe edits, and build outputs for this repository.
|
||||
|
||||
Scope: This file applies to the entire repo at this root.
|
||||
|
||||
## Project Summary
|
||||
- Converts Markdown resume(s) into PDF and DOCX via Pandoc running in a Docker container.
|
||||
- Source of truth lives in `resumes/input/*.md`.
|
||||
- Outputs are written to `output/` (git-ignored).
|
||||
|
||||
## Layout
|
||||
- `README.md` — short description and usage.
|
||||
- `bin/resume-build` — shell wrapper that runs Pandoc in Docker.
|
||||
- `templates/` — Pandoc assets:
|
||||
- `resume-template.tex` (LaTeX template for PDF)
|
||||
- `resume-reference.docx` (reference DOCX for styling)
|
||||
- `resumes/input/` — Markdown sources, one file per resume variant.
|
||||
- `output/` — compiled artifacts (`*.pdf`, `*.docx`).
|
||||
|
||||
## Build Instructions (Container-Only)
|
||||
Prereqs: Docker only. No Compose, no Make.
|
||||
|
||||
- Build all PDFs and DOCXs (single container run): `bin/resume-build`
|
||||
|
||||
Notes:
|
||||
- Repo is mounted at `/data` inside the container; pass paths relative to repo root.
|
||||
- Override paths via env: `INPUT_DIR`, `OUTPUT_DIR`, `TEMPLATE`, `REFDOC`, `PDF_ENGINE`, `PANDOC_IMAGE` (default `danteev/texlive:latest`).
|
||||
|
||||
## Naming & Conventions
|
||||
- File naming: prefer `CharlesNWyble-YYYY-Resume.md` (e.g., `CharlesNWyble-2025-Resume.md`). If multiple variants exist in a year, append a short suffix, e.g., `-Infra`, `-Mgmt`.
|
||||
- Keep a single source file per target persona; avoid duplicating identical content.
|
||||
- Use standard Markdown; do not rely on non‑portable LaTeX unless template requires it.
|
||||
- Dates: Use absolute month/year ranges (e.g., `Jan 2025 – Present`). Today’s date is Oct 6, 2025; verify “Present” entries against this when updating.
|
||||
|
||||
## Editing Guidelines
|
||||
- Before editing, skim: `templates/resume-template.tex` and the target file in `resumes/input/`.
|
||||
- Keep bullets concise and outcome‑oriented; lead with impact, then tools.
|
||||
- Maintain consistent section order: Summary → Key Skills → Professional Experience → Additional Tools (or as currently structured).
|
||||
- Respect confidentiality: this resume is proprietary; avoid adding PII beyond what the user approves.
|
||||
- When asked to add roles or adjust dates, update the active year’s Markdown file and regenerate outputs via `bin/resume-build`.
|
||||
|
||||
## Templates
|
||||
- PDF styling comes from `templates/resume-template.tex`. Keep it minimal; changes impact all PDFs.
|
||||
- DOCX styling comes from `templates/resume-reference.docx`. Update only with user approval.
|
||||
- If you rename templates, update env vars `TEMPLATE`/`REFDOC` at run time or adjust `bin/resume-build` defaults if they should change.
|
||||
|
||||
## Common Tasks for Agents
|
||||
- Add a new role:
|
||||
1) Edit the relevant `resumes/input/*.md` file.
|
||||
2) Update dates for previous “Present” roles if needed.
|
||||
3) Run `bin/resume-build` and verify outputs appear under `output/` with no Pandoc errors.
|
||||
- Create a new variant (same year): copy the most recent file in `resumes/input/`, adjust content and name using the conventions above, then run `bin/resume-build`.
|
||||
- Tighten phrasing: keep bullets to a single line where possible; quantify results when available.
|
||||
|
||||
## Validation & Troubleshooting
|
||||
- Run `bin/resume-build` to compile all sources. If a specific file fails, use the single-file build: `bin/resume-build file resumes/input/<name>.md both` to see explicit Pandoc errors.
|
||||
- Path errors: remember the container’s working directory is `/data` (the repo root). Use relative repo paths or update env vars.
|
||||
- LaTeX failures: the `pandoc/latex` image includes a LaTeX engine; check for malformed Markdown/LaTeX or adjust `PDF_ENGINE`.
|
||||
|
||||
## Safety & Performance Notes
|
||||
- The TeX Live + Pandoc image is large; first pull may take several minutes.
|
||||
- No host-side compilers/tools are required beyond Docker.
|
||||
- Do not add third‑party assets without user approval.
|
||||
|
||||
## Ownership & Permissions
|
||||
- The wrapper runs the container as the invoking host user via `docker run -u $(id -u):$(id -g)`.
|
||||
- If outputs ever appear as `root:root`, ensure you’re running the script from a user with write access to `output/`.
|
||||
|
||||
## Decision Rules (Important)
|
||||
- Prefer the `resume-build` container entrypoint over ad‑hoc pandoc calls to keep behavior consistent.
|
||||
- When unsure about wording, prioritize clarity and measurable outcomes over tool lists.
|
||||
- Preserve existing section order and formatting unless the user requests a change.
|
||||
- If instructions in this AGENTS.md conflict with direct user instructions, follow the user and update this file afterward.
|
||||
|
||||
## Quick Orientation Checklist
|
||||
1) Read `resumes/` to identify the active source file(s).
|
||||
2) Confirm dates use absolute month/year and are current as of Oct 6, 2025.
|
||||
3) Make requested edits in Markdown only; avoid template changes unless asked.
|
||||
4) Build with `bin/resume-build`, verify PDFs/DOCXs generate in `output/`.
|
||||
5) Update this AGENTS.md if you change commands, naming, or process.
|
||||
10
Dockerfile
10
Dockerfile
@@ -1,10 +0,0 @@
|
||||
FROM ubuntu:22.04
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
texlive-full \
|
||||
pandoc \
|
||||
make \
|
||||
&& apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||
WORKDIR /data
|
||||
ENTRYPOINT ["pandoc"]
|
||||
22
Makefile
22
Makefile
@@ -1,22 +0,0 @@
|
||||
TEMPLATE=templates/resume-template.tex
|
||||
REFDOC=templates/resume-reference.docx
|
||||
|
||||
RESUMES=$(wildcard resumes/*.md)
|
||||
PDFS=$(RESUMES:.md=.pdf)
|
||||
DOCXS=$(RESUMES:.md=.docx)
|
||||
|
||||
all: pdf docx
|
||||
|
||||
pdf: $(PDFS)
|
||||
docx: $(DOCXS)
|
||||
|
||||
resumes/%.pdf: resumes/%.md $(TEMPLATE)
|
||||
docker compose run --rm resume-builder resumes/$(notdir $<) \
|
||||
--template=$(TEMPLATE) -o resumes/$(notdir $@)
|
||||
|
||||
resumes/%.docx: resumes/%.md $(REFDOC)
|
||||
docker compose run --rm resume-builder resumes/$(notdir $<) \
|
||||
--reference-doc=$(REFDOC) -o resumes/$(notdir $@)
|
||||
|
||||
clean:
|
||||
rm -f $(PDFS) $(DOCXS)
|
||||
29
README.md
29
README.md
@@ -1,3 +1,30 @@
|
||||
# CharlesNWybleResume
|
||||
|
||||
My resume. Proprietary.
|
||||
My resume. Proprietary.
|
||||
|
||||
This repo converts Markdown resumes into PDF and DOCX using Pandoc inside a Docker container. No Dockerfile or compose is used; a thin shell wrapper runs a TeX Live image that includes Pandoc.
|
||||
|
||||
## Layout
|
||||
- `resumes/input/` — source Markdown files (single source of truth)
|
||||
- `templates/` — Pandoc assets
|
||||
- `resume-template.tex` (LaTeX template for PDF)
|
||||
- `resume-reference.docx` (reference DOCX for styling)
|
||||
- `output/` — generated artifacts (`*.pdf`, `*.docx`) [git-ignored]
|
||||
- `bin/resume-build` — container wrapper script
|
||||
|
||||
## Prerequisites
|
||||
- Docker (any recent version). No Compose, no Make.
|
||||
|
||||
## Quick Start
|
||||
- Build all inputs to both PDF and DOCX (single container run):
|
||||
- `bin/resume-build`
|
||||
|
||||
### Configuration (env vars)
|
||||
- `PANDOC_IMAGE` (default `danteev/texlive:latest`)
|
||||
- `PDF_ENGINE` (default `xelatex`)
|
||||
- `INPUT_DIR` (default `resumes/input`)
|
||||
- `OUTPUT_DIR` (default `output`)
|
||||
- `TEMPLATE` (default `templates/resume-template.tex`)
|
||||
- `REFDOC` (default `templates/resume-reference.docx`)
|
||||
|
||||
Outputs are created with your host UID/GID via `docker run -u` mapping.
|
||||
|
||||
117
bin/resume-build
Executable file
117
bin/resume-build
Executable file
@@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Resume builder wrapper that runs Pandoc inside a Docker container.
|
||||
#
|
||||
# Layout assumptions (relative to repo root):
|
||||
# - Input Markdown files: resumes/input/*.md
|
||||
# - Output artifacts: output/*.pdf and output/*.docx
|
||||
# - Templates: templates/resume-template.tex, templates/resume-reference.docx
|
||||
#
|
||||
# Usage:
|
||||
# bin/resume-build # build all inputs to both PDF and DOCX (single container)
|
||||
#
|
||||
# Config via env vars:
|
||||
# PANDOC_IMAGE (default: pandoc/latex:latest)
|
||||
# PDF_ENGINE (default: xelatex)
|
||||
# TEMPLATE (default: templates/resume-template.tex)
|
||||
# REFDOC (default: templates/resume-reference.docx)
|
||||
# INPUT_DIR (default: resumes/input)
|
||||
# OUTPUT_DIR (default: output)
|
||||
|
||||
PANDOC_IMAGE=${PANDOC_IMAGE:-danteev/texlive:latest}
|
||||
PDF_ENGINE=${PDF_ENGINE:-xelatex}
|
||||
INPUT_DIR=${INPUT_DIR:-resumes/input}
|
||||
OUTPUT_DIR=${OUTPUT_DIR:-output}
|
||||
TEMPLATE=${TEMPLATE:-templates/resume-template.tex}
|
||||
REFDOC=${REFDOC:-templates/resume-reference.docx}
|
||||
TEXLIVE_INSTALL=${TEXLIVE_INSTALL:-""}
|
||||
|
||||
REPO_ROOT=$(cd "$(dirname "$0")/.." && pwd)
|
||||
cd "$REPO_ROOT"
|
||||
|
||||
err() { echo "[resume-build] $*" >&2; }
|
||||
log() { echo "[resume-build] $*"; }
|
||||
|
||||
require() {
|
||||
command -v "$1" >/dev/null 2>&1 || { err "Missing dependency: $1"; exit 1; }
|
||||
}
|
||||
|
||||
run_docker() {
|
||||
# Runs a command in the pandoc container with repo mounted at /data
|
||||
local user opt_user
|
||||
if user=$(id -u 2>/dev/null) && group=$(id -g 2>/dev/null); then
|
||||
opt_user=( -u "${user}:${group}" )
|
||||
else
|
||||
opt_user=()
|
||||
fi
|
||||
|
||||
local cmd=( docker run --rm
|
||||
"${opt_user[@]}"
|
||||
-v "$REPO_ROOT:/data"
|
||||
-w /data
|
||||
--entrypoint /bin/sh \
|
||||
"$PANDOC_IMAGE" )
|
||||
|
||||
"${cmd[@]}" -c "$*"
|
||||
}
|
||||
|
||||
cmd_pandoc_pdf() { # echo PDF pandoc command
|
||||
local in_md=$1 out_pdf=$2 template=$3 engine=$4
|
||||
printf 'pandoc %q -o %q --from markdown+autolink_bare_uris --template=%q --pdf-engine=%q' \
|
||||
"$in_md" "$out_pdf" "$template" "$engine"
|
||||
}
|
||||
|
||||
cmd_pandoc_docx() { # echo DOCX pandoc command
|
||||
local in_md=$1 out_docx=$2 refdoc=$3
|
||||
printf 'pandoc %q -o %q --from markdown+autolink_bare_uris --reference-doc=%q' \
|
||||
"$in_md" "$out_docx" "$refdoc"
|
||||
}
|
||||
|
||||
build_all() {
|
||||
require docker
|
||||
[[ -d "$INPUT_DIR" ]] || { err "Input dir not found: $INPUT_DIR"; exit 1; }
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
shopt -s nullglob
|
||||
local files=( "$INPUT_DIR"/*.md )
|
||||
if (( ${#files[@]} == 0 )); then
|
||||
err "No markdown files in $INPUT_DIR"; exit 1
|
||||
fi
|
||||
local batch="set -e; if [ -n \"${TEXLIVE_INSTALL}\" ]; then tlmgr install ${TEXLIVE_INSTALL} || true; fi"; local first=1
|
||||
for f in "${files[@]}"; do
|
||||
local base md_in pdf_out docx_out
|
||||
base=$(basename "${f%.md}")
|
||||
md_in="/data/${f}"
|
||||
pdf_out="/data/${OUTPUT_DIR}/${base}.pdf"
|
||||
docx_out="/data/${OUTPUT_DIR}/${base}.docx"
|
||||
log "PDF <- $f"
|
||||
batch+=" && "
|
||||
batch+=$(cmd_pandoc_pdf "$md_in" "$pdf_out" "/data/${TEMPLATE}" "$PDF_ENGINE")
|
||||
log "DOCX <- $f"
|
||||
batch+=" && "
|
||||
batch+=$(cmd_pandoc_docx "$md_in" "$docx_out" "/data/${REFDOC}")
|
||||
done
|
||||
run_docker "$batch"
|
||||
}
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
Usage: $0
|
||||
Builds all Markdown files in "$INPUT_DIR" to both PDF and DOCX into "$OUTPUT_DIR".
|
||||
|
||||
Env:
|
||||
PANDOC_IMAGE=${PANDOC_IMAGE}
|
||||
INPUT_DIR=${INPUT_DIR}
|
||||
OUTPUT_DIR=${OUTPUT_DIR}
|
||||
TEMPLATE=${TEMPLATE}
|
||||
REFDOC=${REFDOC}
|
||||
PDF_ENGINE=${PDF_ENGINE}
|
||||
EOF
|
||||
}
|
||||
|
||||
main() {
|
||||
if [[ $# -gt 0 ]]; then usage; exit 1; fi
|
||||
build_all
|
||||
}
|
||||
|
||||
main "$@"
|
||||
@@ -1,7 +0,0 @@
|
||||
version: "3.9"
|
||||
services:
|
||||
resume-builder:
|
||||
build: .
|
||||
volumes:
|
||||
- ./resumes:/data/resumes
|
||||
- ./templates:/data/templates
|
||||
@@ -1,53 +0,0 @@
|
||||
# Charles N Wyble
|
||||
[City, State] • [Email] • [818-280-7059] • [LinkedIn(https://www.linkedin.com/in/charles-wyble-412007337/)]
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
Infrastructure engineer with 20+ years in technical operations, specializing in Linux, Windows, and networking. Deep experience in on-prem systems, private cloud automation, and lifecycle management. Proven track record designing scalable infrastructure and reducing provisioning timelines through automation.
|
||||
|
||||
---
|
||||
|
||||
## Key Skills
|
||||
Linux (RHEL, Ubuntu) • Windows Server • Networking (DNS, DHCP, IPAM, VPNs, Firewalls) • VMware • KVM • Hyper-V • PXE provisioning • Bash • Python • PowerShell • Nagios • ServiceNow • Packer
|
||||
|
||||
---
|
||||
|
||||
## Professional Experience
|
||||
|
||||
**Gainwell Technologies** — Linux Infrastructure Engineer
|
||||
*Jan 2025 – Present*
|
||||
- Supported Medicare batch processing and job scheduling operations using ServiceNow, TeamFoundationServer, Visual Studio, and Oracle.
|
||||
- Developed Bash scripts to automate on-call incident response analysis, reducing manual triage time.
|
||||
- Automated SDLC workflows and monitoring tasks through lightweight shell utilities, improving consistency and reducing ticket volume.
|
||||
- Applied AI tools to reverse engineer legacy codebases and generate new scripts/programs, accelerating delivery of automation solutions.
|
||||
- Partnered with development and operations teams to streamline production support and strengthen system reliability.
|
||||
|
||||
|
||||
**SHEIN** — Linux Infrastructure Engineer
|
||||
*Dec 2022 – Aug 2023*
|
||||
Built automation tooling for routing/DNS/firewall tickets across AWS, Azure, GCP, Alibaba Cloud, and private cloud. Acted as network/security liaison to global SRE team.
|
||||
|
||||
**3M** — Linux Infrastructure Engineer
|
||||
*Jul 2020 – Nov 2022*
|
||||
Developed YAML-based configuration management system using Bash scripting and CSV key/value stores. Supported Vendavo on RedHat Linux and release processes.
|
||||
|
||||
**TippingPoint** — Infrastructure Engineer
|
||||
*Jun 2012 – Jun 2019*
|
||||
- Designed private cloud lifecycle management system automating IP allocation, DNS, and PXE provisioning for physical/virtual servers.
|
||||
- Cut provisioning time from days to under an hour through CSV-driven automation.
|
||||
- Supported large-scale web applications, optimized for uptime and scalability.
|
||||
- Migrated CentOS 6→7, introduced LXC/LXD containers, and deployed monitoring (Nagios, Zenoss, LibreNMS).
|
||||
- Built custom automation scripts in Bash, Python, and PowerShell to streamline operations.
|
||||
|
||||
**Earlier Career (2002 – 2012)**
|
||||
Systems Administrator / Infrastructure Administrator roles across HostGator, RippleTV, Walt Disney Internet Group, Electronic Clearing House, and GSI Commerce.
|
||||
|
||||
---
|
||||
|
||||
## Additional Tools / Familiar With
|
||||
- Containers: Docker (side projects), LXC/LXD
|
||||
- CI/CD & Version Control: GitLab CI, Jenkins, GitHub Actions, TeamFoundationServer
|
||||
- Observability: Prometheus, Grafana, ELK stack (evaluation/side use)
|
||||
- IaC / Config: YAML, JSON, CSV-driven automation; basic exposure to Terraform and Ansible
|
||||
- Cloud Services: AWS, Azure, GCP, Alibaba Cloud (collaboration and troubleshooting exposure)
|
||||
@@ -65,8 +65,8 @@ Systems Administrator / Linux Infrastructure Administrator roles across HostGato
|
||||
---
|
||||
|
||||
## Additional Tools / Familiar With
|
||||
- Containers: Docker (side projects), LXC/LXD
|
||||
- CI/CD & Version Control: GitLab CI, Jenkins, GitHub Actions, TeamFoundationServer
|
||||
- Observability: Prometheus, Grafana, ELK stack (evaluation/side use)
|
||||
- IaC / Config: YAML, JSON, CSV-driven automation; basic exposure to Terraform and Ansible
|
||||
- Containers: Docker (via self hosting/side projects), LXC/LXD
|
||||
- CI/CD & Version Control: Gitea CI, Jenkins, Git, Github , GitHub Actions, TeamFoundationServer
|
||||
- Observability: Prometheus, Grafana, ELK stack (evaluation/side project/ self hosting use)
|
||||
- IaC / Configuration Management: Basic exposure to / familarity with usage/light modification of Teraform, Puppet, Chef, Ansible, YAML, JSON, CSV-driven automation;
|
||||
- Cloud Services: AWS, Azure, GCP, Alibaba Cloud (collaboration and troubleshooting exposure)
|
||||
@@ -3,9 +3,13 @@
|
||||
\usepackage{titlesec}
|
||||
\usepackage{enumitem}
|
||||
\usepackage{hyperref}
|
||||
\usepackage{parskip}
|
||||
\usepackage{helvet}
|
||||
\renewcommand{\familydefault}{\sfdefault}
|
||||
\usepackage{parskip}
|
||||
\usepackage{helvet}
|
||||
\renewcommand{\familydefault}{\sfdefault}
|
||||
|
||||
% Pandoc provides \tightlist in its default template; define here for custom template
|
||||
\providecommand{\tightlist}{%
|
||||
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
|
||||
|
||||
% Section formatting
|
||||
\titleformat{\section}{\large\bfseries}{}{0em}{}[\titlerule]
|
||||
|
||||
Reference in New Issue
Block a user